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


WcN - AVR i Fonaments de computadors -> Recepció per interrupció