Departament de Microelectrònica i Sistemes Electrònics
AVR i FONAMENTS DE COMPUTADORS
Enginyeria en Informàtica (ETSE)
Recepció amb USART per interrupció
Amb l'objectiu de no complicar el codi el programa implementat és molt simple. Senzillament es configura l'entrada PORTE.0 (entrada RxC0) del microcontrolador ATmega128 per rebre dades del port sèrie per interrupció. Per tant,
- El PORTE.0 es configura com a entrada amb pull-up.
- Es configura el terminal de recepció de la USART per rebre dades en un format de 8 bits i 1 de stop, a 38400 bauds.
- Tota arribada de dada (10 bits) s'entén com a recepció de nova dada i provoca una interrupció RXCIE0.
- La rutina de tractament de la interrupció envia la dada rebuda al PORTD, configurat com a sortida, que (connectant-hi leds) mostra la dada arribada.
; EXEMPLE DE COMUNICACIÓ: RECEPCIÓ PER INTERRUPCIÓ
; Joan Oliver, desembre 2008
.INCLUDE "m128def.inc"
.DEF srri = R10 ;registre guarda SREG
.DEF temp = R16 ;registre temporal
.CSEG
.ORG 0x00
rjmp inici ;Servei interrupció inici
.ORG 0x24
rjmp int_rxc ;Rutina d'interrupció per RXCIE0
reti;*******************INICI PROGRAMA********************************
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--------------------------------------------
main: nop
rjmp main;-------RUTINA DE SETUP PORTS------------------------------------
; inicialització ports
setup_PORTS:
sbi PORTE, 0 ; pin d'entrada RXC0 en pull-up
ser temp
out DDRD, temp ; PORTD sortida per leds; mostra la dada arribada
ret
;-------RUTINA DE SETUP DE LA UART------------------------------------
setup_UART:
ldi temp,0x00 ; baud rate a 38400 bauds(UBBR0=25=0x019)
sts UBRR0H,temp
ldi temp,0x19
out UBRR0L,temp
ldi temp,(1<<RXCIE0)|(1<<RXEN0) ; enable recepció per interrupció
out UCSR0B,temp
ldi temp,(1<<UCSZ01)|(1<<UCSZ00) ; frame format: 8data,1stop bit
sts UCSR0C,temp
ret
;-------RUTINA DE SERVEI INT RECEPCIÓ COMPLETA----------------------
int_rxc:
in srri, SREG
in temp, UDR0 ; es llegeix la dada rebuda i ...
out PORTD, temp ; ...s'escriu pel PORTD
out SREG, srri
reti