IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres architectures Assembleur Discussion :

[ATmega169] Faire clignoter une LED


Sujet :

Autres architectures Assembleur

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [ATmega169] Faire clignoter une LED
    Bonjour à tous,

    J'ai réalisé le code assembleur d'un exercice qui m'a été proposé à l'école.
    Je voudrais savoir ce que vous pensez de mon programme, si il est possible de l'optimiser (ce qui est certainement le cas).

    Voici l'énoncé :

    On souhaite sortir sur une des broches du microcontrôleur un signal permettant de faire clignoter une LED à la fréquence de 2Hz 50 % D.C. On fera appel pour cela au Timer 0 et aux interruptions.
    On utilisera le Timer 0 en mode CTC.
    Le programme principal devra lire l’état d’un bouton poussoir et, à chaque appui, faire clignoter une seconde LED branchée sur le μC.

    Mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    .include "m169def.inc"
    
    .org 0x0000
    Rjmp RESET
    .org 0x0014
    Rjmp TIMER_COMPARE
    
    .org 0x0030
    RESET:	
    ldi r16,high(ramend)
    out SPH,r16
    ldi r16,low(ramend)
    out SPL,r16
    sei ; Autorise les interruptions
    rcall INIT
    
    
    INIT:
    	clr r17
    	ldi r16,0xFF
    	out DDRB,r16 ; Configure le PORTB en entrée
    	ldi r16,0x00
    	out DDRD,r16 ; Configure le PORTD en sortie
    
    
    	;INITIALISATION du timer0
    	;FOC0A WGM00 COM0A1 COM0A0 WGM01 CS02 CS01 CS00 TCCR0A
    	ldi r16,0b00001101
    	out TCCR0A,r16
    	ldi r16,0b11000010 ; Mettre la valeur 194 pour +/- 2Hz
    	out OCR0A,r16
    	;– – – – – – OCIE0A TOIE0 TIMSK0
    	ldi r16,0b00000010
    	ldi r26,$6e
    	st X,r16
    	rjmp PROG
    
    PROG:
    	in r18,PORTB
    	cpi r18,0b11111110
    	brne PROG
    	ldi r19,0b11111101
    	out PIND,r19
    	CALL TEMPO
    	ldi r19,0b11111111
    	out PIND,r19 
    	CALL TEMPO
    	rjmp PROG
    
    TIMER_COMPARE:
            cpi r17,0b00000101
    	brmi LED_ON
    LED_OFF:
    	ldi r20,0b11111111
    	out PIND,r20
    	jmp CLEAR
    LED_ON:
    	ldi r20,0b11111110
    	out PIND,r20
    CLEAR:
    	inc r17
    	cpi r17,0b00001010
    	brne FIN
    	clr r17
    FIN:
    	reti
    
    TEMPO:	
    	dec r21 
    	brne TEMPO 
    	ret

    Merci d'avance pour vos réponses.

    ps: le µC utilisé est l'ATmega169.

  2. #2
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 33
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Mazzetho Voir le message
    Bonjour à tous,

    J'ai réalisé le code assembleur d'un exercice qui m'a été proposé à l'école.
    Je voudrais savoir ce que vous pensez de mon programme, si il est possible de l'optimiser (ce qui est certainement le cas).

    ps: le µC utilisé est l'ATmega169.
    Bonjour,
    Quelques corrections dans votre programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    rcall INIT   ;appel de la routine pointé à PC
    (rcall INIT) Ce Rcall N´Est Pas Necessaire Puisque tu continue directement 
                 dans ton code donc tu peut l´enlever 
     
    INIT:
     
    ldi r16,0xFF ;R16=FF
    OUT PORTB ,R16
    Out DDRB,R16 ; Configure le PORTB en SORTIE et non pas en entré 
    ldi r16,0x00
    out DDRD,r16 ; Configure le PORTD en ENTRÉ et non pas en sortie
     
    Un registre de direction DDRx :
    « 1 » logique dans un de ses bits, configure la broche de port en sortie.
    « 0 » la configure en entrée.
    ...................................................................
    ldi r26,$6e
    st X,r16
    rjmp PROG
     
    LDI     R17,0x02    ; Set Timer/Counter0 Bit OCIE0A
    STS     TIMSK0,R17  ; Set TIMSK0 ;ecrit la valeur de r17 à l'adresse 006E
     
    ;(rjmp PROG)  Ce Rjmp N´Est Pas Necessaire Puisque tu continue directement 
    ;             dans ton code donc tu peut l´enlever
    ..................................................................
     
    PROG: ;lire l’état d’un bouton poussoir à chaque appui,
          ; il est possible de l'optimiser
     
     Sbis PinD,0 ;Si PinD 0 N´est Pas poussé continue
                 ;Si PinD 0 Est poussé Saute TEMPO 
     
     Sbic PinD,0 ;Il N´est Pas poussé donc Resaute a PROG
     
     rcall	TEMPO   
     
     rjmp	PROG;Resaute a PROG pour voir l´etat de ton pin 
     
    ................................................................

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre réponse.

    Je n'avais pas pensé aux instructions SBIS, SBIC.

    Pour le TIMSK ça m'a pris pris beaucoup de temps pour trouver comment activer les bits à l'intérieur de ce registre (j'avais toujours des erreurs à la compilation), votre solution m'a l'air bien meilleure que la mienne ...

    Encore merci et bonne fin de journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/11/2010, 16h27
  2. Ajout de fonction : faire clignoter une led
    Par Nono69690 dans le forum C
    Réponses: 16
    Dernier message: 06/06/2009, 13h37
  3. Méthode simple pour faire clignoter une editbox
    Par mr.saucisse dans le forum MFC
    Réponses: 5
    Dernier message: 10/03/2006, 11h57
  4. Réponses: 8
    Dernier message: 07/02/2006, 18h31
  5. Réponses: 2
    Dernier message: 13/12/2004, 15h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo