Departament de Microelectrònica i Sistemes Electrònics

AVR i FONAMENTS DE COMPUTADORS
Enginyeria en Informàtica (ETSE)

Transmissió amb USART per interrupció

Nota: aquest programa ha estat fet per un microcontrolador ATmega128 amb fosc=16MHz. La diferència fonamental és que té 2 mòduls USART i, per tant, tota referència es fa a la USART0.

El programa presenta la transmissió de dues dades, el nombre 3 (codi ASCII 0x33) i la lletra w (codi ASCII 0x77) controlat a través de la rutina principal del programa.

La rutina d'interrupció de transmissió feta desactiva el flag busy controlat per un registre que permet donar pas a la següent transmissió. Aquesta forma d'actuar dóna el control al programa principal.

; EXEMPLE DE COMUNICACIÓ: TRANSMISSIÓ PER INTERRUPCIÓ
; Joan Oliver, desembre 2008
; Treballant amb la transmissió de la USART
; La interrupció per fi de transmissió TXCIE indica que una nova dada pot ser transmesa
; S'envien contínuament els codis ASCII 0x33 i 0x77

.INCLUDE "m128def.inc"

.DEF srri = R10 ;registre guarda SREG
.DEF temp = R16 ;registre temporal
.DEF busy = R17 ;registre flag de UDR0 ocupat
.DEF dada = R18 ;registre dada de transmissió

.CSEG
.ORG 0x00
     rjmp inici ;Servei interrupció inici
.ORG 0x28
     rjmp int_txc ;Servei interrupció timer1 per overflow
     reti

;*******************INICI PROGRAMA********************************
; Setup de ports d'E/S, UART i interrupcions externes
inici:
     ldi temp,LOW(RAMEND) ;Setup del stack
     out SPL,temp
     ldi temp,HIGH(RAMEND)
     out SPH,temp

     rcall setup_PORTS ; setup ports
     rcall setup_UART ; setup uart
     sei ; Activació general d'interrupcions

;---------------------------------------------------------------------
;-------PROGRAMA PRINCIPAL--------------------------------------------
     clr busy
main: ldi dada, 0x77 ; enviar dada 1
     ser busy : s'activa flag que s'està enviant una dada
     out udr0, dada ; transmetre dada
;......es poden fer altres accions mentrestant...fins que es vol enviar nova dada
loop1:cpi busy, 0
     brne loop1

     ldi dada, 0x33 ; enviar dada 2
     ser busy
     out udr0, dada ; transmetre dada
;......es poden fer altres accions mentrestant...fins que es vol enviar nova dada
loop2:cpi busy, 0
     brne loop2

     rjmp main

;---------------------------------------------------------------------
;-------RUTINA DE SETUP PORTS------------------------------------
; inicialització ports
; el portB mostrarà la dada que s'envia
; PE.1 correspon a la sortida TxD

setup_PORTS:
     sbi DDRE, 1 ; PE.1 sortida TxD
     sbi PORTE, 1 ; PE.1 a 1 per defecte
     ret
;---------------------------------------------------------------------
;-------RUTINA DE SETUP DE LA UART------------------------------------
; a 38400 bauds(UBBR0=25=0x019) i frame format: 8data,1stop bit
setup_UART:
     ldi temp,(1<<TXCIE0)|(1<<TXEN0) ; enable transmissió i interrupció per trans'completa
     out UCSR0B,temp
     ldi temp,(1<<UCSZ01)|(1<<UCSZ00) ; frame format
     sts UCSR0C,temp
     ldi temp,0x00 ; baud rate
     sts UBRR0H,temp
     ldi temp,0x19
     out UBRR0L,temp
     ret

;-------RUTINA DE SERVEI INT'TRANSMISSIÓ COMPLETA----------------------
; Iniciació de nova transmissió

int_txc:
     in srri, SREG
     clr busy ; es desactiva el flag de transmissió ocupada
     out SREG, srri
     reti

La figura 1 mostra el resultat de la transmissió. La finestra de l'esquerra mostra el resultat que surt per l'hyperterminal. D'acord amb el control de transmissió fet, s'envia contínuament les dades w i 3. A la finestra de la dreta s'observa el resultat adquirit per l'oscil·locop. Cal dir:

- La mesura entre les dues ratlles negres correspon a la transmissió del nombre 3, tal com mostra el comentari de sota la gràfica blava: primer s'emet el zero (en vermell) d'inici de transmissió i al final el 1 (en vermell) de fi de transmissió. Enmig es transmet (en blau) el nombre codificat en ASCII 0x33, de bit menys significatiu a més significatiu.

- A partir del nombre 3 l'hyperterminal reb la lletra w (0x77), després altra cop el 3, etc. Es pot observar com les dades es transmeten de forma correcte i sense solpar bits, gràcies al sincronisme introduït amb la interrupció de transmissió completa.

- La freqüència de transmissió és l'establerta. Entre barres negres passa un temps de 263.2useg. Correspon a una velocitat de transmissió de (263.2useg/10bits)^(-1) = 37994 bauds, prop dels 38400 bauds teòrics (prop d'1% d'error).

- Finalment la gràfica vermella correspon als nivell RS232 amb què es transmet. Es pot observar com el 0 i 1 lògics estan invertits i que els voltatges van de -8 a +8. Aquesta és la sortida del MAX232 cap a l'ordinador.

Figura 1. Transmissió per interrupció


WcN - AVR i Fonaments de computadors -> Transmissió amb interrupció