Bonjour à tous; g doi réaliser un can avec le logiciel atmega 8535
j'ai dejà un début mais çela ne marche pas comme je le souhaite...
Quelqu'un n'aurait t-il pas quelque chose de mieux à me proposer?
mon début est içi:
Code:#include <avr/io.h> //Cette ligne est obligatoire. Elle permet d n'écrire qu'un programme pour tous les AVR. #include <stdio.h> #include <util/delay.h> #include <stdlib.h> #include <math.h> int i,j; float a,val_convertie; void can_init (void); unsigned int ADC_PRESCALER; #define FOSC < 16000 //Fréquence d'horloge du CPU en Hz (Attention 16M par défaut) #define ADC_FULL_RANGE ((Nmax)(0x03FF)) // 10-bit ADC #define INTERNAL_VREF_VALUE ((Vmax)( 256)) // 2.56 Volts #define Get_vref() ( ADMUX & ((1<<REFS1)|(1<<REFS0)) ) #define Start_conv() (ADCSRA &= ~(1<<ADATE), ADCSRA |= (1<<ADSC)) #define Disable_adc() (ADCSRA &= ~(1<<ADIE)) #define Clear_adc_it_flag() (ADCSRA |= (1<<ADIF)) void TMega_port_init (void) { DDRA=0xFF; //Cela permet de configurer les PORTx en sortie DDRB=0xFF; DDRD=0xFD; } void can_init (void) { ADCSRA=_BV(ADEN) |_BV(ADPS2) | _BV(ADPS1); //prédivision de l'horloge par 64 //ADMUX= _BV(REFS0); // Tension de reference // ADCSRB |= (1<<HSM)); //vitesse } void can_conversion (unsigned char *poidsfort, unsigned char *Poidsfaible) { ADMUX= 0xE2; //means that RFS[1,0]=3 ADLAR=1 and MUX[4:0]=2 while(ADCSRA &(0x40)); *Poidsfaible=ADCL; *poidsfort= ADCH; } int main(void) { unsigned char voiechoisie, niveauhaut,niveaubas; TMega_port_init(); can_init(); do { if ( Get_vref() == ((1<<REFS1)|(1<<REFS0)) ) { for (j=0; j<0x3FF;j++) //{asm("nop");asm("nop");} // Presclaler=6 car [adps]=0x06; } can_conversion (&niveauhaut,&niveaubas); Start_conv(); PORTB= &niveaubas; PORTD= &niveauhaut; while(ADIF!=1); Clear_adc_it_flag(); // Clear ADIF flag return PORTB; return PORTD; } while(1);
-----