Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Aide AVR : interruptions BP, timers...




  1. #1
    binjch

    Aide AVR : interruptions BP, timers...

    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:
    Code:
    #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;
    }
    Merci

    -----

    Dernière modification par Antoane ; 06/01/2019 à 22h03. Motif: Ajout balises code

  2. Publicité
  3. #2
    binjch

    Re : AIde AVR

    ..J'ai oublié de préciser que le projet est à faire sans utiliser _delay_ms() (évidement)

  4. #3
    PA5CAL

    Re : AIde AVR

    Bonsoir

    Citation Envoyé par binjch Voir le message
    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).
    Si le prof ne fait pas son travail, alors il faut en changer ou bien aller prendre ses cours ailleurs, auprès de personnes pédagogues et réellement compétentes dans le domaine enseigné. Sinon c'est une perte de temps, et aussi probablement d'argent.

    Par ailleurs, sans aller jusqu'à maîtriser la langue de Shakespeare, il est indispensable d'apprendre à lire l'anglais technique a minima, car dans l'électronique et l'informatique, toute la littérature de référence est produite dans cette langue, de même qu'une bonne part des tutoriels et des discussions dans ces domaines sur Internet.

    Toutefois, on arrive à trouver des discussions en français à propos des AVR sur des sujets particuliers (je le sais pour avoir contribué à nombre d'entre elles, principalement sur d'autres forums). Il suffit de se donner la peine de chercher.

    Concernant la mise en œuvre des micro-contrôleurs AVR, la documentation de référence du modèle (Data Sheet) et le manuel du jeu d'instructions (Instruction Set Manual) (disponibles par ici) suffisent en principe à apporter toutes les réponses. Les nombreuses notes d'applications disponibles permettent quant à elles d'apporter des solutions toutes faites sur certains sujets précis.


    Quoi qu'il en soit, un forum n'est pas le lieu adéquat pour donner des cours ou développer un tutoriel exhaustif sur un sujet aussi vaste, ni pour répondre à une question bancale et pas très claire, accompagnée d'un bout de code incomplet jeté en pâture aux contributeurs, le tout dans le but de terminer un exercice dont le seul intérêt réside dans sa résolution par le demandeur.

    Je doute fort que pour répondre au problème posé il soit acceptable de câbler en parallèle les quatre boutons, puisque cela revient à n'en utiliser qu'un seul. Le fait qu'on ait demandé d'utiliser quatre boutons alors que le micro-contrôleur n'a que trois entrées d'interruption INT et aucune PCINT (Pin Change Interrupt) suggère qu'il faudrait soit utiliser un montage électronique externe, soit procéder autrement. Or, les actions sur les boutons étant normalement très lentes devant la vitesse du micro-contrôleur, on a plutôt pour habitude de réaliser leur acquisition par polling (c'est-à-dire par une lecture périodique des entrées), tâche qu'on peut notamment implémenter dans la routine d'interruption du timer qui sert à compter les délais.
    Dernière modification par PA5CAL ; 07/01/2019 à 02h02.


  5. #4
    Seb.26

    Re : AIde AVR

    Commence par bien installer les bœufs, tu verras la charrue après ...

    1 -> cours d'algorithmie
    2 -> cours de C
    3 -> jouer avec un AVR

    Par exemple : http://pise.info/algo/introduction.htm
    ( j'ai pas lu, je sais pas ce que ça vaut ... )
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  6. #5
    abracadabra75

    Re : AIde AVR

    Bonjour.

    Pour les AVR, une bible en Français: "Microcontrôleurs AVR: des ATtiny aux ATmega" de Christian Tavernier.
    Toutes les fonction y sont décortiquées ce qui permet (à terme) de comprendre ce qu'on fait.

    Mais comme toujours, tu es parti dans de la (pseudo) programmation sans l'étape initiale indispensable.

    De toutes façons, avant de pisser de la ligne, il faut avoir réalisé l'algorithme correspondant au cahier des charges (en clair: ce que tu souhaites faire): c'est indispensable, incontournable. Alors une fois mis au net, et seulement à ce moment, tu peux passer à la programmation dans le langage de ton choix.

    Du temps où j'avais à examiner de tels projets, s'il n'y avait pas l'organigramme correspondant à l'algorithme, le classement immédiat était vertical.....
    Ensuite, et seulement ensuite, tu pourras programmer, et ce sera la machine qui te dira si tout est ok (ça n'arrive pratiquement jamais du premier coup, en trente ans, je n'ai connu qu'un cas...).

    Les arduino... bof, sont faits pour ceux qui veulent faire une réalisation quelconque sans comprendre. Ils sont préconisés par les profs paresseux (j'avais écrit initialement incompétents) qui ne veulent pas s'emm....er à expliquer aux élèves les bases de la programmation: on prend un ard.... tel type, on branche un shield et basta.... la led clignote. Miracle (encore faut-il le mettre dans les bons trous!).

    Il existe aussi un langage plus simple à utiliser que le C, qui est le BASCOM. Je sais que les puristes vont tordre le nez. Mais pour des réalisations personnelles, il est plus facilement utilisable. Une version gratuite existe chez MCS electronics (pub gratuite, je n'ai pas d'action chez eux), et une doc interne (en anglais) traduite en français par J.P. Duval (Je donne ces noms en clair pour la recherche sur la toile).

    Bon courage

    A+
    Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.

  7. A voir en vidéo sur Futura
  8. #6
    Jack

    Re : AIde AVR

    Citation Envoyé par abracadabra75 Voir le message
    Les arduino... bof, sont faits pour ceux qui veulent faire une réalisation quelconque sans comprendre. Ils sont préconisés par les profs paresseux (j'avais écrit initialement incompétents) qui ne veulent pas s'emm....er à expliquer aux élèves les bases de la programmation: on prend un ard.... tel type, on branche un shield et basta.... la led clignote. Miracle (encore faut-il le mettre dans les bons trous!).
    Avant de t'en prendre aux profs, renseigne-toi sur le contenu des programmes qu'il leur est demandé d'enseigner, et sur le temps qui leur est alloué. Et quand on sait le temps qu'il faut consacrer pour obtenir un résultat à peu près correct pour programmer un µC avec des élèves qui ont pour la plupart des difficultés à se concentrer plus de 20 minutes, le challenge est de taille.

    Je rappelle de plus que les microcontrôleurs font partie normalement de l'électronique et que l'électronique n'est plus enseignée depuis un bon bout de temps avant le bac. C'est malheureux, mais il faut croire que les industriels n'ont rien trouvé à redire lors des commissions paritaire définissant les nouveaux programmes.

    Brefs, ces feignasses de profs font souvent ce qu'il peuvent avec ce qu'on leur donne.

  9. #7
    penthode

    Re : AIde AVR

    @abracadabra.... merci de me rassurer !

    j'utilise PROTON COMPILER ,
    un BASIC pour PIC .... depuis des années.

    avec parfois quelques lignes d'ASM si nécessaire .

    pour des projets parfois velus
    là où le mensonge prolifère, la tyrannie s'annonce ou se perpétue (Albert Camus)

  10. Publicité
  11. #8
    Seb.26

    Re : AIde AVR

    << my 2 cents >>
    Un outil n'est ni stupide ni intelligent, ces qualitatifs ne s'appliquent qu'a l'interface chaise-clavier ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

Sur le même thème :

Discussions similaires

  1. Programme Flowcode: Aide pour les interruptions
    Par unknown971 dans le forum TPE / TIPE et autres travaux
    Réponses: 8
    Dernier message: 25/05/2012, 17h50
  2. Où trouver des 555 timers ?!?
    Par YtekSpouki dans le forum Électronique
    Réponses: 10
    Dernier message: 07/03/2012, 11h46
  3. Les timers sur 16f628
    Par MofK dans le forum Électronique
    Réponses: 2
    Dernier message: 25/11/2008, 17h39
  4. timers sur AVR
    Par zanzeoo dans le forum Électronique
    Réponses: 1
    Dernier message: 03/10/2007, 18h37
  5. besoin d'aide sur la programmation des TIMERs du PIC svp !!!
    Par lolominator dans le forum Électronique
    Réponses: 6
    Dernier message: 02/04/2006, 23h24