Bonjour à toutes et à tous,
Je poste mon problème qui concerne le codage d'un exercice ultra débutant sur un atmega32a car il n'y a pas de forum dédié AVR.
Je suis des cours d'électronique et viens de commencer la programmation AVR. J'avoue que je suis complètement perdu. J'ai cherché des sites pour débuter mais tout est orienté arduino et en anglais que je maîtrise bien mais disons que lorsqu'il s'agit de décortiquer un truc aussi complexe que ce type de programmation cela ajoute une couche de difficulté. Le problème est que le prof n'a pas de cours il nous pousse à nous débrouiller avec le web et je trouve qu'il manque un tuto en français hyper clair pour aborder la mécanique de base des sytèmes AVR. Les explications sont toujours trop brouillonnes ou alors c'est que c'est vraiment difficile à expliquer (en tous cas le prof n'y arrive pas on est tous dans les choux).
Mon problème actuel est je pense hyper facile, c'est le stade suivant du blinking led mais je n'arrive pas à aboutir.
On doit réaliser un Quiz game: 4 push buttons / Quand un est enfoncé il interrompt les 3 autres boutons et déclenche une led pendant 4 secondes et un buzzer pendant la moitié du temps de la led donc 2 secondes. Le cahier des charges ne précise pas que chaque bouton à sa propre led donc à priori on peut connecter les boutons en parallèle et utiliser une patte de requête externe (int0 ou int1).
J'ai réussi à ma manière à gérer les delays des leds mais je n'arrive pas à implémenter l'interruption des boutons non enfoncés.
Voici mon code:
MerciCode:#define F_CPU 16000000UL #include <avr/io.h> #include <avr/delay.h> //pour gestion debouncing du bouton #include <avr/interrupt.h> // Variable de comptage des dépassements volatile uint8_t count; #define BUTTON_HIGH(byte,bit) (byte & (1 << bit)) /** Déclaration des fonctions **/ static void avr_init(void); void timer1_init(void); /** Gestion de l'interruption **/ ISR(INT0_vect) { //_delay_ms(100); // user code here // GICR |= (0 << INT0); // DDRD |= (0 << PD2); PORTA |= (1 << PA0); PORTA |= (1 << PA1); timer1_init(); // while (count <= 100) // { // PORTA ^= (1 << PA1); // } // check if the timer count reaches 124 } ISR(TIMER1_OVF_vect) { // keep a track of number of overflows count++; } //MAIN int main(void) { avr_init(); while(1) { if (count >= 2) // 2 X count X 0,2500112 = 1,00045sec { PORTA &= ~(1 << PA0); if (count >= 4) // 2 X count X 0,2500112 = 2,0009sec { PORTA &= ~(1 << PA0); PORTA |= (0 << PA0); PORTA &= ~(1 << PA1); PORTA |= (0 << PA1); TCNT1 = 0; // reset counter TCCR1B = 0x00; //stops the timer } } else { } } return 0; } static void avr_init(void) { // Les sorties DDRA |= (1 << PA0); //Les ports D sont conf. comme sorties DDRA |= (1 << PA1); // Les entrées DDRD &= ~(1 << PD2); PORTD |= (1 << PD2); // configure PORTD bit 2 comme résistance de tirage // Active l'interruption externe "INT0" qui allume les leds et active le timer1 GICR |= (1 << INT0); // Définit un déclenchement sur front descendant MCUCR |= (1 << ISC01); // Active les requètes d'interruptions sei(); return; } void timer1_init() { // set up timer with prescaler = 1024 // 1 cycle = 0,000977 sec TCCR1B |= (1 << CS11)|(1 << CS10); // initialize counter TCNT1 = 0; // 1 cycle = 256 // 256 X 0,000977 = 0,250112sec // enable overflow interrupt TIMSK |= (1 << TOIE1); // initialize overflow counter variable count = 0; }
-----