[Programmation] 328p interruptions en c sans avr
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

328p interruptions en c sans avr



  1. #1
    sylvainmahe

    Question 328p interruptions en c sans avr


    ------

    Bonjour

    J'aimerais appeler une fonction "test" quand une interruption se créé sur le vecteur 16 (timer 0 overflow) sur l'atmega 328p:

    Code:
    #define DDRD (*(volatile unsigned int*) (0x2a))
    #define PORTD (*(volatile unsigned int*) (0x2b))
    
    #define SREG (*(volatile unsigned int*) (0x5f))
    
    #define TCCR0B (*(volatile unsigned int*) (0x45))
    #define TIMSK0 (*(volatile unsigned int*) (0x6e))
    #define OCR0A (*(volatile unsigned int*) (0x47))
    
    #define TIMER0_OVF_vector _VECTOR (16)
    
    void test()
    {
    	DDRD = 0b00000001;
    	PORTD = 0b00000001;
    }
    
    int main()
    {
    	TCCR0B = 0b00000011;
    	TIMSK0 = 0b00000001;
    	OCR0A = 0b11111001;
    	
    	SREG |= 0b100000000;
    	
    	while (true)
    	{
    	}
    	
    	return 0;
    }
    Je ne sais pas comment en langage c faire un jmp (asm) vers ma fonction test quand il y a interruption.

    J'ai réussi à transformer:
    Code:
    #define DDRD 0x0a
    assembleur en l'équivalent c:
    Code:
    #define DDRD (*(volatile unsigned int*) (0x2a))
    Je pense que c'est donc possible également en c pour les interruptions, j'ai commencé avec ceci:
    Code:
    #define TIMER0_OVF_vector _VECTOR (16)
    Normalement il y a une interruption qui se créé toutes les millisecondes avec les registres que j'ai changé (TCCR0B, TIMSK0, OCR0A, et SREG), mais évidement le but est d’appeler une fonction pour pouvoir exécuter des choses, incrémenter un int par exemple...

    Pouvez-vous m'aider s'il vous plaît?

    -----

  2. #2
    gcortex

    Re : 328p interruptions en c sans avr


  3. #3
    sylvainmahe

    Re : 328p interruptions en c sans avr

    Je ne pense pas ici c'est par rapport au langage C, sans assembleur.

  4. #4
    abracadabra75

    Re : 328p interruptions en c sans avr

    Bonjour.

    On te l' a dit: ça ne dépend pas du langage, C, Assembleur, Java, Tango, ou valse, c' est tout pareil.
    C'est l'interruption qui, comme une grande, sait où elle doit aller.
    L'adresse de branchement réelle est calculée à la compilation.

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

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

    Re : 328p interruptions en c sans avr

    On ne m'a pas expliqué ca non. Aurrais-tu un exemple qui fonctionne pour que je puisse l'intégrer à ma bibliothèque?

    Merci d'avance

  7. #6
    sylvainmahe

    Re : 328p interruptions en c sans avr

    Re, avant de virer la bibliothèque avr-c de mon pc j'ai passé plusieurs heures à éplucher les fichiers et les multiples includes qui includent des includes etc...
    C'est vraiment sympa comme jeu, ça s'appelle la bibliothèque du chat et de la souris !

    Au final, on peut réduire l'ISR à une ligne, la voici:
    Code:
    #define ISR(vector) extern "C" void vector() __attribute__ ((signal)); void vector()
    Je vous donne un exemple de comment faire clignoter une led branchée sur PD0 toutes les 1 secondes:
    Code:
    #define _DDRD (*(volatile char*) (0x2a))
    #define _PIND (*(volatile char*) (0x29))
    
    #define _SREG (*(volatile char*) (0x5f))
    
    #define _TCCR0B (*(volatile char*) (0x45))
    #define _TIMSK0 (*(volatile char*) (0x6e))
    #define _OCR0A (*(volatile char*) (0x47))
    
    #define _TIMER0_OVF_vect __vector_ ## 16
    
    #define test(vector) extern "C" void vector() __attribute__ ((signal)); void vector()
    
    int _loop = 0;
    
    test (_TIMER0_OVF_vect)
    {
    	if (_loop == 0)
    	{
    		_PIND = 0b00000001;
    	}
    	
    	if (_loop < 999)
    	{
    		_loop++;
    	}
    	else
    	{
    		_loop = 0;
    	}
    }
    
    int main()
    {
    	_DDRD = 0b00000001;
    	
    	_TCCR0B = 0b00000011;
    	_TIMSK0 = 0b00000001;
    	_OCR0A = 0b11111001;
    	
    	_SREG |= 0b10000000;
    	
    	while (true)
    	{
    	}
    	
    	return 0;
    }
    Voila c'est cadeau et ça marche super

  8. #7
    abracadabra75

    Re : 328p interruptions en c sans avr

    Félicitations.
    Maintenant tu te souviendras toujours comment il faut faire.
    Alors que si l'un de nous t'avait donné le #define, tu aurais vraisemblablement oublié dans ... quelques temps.
    A+

    Ps. Mais regarde aussi quelle était ta question: "comment en langage c faire un jmp" ce qui est différent de comment créer une interruption.
    Question mal posée===>mauvaise réponse.
    Dernière modification par abracadabra75 ; 28/04/2016 à 10h42.
    Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.

  9. #8
    sylvainmahe

    Re : 328p interruptions en c sans avr

    Pas de soucis, ce qui compte c'est que sa m'a fait avancer et peut être d'autres qui liront.

    Bon maintenant je dois virer mes autres include (math.h, stdlib.h, string.h), ça va être facile car je n'utilise que très peu de fonctions dans ses .h

    Le but est d'avoir une bibliothèque pour l'atmega328p (http://sylvainmahe.xyz/) que je puisse passer aux gens intéressés sans que ce soit dépendant d'autre bibliothèque, pour avr c'est réglé

  10. #9
    sylvainmahe

    Re : 328p interruptions en c sans avr

    Petite question, est t'il impossible (et aberrant) de compiler un programme C avec gcc pour l'ATmega328P plutôt qu'avec avr-gcc?

    On est bien d'accord qu'avr-gcc c'est le compilateur gcc "modifié" pour générer du code adapté à l'architecture risc de microcontrôleur avr?

    Merci d'avance

Discussions similaires

  1. [Programmation] Atmega 328P interruptions sans avr/interrupt.h ?
    Par sylvainmahe dans le forum Électronique
    Réponses: 14
    Dernier message: 27/04/2016, 22h13
  2. 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
  3. Interruptions PIC
    Par invitead51e543 dans le forum Électronique
    Réponses: 95
    Dernier message: 19/04/2010, 08h38
  4. Les interruptions
    Par invite1e012ef4 dans le forum Électronique
    Réponses: 5
    Dernier message: 26/02/2009, 16h11
  5. interruptions
    Par invite715c3fc5 dans le forum Électronique
    Réponses: 0
    Dernier message: 10/06/2008, 15h55
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...