122 lines
No EOL
3 KiB
C
Executable file
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;
|
|
}; |