[Programmation] Atmega 328P interruptions sans avr/interrupt.h ?
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Atmega 328P interruptions sans avr/interrupt.h ?



  1. #1
    sylvainmahe

    Question Atmega 328P interruptions sans avr/interrupt.h ?


    ------

    Bonjour

    Pour programmer un atmega 328P j'utilise la bibliothèque avr en langage c, mais j'aimerais progressivement m'en passer pour essayer de comprendre ce qu'il y a derrière tout ça.

    J'utilise avr/io.h et avr/interrupt.h, pour démarrer/stopper les interruptions globales j'utilisais sei ou cli, je n'avais pas vu dans la doc du 328p qu'il suffisait de mettre le bit 7 du registre SREG à 1 ou 0.

    Du coup j'aimerais également savoir comment créer la macro ISR moi même, j'utilise actuellement:
    Code:
    ISR (INT0_vect, ISR_BLOCK)
    {
    	//code
    }
    J'ai été voir ce qu'il y a dans avr/interrupt.h, mais souvent ça ne donne pas grand chose étant donné que ce ne sont que des entêtes.

    Je regarde les articles et documentations sur l'assembleur ou autre: http://web.csulb.edu/~hill/ee346/Lec...Interrupts.pdf


    Pensez-vous pouvoir m'aider sur ce sujet?
    Merci d'avance

    -----

  2. #2
    invite69a0f08e

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Bonjour sylvainmahe,

    C'est un sujet très intéressant mais un peu pointu, je ne sais pas si je peux t'aider mais je te joint un extrait du livre suivant: "Make: AVR Programming by Elliot
    Williams (MAKE). Copyright 2014 Elliot Williams, 978-1-4493-5578-4.". (L'auteur autorise la diffusion d'extraits de son livre).
    Il détaille le fonctionnement de l’exécution des interruptions, j'ai l'impression que pas mal de choses sont gérés par le hardware.

    N'hésite pas à nous tenir au courant de tes avancés.
    Images attachées Images attachées  

  3. #3
    jiherve

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Bonsoir,
    pour utiliser les interruptions à sec il suffit de renseigner la table des vecteurs d'interruption avec les sauts aux routines d'interruptions et d'initialiser les différent registres concernés du périphérique choisi.
    Pour çà la data sheet du µC suffit.
    ex:
    Code:
    .CSEG
    .ORG $0000
    ;
    ; Reset/Intvectors
    ;
       
      jmp Main ; Reset
        ;nop;
      reti ; EXT_INT0 ; IRQ0 Handler  
        nop;
      reti ; EXT_INT1 ; IRQ1 Handler  
        nop;
      reti ; PCINT0 ; PCINT0 Handler  
        nop;
      reti ; PCINT1 ; PCINT1 Handler  
        nop;
      reti ; PCINT2 ; PCINT2 Handler  
        nop;
      reti ; WDT ; Watchdog Timer Handler  
        nop;
      reti ; TIM2_COMPA ; Timer2 Compare A Handler  
        nop;
      reti ; TIM2_COMPB ; Timer2 Compare B Handler  
        nop;
      reti ; TIM2_OVF ; Timer2 Overflow Handler
        nop;
      jmp TIM1_CAPT;reti ; TIM1_CAPT ; Timer1 Capture Handler  
        ;nop;
      reti ; TIM1_COMPA ; Timer1 Compare A Handler  
        nop;
      reti ; TIM1_COMPB ; Timer1 Compare B Handler  
        nop;
      jmp TIMER1_OVF;reti ; TIM1_OVF ; Timer1 Overflow Handler  
        ;nop;
      reti ; TIM0_COMPA ; Timer0 Compare A Handler  
        nop;
      reti ; TIM0_COMPB ; Timer0 Compare B Handler  
        nop;
      jmp TIMER0_OVF;reti; TIM0_OVF ; Timer0 Overflow Handler  
        ;nop;
      reti ; SPI_STC ; SPI Transfer Complete Handler  
        nop;
      jmp USART_RXC ;reti ; USART_RXC ; USART, RX Complete Handler  
        ;nop;
      reti ; USART_UDRE ; USART, UDR Empty Handler  
        nop;
      jmp USART_TXC ;reti ; USART_TXC ; USART, TX Complete Handler  
        ;nop;
      reti ; ADC ; ADC Conversion Complete Handler  
        nop;
      reti ; EE_RDY ; EEPROM Ready Handler  
        nop;
      reti ; ANA_COMP ; Analog Comparator Handler  
        nop;
      jmp TWI_INT;reti ; TWI ; 2-wire Serial Interface Handler  
        ;nop;
      reti ; SPM_RDY ; Store Program Memory Ready Handler  
        nop;
    une petite explication : pour le 328 il faut un JMP à l'adresse d'entrée de la routine ce qui occupe 4 octets donc pour une interruption inutilisée il faut le couple reti;nop pour faire le padding
    JR
    l'électronique c'est pas du vaudou!

  4. #4
    sylvainmahe

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Merci pour vos réponses, je pense que je vais acheter le livre d'Elliot

    *Jiherve, j'essaye de comprendre mais, ce que je souhaite c'est me passer d'avr, hors dans ton code je vois "EXT_INT0", c'est une macro dans les fichiers de la lib avr non? Je pense que tout ca est facile pour toi, mais pour moi rien qu'à écrire ".CSEG" il y a déja une erreur: main.cpp:10:1: error: expected unqualified-id before ‘.’ token
    .CSEG

    Actuellement j'ai ceci avec avr:
    Code:
    #include <avr/interrupt.h>
    
    using namespace std;
    
    ISR (INT0_vect, ISR_BLOCK)
    {
    	PORTD |= (1 << PORTD0);
    }
    
    int main()
    {
    	DDRD |= (1 << PORTD0);
    	
    	EICRA |= (1 << ISC01);
    	EIMSK |= (1 << INT0);
    	SREG |= (1 << SREG_I);
    	
    	while (true)
    	{
    	}
    	
    	return 0;
    }
    Ça fonctionne bien (j'ai branché une led sur PD0).

    Je souhaite retirer l'include, question: quoi coder pour que sa fonctionne?

    Bon à la limite, quelque chose de plus simple:
    Code:
    #include <avr/io.h>
    
    using namespace std;
    
    int main()
    {
    	DDRD |= (1 << PORTD0);
    	PORTD |= (1 << PORTD0);
    	
    	while (true)
    	{
    	}
    	
    	return 0;
    }
    Je souhaite retirer l'include et coder sans, avez vous un exemple à me proposer pour m'aider?

    Merci d'avance

  5. A voir en vidéo sur Futura
  6. #5
    jiherve

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Re
    Non il n'y a aucune macro la dedans, EXT_INT0 est un commentaire car situé après le ;
    C'est de l'assembleur pur cela compile avec Atmel Studio.
    Si tu veux te débarrasser de l’environnement prémâché c'est la seule solution.
    JR
    l'électronique c'est pas du vaudou!

  7. #6
    sylvainmahe

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Ah ok merci *Jiherve, je vais me mettre sérieusement à l'assembleur car c'est sûrement passionnant, mais disons que généralement il me faut un petit trampoline pour démarrer/comprendre un nouveau truc...

    Donc, mon seul souci ici c'est que le compilateur avr-gcc retourne des erreurs, je ne peux donc pas copier les lignes:
    Code:
    .CSEG
    .ORG $0000
    ;
    ; Reset/Intvectors
    ;
       
      jmp Main ; Reset
        ;nop;
      reti ; EXT_INT0 ; IRQ0 Handler  
        nop;
    Dans mon fichier main.cpp?

    Genre:
    Code:
    .CSEG
    .ORG $0000
    ;
    ; Reset/Intvectors
    ;
       
    jmp Main ; Reset
    ;nop;
    reti ; EXT_INT0 ; IRQ0 Handler  
    nop;
    
    int main()
    {
    	while (true)
    	{
    	}
    	
    	return 0;
    }
    ? Merci de votre aide

  8. #7
    invite69a0f08e

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Bonjour sylvainmahe,

    Ce lien te seras peut-être utile: http://www.avrfreaks.net/forum/isr-assembly-code

  9. #8
    sylvainmahe

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Ok merci pour le lien, je vais beaucoup sur ce site

    Un ami au boulo m'a dit que pour écrire de l'assembleur dans un fichier cpp il faut forcément indiquer au compilateur le bout de code assembleur, ce qui effectivement parait logique je suis pas très futé...

    Du coup je me suis documenté sur l'assembleur, avec des exemples j'ai compris l'histoire de la pile, les instructions, le jeu d'instructions pour l'architecture RISC etc...

    Au final je me demande si c'est pas mieux de laisser tout ca comme ca, car de toute façon je n'irrais jamais créer un compilateur, donc je n’irais jamais au bout de l'idée, et donc je serais certainement déçu.

    Je vais peut être par contre repartir du bas, c'est à dire essayer d'aller un peu plus loin que mon additionneuse 8 bits en bois (http://sylvainmahe.xyz/forum/), je suis donc en train de réfléchir à quelques schémas pour cadencer une additionneuse à transistors avec quelques instructions, une horloge, un programmateur, quelques boutons et un afficheur à led, ...

    Merci encore de m'avoir aidé

  10. #9
    sylvainmahe

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Juste une question quand même car j'aimerais faire un test, j'essaye d'ajouter un fichier assembleur (.s) à mon fichier main.c (ou .cpp), je fait:
    Code:
    #include "test.s"
    Ca compile bien, mais dès que j'écris une ligne d'assembleur dans le fichier .s (soit disant assembleur) le compilateur renvoi pleins d'erreurs du type:
    test.s:3:1: error: expected unqualified-id before ‘.’ token
    .CSEG


    Et ce genre d'erreur à toutes les lignes du .s

    Avez-vous une idée de comment inclure un fichier assembleur dans un fichier .c et faire compiler correctement avr gcc?
    Merci d'avance
    Dernière modification par sylvainmahe ; 21/04/2016 à 21h22.

  11. #10
    sylvainmahe

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    J'imagine que dans ce fichier assembleur .s, je dois inclure un fichier qui correspond à la translation des chaînes de caractère que j'écris en assembleur vers du langage machine pour architecture RISC ? Ou bien je suis à coté de la plaque ?

  12. #11
    sylvainmahe

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Ah ok après tests je crois que j'ai compris...

    Au lieu de demander de compiler un .cpp à avr-gcc, je demande de compiler un .s (assembleur).

    Du coup, mettre le PD0 à 5v sans aucun include c'est:
    Code:
    .global main
    
    main:
    	sbi 0x0a, 0;
    	sbi 0x0b, 0;
    rjmp main
    
    .end
    Ma led branchée sur PD0 s'allume

    Du coup je crois que je vais recoder toute ma bibliothèque en assembleur, malgré ce que j'ai dit plus haut (que c'était inutile sans doute).

    Merci encore de m'avoir donné la piste pour avancer, à bientôt.

  13. #12
    sylvainmahe

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Petite question quand même, quand j'écris:
    Code:
    .dseg
    (ou .DSEG)

    Le compilateur m'indique: Error: unknown pseudo-op: `.dseg'
    (.dseg est bien dans l'assembleur avr: http://www.atmel.com/webdoc/avrassem...irectives.DSEG)

    Quand j'écris:
    Code:
    .org 0x00
    Ça fonctionne, pas d'erreur retournée par le compilateur. La commande marche bien puisque quand j'écris:
    Code:
    .org 0x01
    Le programme fait 2 bytes de plus (pourquoi 2 et pas 1 j'en sais rien matériellement...)

    Du coup je me pose la question *Jiherve, est tu sûr que ton atmel studio ne rajoute pas automatiquement un petit include (vers de l'assembleur avr) ?

    Moi je compile directement avec la ligne de commande:
    Code:
    avr-gcc main.s -mmcu=atmega328p -o main.elf
    ??

  14. #13
    sylvainmahe

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Et autre question, quand j'écris:
    Code:
    #define DDRD 0x0a
    
    .global main
    
    main:
    	sbi DDRD, 0
    	jmp loop
    
    loop:
    	sbi 0x0b, 0
    jmp loop
    
    .end
    Le compilateur indique: main.s:6: Error: constant value required

    Donc ça veux dire que l'instruction sbi veut une constante, ca fait 3h que j'épluche les docs et l'internet mais impossible de dire au pré-processeur que ce define est une constante, avez-vous une idée du problème? Merci d'avance

  15. #14
    sylvainmahe

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Re, Je crois qu'il y a des technologies dans la vie c'est ni inné, ni instinctif

    Pour que le define soit traité comme une constante (via le pre-processeur), il faut compiler un .S (majuscule) et non un .s

    Donc ce truc la fonctionne très bien en compilant avec avr-gcc:
    Code:
    #define DDRD 0x0a
    #define PORTD 0x0b
    
    .global main
    
    main:
    	sbi DDRD, 0
    	sbi PORTD, 0
    .end

    Ceci réglé, j'aimerais néanmoins savoir si vous avez des idées sur l'erreur cité plus haut: unknown pseudo-op: `.dseg'
    Code:
    .dseg
    Je pense que c'est un problème de version (pourtant j'ai la dernière d'avr-gcc et éventuellement de libc).

    Merci pour votre aide
    Dernière modification par sylvainmahe ; 23/04/2016 à 21h11.

  16. #15
    sylvainmahe

    Re : Atmega 328P interruptions sans avr/interrupt.h ?

    Pour la version langage C des interruptions sans AVR, voir mon exemple ici: http://forums.futura-sciences.com/el...ml#post5573296

Discussions similaires

  1. Etat des port d'un AT mega 328P après un RESET ...
    Par Seb.26 dans le forum Électronique
    Réponses: 4
    Dernier message: 02/11/2015, 15h55
  2. interrupt
    Par invite7ea43b86 dans le forum Électronique
    Réponses: 6
    Dernier message: 15/05/2015, 15h23
  3. Utilisation d'un atmega sans platine Arduino.
    Par invitec3b0a2b0 dans le forum Électronique
    Réponses: 20
    Dernier message: 23/09/2014, 13h01
  4. [Atmega-C] problème interrupt
    Par inviteb61e4847 dans le forum Électronique
    Réponses: 5
    Dernier message: 04/03/2011, 10h36
  5. Interruptions Atmega 8535
    Par invite4679d287 dans le forum Électronique
    Réponses: 0
    Dernier message: 03/04/2010, 11h40
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...