Departament de Microelectrònica i Sistemes Electrònics
AVR i FONAMENTS DE COMPUTADORS
Enginyeria en Informàtica (ETSE)
ports
Els ports configuren el mitjà pel qual el microcontrolador realiza la comunicació mitjançant lectures i escriptures amb l'exterior de la unitat de procés. S'entén per ports tant, els registres d'entrada/sortida que realiten la comunicació amb l'exterior del microcontrolador com els comptadors i registres interns, com ara el Status Register, que guarden la configuració i porten el control de tasques determinades mentre el microcontrolador està funcionant.
El microcontrolador ATmega8 disposa de 64 ports. Microcontroladors més grans, com ara el ATmega128, disposen d'una extensió de (en aquest cas) 160 ports més per a realizar les tasques de comunicació amb la CPU.
La comunicació amb els ports es realitza mitjançant una adreça que cada port té assignada. En el mapa de memòria s'observa que les adreces dels ports estan compreses enmig de les adreces dels registres de propòsit general (les 32 primeres adreces) i la SRAM. Van des de l'adreça $0020 a la $005F.
Quan es treballa amb els microcontroladors AVR l 'adreça del port queda amagada pel nom. Per exemple, quan es treu una dada pel PORTD del ATmega8 s'està adreçant al port 0x12 d'entrada/sortida o 0x32 de l'espai de memòria global (davant les adreces dels ports d'E/S hi ha les 0x20 adreces dels registres de propòsit general). PORTD és un nom equivalent que està declarat en el fitxer de definició del microcontrolador que equival a l'adreça del port.
L'accés als ports es pot fer de forma global al port (pel nom que té) o bit a bit. Les comandes genèriques de lectura/escriptura de port són IN/OUT. Exemples:
clr temp
out DDRD, temp
ser temp
out PORTD, temp
in temp, PIND
ldi temp, (1<<TOIE1)
out TIMSK, temp
ldi temp, (1<<UCSZ1)|(1<<UCSZ0)
out UCSRC; es posa temp a 0x00
; s'activa el PORTD com a entrada
; es carrega 0xFF a temp
; s'activen els pull-up's en entrada del PORTD
; es posa a temp el valor d'entrada del PIND
; es posa a 1 el bit 2 (TOIE1 està definit com a 2) de temp
; s'activa el bit 2 del registre TIMSK (interrupció per overflow en TIMER1)
; posar els bits de temp 2 i 1 a 1
; posar transmissió en UART a 8 bits
Quan es vol accedir als ports bit a bit, hi ha diverses comandes i procediments que en faciliten l'accés, com per exemple:
out $1E,r0
sbi $1C,0
in r1,$1D; escriure en l'adreça de l'EEPROM address
; posar el bit a llegir en EECR
; llegir la dada de l'EEPROM
Algunes instruccions que permeten preguntar sobre l'estat de bits en particular faciliten molt la tasca del programador. El programa leds1 mostra una aplicació amb les instruccions SBIC (Skip if Bit in IO Cleared) i SBIS ((Skip if Bit in IO Set).
Exotisme
Però per treballar amb les instruccions d'entrada/sortida cal tenir presents una sèrie de detalls (...sempre s'ha de tenir el full d'especificacions a ma!) que compliquen la vida al programador. Cal enrecordar-se'n que:
- L'espai d'adreces accessible per les instruccions IN i OUT va des del 0x00 al 0x3F. Això vol dir que agafa tot l'espai de ports en el cas del ATmega8, però no tot en el cas del ATmega128.
- Donat que l'espai adreces del port forma part de l'espai d'adreces de la SRAM, tots els ports poden ser adreçats per les instruccions de càrrega i guarda LD i ST. Però en aquests casos s'ha de sumar 0x20 a l'adreça del port si es fa de forma numèrica (sense el pnemotècnic). En els casos en què l'espai d'adreces d'E/S va més enllà de l'adreça 0x3F, per exemple en el ATmega128, aquesta és l'única forma d'adreçar els ports de l'espai d'E/S extès.
- I ...per acabar d'arreglar-ho, només els registres dintre el rang 0x00 i 0x1F poden ser direccionats bit a bit. Això vol dir que instruccions com ara SBI, SBIC, etc. només es poden emprar amb registres que estan dintre aquest rang d'adreces.