J'ai un petit soucis avec le code suivant, explication avant de lire :
- ce code est lancé par l'interruption UDRE
- le contenu des cases mémoire pointeur_buff_em et pointeur_buff_em+1 est à 0 lors de l'activation de l'interruption UDRE.
- Le but du jeu est de vider sur le Tx le tampon en mémoire buff_em_entete qui fait 0x0120 octets, en évitant de transmettre les cases mémoires remplit par l'octet 0.
- Ca ne marche pas, la transmission n'est jamais complète !!! je ne sais plus ou chercher.
Merci de votre aide précieuse
- Code: Tout sélectionner
vide_buffer_emission:
; Charge la valeur actuelle du pointeur
lds YH,pointeur_buff_em
lds YL,pointeur_buff_em+1
lire_caractere:
; Pointe le début du tampon d'entête
ldi ZH,high(buff_em_entete)
ldi ZL,low(buff_em_entete)
; Pointe à la position exacte dans le tampon
add ZL,YL
adc ZH,YH
; Lit le caractère en mémoire tampon d'emission
ld r16,Z
tst r16
brne emettre_caractere
; Si le caractère lu est 0, lire le suivant
adiw YH:YL,1 ; Incrémente le pointeur
; Teste si le pointeur est à la fin de la mémoire
cpi YH,high(0x0120)
brne lire_caractere
cpi YL,low(0x0120)
breq stopper_udre ; Si oui, stopper l'interruption UDRE
rjmp lire_caractere
emettre_caractere:
out UDR,r16
adiw YH:YL,1
; Teste si le pointeur est à la fin de la mémoire
cpi YH,high(0x0120)
brne lire_caractere
cpi YL,low(0x0120)
brne fin_emit_rs232 ; Si non, on attend que l'UART soit libre
; Si oui, stoppe l'interruption UDRE
stopper_udre:
cbi UCSRB,UDRIE
fin_emit_rs232:
sts pointeur_buff_em,YH
sts pointeur_buff_em+1,YL
ret
je suis

