embedded/tp8/exo2.c
2021-02-03 18:37:18 +01:00

122 lines
No EOL
3 KiB
C
Executable file

/*
* tp8.c
*
* Created: 30/03/2021 14:10:10
* Author : yboujon1
*/
#include <avr/io.h>
#define F_CPU 3686400
#include <util/delay.h>
void timer1_init(int top);
void timer1_setalpha(float percent);
int main(void)
{
timer1_init(369);
timer1_setalpha(33); //soit 33% pour qu'ils soient complémentaires
while (1)
{
//rien
};
}
void timer1_init(int top){
ICR1=top;
TCCR1A|=(1<<WGM11)|(1<<COM1A1)|(3<<COM1B0);//OC1A en non-inverting et OC1B en inverting
TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS10);//on prend le mode 14, on defini div = 1
DDRD|=(1<<PD4)|(1<<PD5);//PD4 et PD5 donc OC1A et OC1B en sortie
}
void timer1_setalpha(float percent){
OCR1A=percent*3.69; //soit 33% en mode non invert
OCR1B=percent*3.69; //soit 66% en mode non invert, mais en phase inverse
}
/*
* tp8.c
*
* Created: 30/03/2021 14:10:10
* Author : yboujon1
*/
#include <stdio.h>
#include <avr/io.h>
#define F_CPU 3686400
#include <util/delay.h>
#include <avr/interrupt.h>
void ADC_init(void);
void ADC_start_conversion(void);
void uart_init(unsigned int ubrr);
void read_temp(int* e, int* d);
void uart_putchar(char c, FILE *stream);
static FILE out_rs232 = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE); //on defini le flux de sortie avec uart putchar
volatile unsigned char etat=0;
volatile unsigned int valeur;
int main(void)
{
ADC_init();
sei();
uart_init(23);
stdout =&out_rs232;
int entier, decimal;
while (1)
{
ADC_start_conversion();
if (etat == 1){
read_temp(&entier,&decimal);
printf("La temperature est : %d.%d.C\n\t",entier,decimal); //on affiche la température
etat = 0;
};
_delay_ms(500);
};
}
void ADC_init(void)
{
DDRA &=~(1<<PA2); //on met la pin2 du port A en entrée
ADMUX|=(2<<MUX0); //on règle l'input sur la PIN2 sans différentiel ni gain
ADCSRA|=(1<<ADPS2)|(1<<ADPS1)|(1<<ADEN)|(1<<ADIE); //on divise 3,6MHz par 64 pour >200KHz
//on autorise la conversion
//on autorise l'interruption
};
void ADC_start_conversion(void)
{
ADCSRA|=(1<<ADSC);
};
void read_temp(int* e, int* d)
{
float x = (0.48828125*valeur); //on converti la tension en température
*e = (int)x; //on transforme le float en int pour l'entier
if (*e<0){ // on verifie si il est négatif
*d = -(int)((x-*e)*10); //si oui on prend l'inverse pour que la décimale soit positive
}
else{
*d = (int)((x-*e)*10); //si non on fait l'entier moins la décimale et on multiplie par 10 simplement
};
};
void uart_init(unsigned int ubrr)
{
DDRD = (1<<PD1); //on met la pin1 donc TxD
UBRRL = ubrr; //le bit low reçois la valeur UBRR
UCSRB = (1<<TXEN); //on autorise le transfert
UCSRC = (1<<URSEL)|(1<<UPM1)|(3<<UCSZ0); //on active UCSRC, avec parité et sur 8 bits
};
void uart_putchar(char c, FILE *stream)
{
do{
//rien
}while(!(UCSRA & (1<<UDRE))); //on attends que le bit soit envoyé pour en renvoyé
UDR = c; //on lui affecte la valeur
};
ISR (ADC_vect){
etat = 1;
valeur = ADC;
};