Microprocesadores I
Tema 3 Programación de los puertos de Entrada/Salida de los AVR
Pines de E/S y sus funciones ●
●
La cantidad de pines de E/S varía de acuerdo al empaque del dispositivo. Los pines de E/S tienen funciones alternativas. El pin es c ompartido entre varios periféricos.
Pines de E/S ●
Cada puerto de E/S tiene asociados tres registros.
●
Se designan como PORTx, PINx y DDRx
Registro DDRx Cada uno de los pines de los puertos puede usarse como entrada o como salida.
●
El propósito del registro DDRx es configurar un determinado pin como entrada o salida.
●
Para que el pin del puerto sea una salida, se escribe un '1' en el bit correspondiente de DDRx. Para que sea una entrada, se escribe en '0' en el bit correspondiente de DDRx.
●
Cabe resaltar que si no se escribe un '1' en el registro DDRx, no se podrá enviar valores al p uerto (salida).
●
Registros DDRx y PORTx Para escribir un valor en los pines de los puertos, se debe escribir en el registro PORTx.
●
LDI OUT L1: LDI OUT CALL LDI OUT CALL RJMP ●
R16, 0XFF DDRB, R16
;R16=0b11111111 ;Puerto B todo salida
R16, 0X55 PORTB, R16 DELAY R16, 0XAA PORTB, R16 DELAY L1
;R16 = 0b01010101 ;Puerto B = 01010101 ;Retard o ;R16 = 0b10101010 ;Puerto B =10101010 ;Retard o
Sin las dos primeras líneas, el programa no escribe en los pines del puerto B.
PINx en entradas ●
●
●
Para que el pin del puerto sea una entrada, se debe escribir un '0' en el bit del registro DDRx correspondiente al pin del puerto. Luego de un 'reset ', todos los registros DDRx contienen '0', por lo que todos los puertos están configurados como entradas. Para leer los valores de los pines de los puertos, se debe leer el registro PINx.
PORTx en entradas ●
●
Cada pin de puerto de los AVR tiene una resistencia de pull-up. Si se escribe un '1' en los bits del registro PORTx, estos pull-up se activan. Si se escribe un '0', se desactivan. ●
Cuatro posibles estados de los pines de los puertos de los AVR.
Ejemplo ●
El siguiente programa lee datos de los p ines del puerto D y los escribe en el puerto B. INICIO: LDI R16, 0X00 OUT DDRD, R16 LDI R16, 0XFF OUT DDRB, R16 L1: IN R16, PIND OUT PORTB, R16 RJMP L1
;Puerto D como entradas ;Puerto B como salidas ;Leer pines del puerto D ;Escribir en el puerto B
Programación de los bits de E/S ●
●
●
Generalmente se utilizan los pines del microcontrolador de manera independiente, y no el puerto completo (8 bits). Los AVR permiten la manipulación de cada uno de los pines de E/S de manera independiente. Para esta manipulación se utilizan las instrucciones orientadas a bits ( Bit oriented ).
Instrucción SBI ●
SBI (Set Bit in I /O register ). Poner en '1' un bit de un registro de E/S.
●
SBI A, b
●
I/O(A, b) ← 1
●
Ejemplo SBI
0 ≤ A ≤ 31, 0 ≤ b ≤ 7
PORTB, 5
PC ← PC + 1
;Pone en '1' el bit 5 de PORTB
Instrucción CBI ●
CBI (C lear Bit in I /O register ). Pone a '0' un bit de un registro de E/S.
●
CBI A, b
●
I/O(A, b) ← 0
●
Ejemplo:
0 ≤ A ≤ 31, 0 ≤ b ≤ 7
SBI DDRB, 2 L0: SBI PORTB, 2 CALL DELAY CBI PORTB, 2 CALL DELAY RJMP L0
PC ← PC + 1
;PB2 como salida ;Pin PB2 = 1 ;Pin PB2 = 0
Instrucción SBIS ●
SBIS (Skip if Bit in I /O register is Set ). Saltar si el bit del registro de E/S es '1'.
●
SBIS A, b
0 ≤ A ≤ 31, 0 ≤ b ≤ 7
●
Si I/O(A, b) = 1 entonces PC ← PC + 2 (ó 3)
●
Si no PC ← PC + 1
Instrucción SBIS ●
Programa que lee el pin PB2 y si es '1', genera un pulso en el pin PB0. CBI SBI
DDRB, 2 DDRB, 0
;PB2 como entrada ;PB0 como salida
SBIS RJMP SBI NOP CBI NOP RJMP
PINB, 2 L0 PORTB, 0
;Salta si PB2 = '1' ;Si es '0', vuelve a leer PB2 ;PB0 = 1
PORTB, 0
;PB0 = 0
L0:
L0
Instrucción SBIC ●
SBIC (Skip if Bit in I /O register is C leared ). Saltar si el bit del registro de E/S es '0'.
●
SBIC A, b
0 ≤ A ≤ 31, 0 ≤ b ≤ 7
●
Si I/O(A, b) = 0 entonces PC ← PC + 2 (ó 3)
●
Si no PC ← PC + 1
Instrucción SBIC ●
Programa que lee el pin PB7 y si es '0', genera un pulso en el pin PB6. CBI SBI L1: SBIC RJMP SBI NOP CBI NOP RJMP
DDRB, 7 DDRB, 6
;PB7 como entrada ;PB6 como salida
PINB, 7 L1 PORTB, 6
;Si PB7 es '0', sale de L1 ;Si no, vuelve a leer PB7 ;PB6 a '1'
PORTB, 6
;PB6 a '0'
L1
Práctica 1 ●
Escribir los siguientes programas:
1)Generar una forma de onda cuadrada en un pin de E/S, con un ciclo de trabajo de 50%. 2)Generar una forma de onda cuadrada en un pin de E/S, con un ciclo de trabajo de 25%. 3)Generar una forma de onda cuadrada en un pin de E/S, con un ciclo de trabajo de 25%, solamente si un segundo pin de E/S está en '1', y detener la generación cuando este segundo pin está en '0'.
Práctica 2 ●
Cómo configurar un pin de E/S en Arduino.
●
Cómo leer el estado de un pin de E/S en Arduino.
●
●
●
Cómo escribir un valor ('0' o '1') en un pin de E/S en Arduino. Cómo conmutar continuamente un pin de salida en Arduino, con un retardo entre cambios de estado ( blink ). Para entregar la próxima semana.