Story Transcript
INDICE • Introduction a los microcontroladores • Ejemplo de microcontrolador minimalista: PIC10F200 • El microcontrolador ARM7 LPC2103
Microcontroladores • Idea «SoC»: Computador en un solo chip • Posible si la cantidad de memoria es pequeña. • Ideal para aplicaciones «embedded»
Microcontroller MEMORY CPU ROM
RAM
CLK PERIFERALS TIMER GPIO
ADC COMM
ETC
Clasificaciones de los uC. • Por anchura de palabra de la CPU – 8 bits: 8051, PIC10-18, AVR, 68HC11, … • Suelen presentar arquitectura Harvard
– 16 bits: PIC24/dsPIC, H8, 68HC12-16, … – 32 bits: principalmente basados en CPUs ARM LPC2xxx: ARM7 (NXP) AT91SAM: ARM7 (Atmel) PIC32: MIPS (Microchip) AVR32 (Atmel)
Arquitectura de la CPU
MEMORY
Modified Harvard Architecture
Program
Data
Instruction
Data
MEMORY
MEMORY
CACHE
CACHE
- One memory space
- Two memory spaces
Harvard: I8051, PIC, AVR... Modified Harvard: ARM9, MIPS...
data
Von Neumann: ARM7, 68HCxx...
addr.
Memory Management Unit
Main MEMORY - One logical memory space
data
addr.
instr.
addr.
data
CPU addr.
instr.
CPU addr.
CPU
data
Harvard Architecture
addr.
Von Neumann Architecture
Características Generales • Memoria de DATOS – RAM • Almacena las variables de los programas (variables estáticas, las de tipo «auto» suelen estar en registros) • En algunos micros también contiene la PILA • Memoria interna de unos pocos KB máximo
– Bancos de registros • Los registros de la CPU suelen estar visibles en ciertas direcciones de la memoria de datos
– E/S • Los registros de los periféricos también están visibles en la memoria de datos (memory-mapped-I/O)
Memoria de Programa • ROM – programada en fábrica. No se puede modificar su contenido.
• OTP: One-time-programming. – Se puede programar pero no se puede borrar.
• Flash – Programable y borrable (>1000 ciclos garantizados). – Se borra por bloques, no por posiciones individuales.
• EEPROM – Se permite la reprogramación de posiciones individuales. – Ideal para guardar datos de configuración.
Interrupciones • Simples – Se salta a una dirección fija. – La causa de la interrupción se indaga por programa.
• Vectorizadas – Se salta a una dirección distinta por cada causa. – Se usa una tabla de saltos o de punteros.
• Flags de interrupción – Se activan cuando un periférico causa una interrupción. – Puede que haya que borrarlos por programa.
• Máscaras de interrupción – Seleccionan que interrupciones se permiten y cuales no.
Periféricos típicos • GPIO: E/S de propósito general – Dirección de pines: entrada o salida – GPIO o funciones especiales – Pull-ups programables – Características eléctricas especiales: • • • •
Drenador abierto Schmitt-trigger (histéresis) Corriente de carga (conexión directa de LEDs…) Tolerantes a 5V (en micros con tensiones de alimentación baja)
UART Comunicaciones serie Asíncronas 5 to 8 data bits idle
idle START
D0
D1
D2
D3
D4
D5
Tbit
D7
(optional)
STOP
STOP
1 or 2 Tbit character length (Nbit+1+Nstop+(parity?))*Tbit
– Formato de los datos • Nº de bits de datos • Nº de bits de stop • Paridad
– Velocidad de los datos – Flags e interrupciones – Interfaz eléctrica • RS232 • Bus RS485 • Bus LIN
D6
PARITY
Periféricos típicos • Comunicaciones serie síncronas – Bus SPI – Bus I2C
• Temporizadores / Contadores – Temporizadores básicos – Eventos de captura y comparación – PWM – Perro guardian (Watchdog)
• Conversión Analógico/Digital – Comparadores analógicos – ADC de aproximaciones sucesivas
Gestión del reloj • Generación de la señal de reloj – Osciladores internos. Calibración. – Osciladores externos. Cristales de cuarzo. – PLL
• Modos de bajo consumo – CPU dormida (sin reloj). Modo Idle. – Control de alimentación de periféricos. – Oscilador principal parado. Modo power-down. – Interrupciones tipo «despertador»
Otros… • Circuitería de reset – Reset externo. – Power-on. Reset al encender. – Brown-out. Reset en fluctuaciones de la alimentación. – Perro guardián.
• Bootloaders – Programas en ROM para la reprogramación del microcontrolador dentro del sistema. – Protección del código contra copia.
Familias de uC • Conjunto de uC con características comunes: – Misma CPU – Cantidad de memoria interna variable – Variedad de periféricos para elegir
• Con ello se pretende ofrecer el uC más ajustado a la aplicación. – La memoria encarece el uC. – El disponer de periféricos especializados permite soluciones compactas (pocos componentes).
Ejemplo de familia: LPC21xx modelo
Flash (kB)
RAM (kB)
Pines E/S
UART
SPI
I2C
PWM
CAN
LPC2101
8
2
32
2
1
1
14
0
LPC2103
32
8
32
2
1
1
14
0
LPC2114
128
16
46
2
2
1
6
0
LPC2119
128
16
46
2
2
1
6
2
….
…
…
…
…
…
…
…
…
• Los periféricos tienen los mismos registros y ocupan las mismas posiciones de E/S en todos los uC de la familia.
uC minimalista: PIC10F200 • • • •
6 pines 256 palabras de código de 12 bits 16 bytes de memoria de datos Periféricos: – GPIO: 4 pines – Contador/Temporizador de 8 bits
• No soporta interrupciones • Reloj de 1 MHz (oscilador de 4MHz) interno. • 0.287€ en Mouser Electronics
PIC10F200 8
PIC10F200
data bus
PC
Flash
2.9mm
SOT-23/6
256x12
GP0
1
6
GP3//MCLR
gnd
2
5
Vdd
GP1
3
4
GP2/T0KI/FOSC4
GPIO stack 1 RAM
12
TRIS
16x8
Instr. Reg
OSCCAL mux 5
TIMER0 FSR
Instr. decode & control CLK osc.
8
mux
flash registers CONFIG
Prescaler Watchdog Reset /MCLR
ALU USER ID osccalbak.
GP0 GP1 GP2
stack 2
2.7mm
• Pila hardware: • 2 niveles de subrutinas • Registro W (working reg) implícito en instrucciones. • E/S mapeada en memoria de datos.
8
8
W
OPTION
Status R.
GP3
PIC10F200: mapa de memoria Data address space
Instruction specific registers
0x00
INDF*
Indirect addressing (not a physical register)
0x01
TMR0
Timer0
0x02
PCL
0x03
STATUS
0x04
FSR
0x05
OSCCAL
0x06
GPIO
0x07 0x0F 0x10
0x1F
OPTION: copy W to OPTION
OPTION
unimplem. general purpose registers
Program counter (lower byte) Flags Indirect addressing: pointer
TRIS: copy W to TRIS
TRIS
Clock frequency adjust Pin input/output (see also TRIS)
CLRWDT: clear watchdog SLEEP: clear watchdog, stop osc.
Read as 0x00
User RAM / variables (16 bytes)
PIC10F200. Registros STATUS: 7 GPWUF
6 -
5
4
-
/TO
3
2
1
0
/PD
Z
DC
C
C: Carry flag from ALU DC: Digit (4th bit) carry (for BCD arithmetic) Z: Zero flag from ALU /PD: Power down. Set to low after executing SLEEP /TO: Time-out. Set to low after a watchdow reset GPWUF: GPIO reset. Set high after a reset due to pin change
OPTION:
PIC10F200. Registros
7 /GPWU
6
5
/GPPU
T0CS
4 T0SE
3 PSA
2
1
PS2
PS1
PS2-0: Prescaler division factor select bits (for TIMER0 or watchdog) value 000 001 010 011 100 101 110 111
TIMER0 1/2 1/4 1/8 1/16 1/32 1/64 1/128 1/256
watchdog 1/1 1/2 1/4 1/8 1/16 1/32 1/64 1/128
PSA: Prescaler asignement. 0=prescaler asigned to TIMER0 1=prescaler asigned to watchdog T0SE: TIMER0 source edge. T0CS: TIMER0 Clock Select.
0=rising edge 1=falling edge 0=Timer0 clk is Fosc/4 1=Timer0 clk is T0CKI pin (GP2)
/GPPU: Enable pull-ups (GP0,GP1,GP3).
0=pull-ups enabled 1=pull-ups disabled
/GPWU: Enable wake-up on pin change (GP0,GP1,GP3).
0=enabled 1=disabled
0 PS0
PIC10F200. GPIO data bus
wr GPIO
not for GP3 D Q GPIO latch wr /Q
** Vdd
weak * pull-up p
ESD protection
p GP pin
W reg. TRIS instr.
D Q TRIS latch wr /Q
n
Vss
/GPPU (OPTION reg.)
rd GPIO
TRIS:
0=output 1=input
* No pull-up for GP2 ** GP3 is input-only
PIC GPIO read/modify/write • El valor del registro GPIO no se puede leer directamente. Lo que se lee es la tensión en el pin. • Los pines que estén programados como entradas se van a cambiar en GPIO al ejecutar las instrucciones de tipo read/modify/write en GPIO. Ejemplo: BSF GPIO,0 (poner en 1 el pin GP0) Consta de 3 pasos: 1. Lee GPIO al bus de datos interno (los 4 bits) 2. Se hace una OR lógica con 0x01 3. Se escribe el resultado en GPIO Si GP1 está como entrada el valor que haya en ese momento en el pin se va a escribir en GPIO.1 (supuestamente sólo estábamos cambiando GPIO.0)
PIC10F200. Config CONFIG: 11 10
9
8
7
6
5
4
3
2
MCLRE
/CP
WDTE
WDTE: Watchdog enable
0=disabled 1=enabled
/CP: Code protection
0=enabled 1=disabled
MCLRE: MCLR enable
0=GP3 1=MCLR
1
0
• CONFIG no es accesible desde el propio micro Su valor se graba junto con la memoria de programa (flash) • El watchdog es un contador con un periodo de 18ms (sin prescaler) que hace un reset del micro si no se borra antes de ese tiempo con la instrucción CLRWDT • Si /CP está activo las posiciones de memoria de programa 64 a 255 se leen como 0x000 desde los programadores.
PIC10F200. cjto. de instrucciones • Registro W implícito • Destino en W o en memoria de datos, a elegir Ejemplos: ADDWF var,w W+Mem[var] -> W ADDWF var,f W+Mem[var] -> Mem[var] • Las instrucciones se ejecutan en un ciclo de CPU (4 ciclos de oscilador) salvo los saltos que tardan 2 ciclos: GOTO, CALL, RETLW, y escrituras en PCL. • No hay saltos condicionales. En su lugar se tienen instrucciones «SKIP» condicionales, que ejecutan la siguiente instrucción o la convierten en NOP.
PIC10F200. Instrucciones Instrucción
Descripción
Flags
ADDWF f,d
W+Mem[f] ->W/Mem[f]
C, DC, Z
ANDWF f,d
W&Mem[f] -> W/Mem[f]
Z
CLRF
0 -> Mem[f]
Z
CLRW
0 -> W
Z
COMF f,d
~Mem[f] -> W/Mem[f]
Z
DECF f,d
Mem[f]-1 -> W/Mem[f]
Z
DECFSZ f,d
Mem[f]-1 -> W/Mem[f] Skip next instr. If result is 0
-
INCF f,d
Mem[f]+1 -> W/Mem[f]
Z
INCFSZ f,d
Mem[f]+1 -> W/Mem[f] Skip next instr. If result is 0
-
IORWF f,d
W|Mem[f] -> W/Mem[f]
Z
MOVF f,d
Mem[f] -> W/Mem[f]
Z
MOVWF f
W -> Mem[f]
-
comentarios
Útil en bucles
PIC10F200. Instrucciones Instrucción
Descripción
NOP
Flags
comentarios
-
RLF f,d
Rotate Left (through carry)
C
ROT
RRF f,d
Rotate Right (through carry)
C
ROT
SUBWF f,d
Mem[f]-W -> W/Mem[f]
C, DC, Z
SWAPF f,d
Nibble swap
-
XORWF f,w
W^Mem[f] -> W/Mem[f]
Z
BCF f,b
Mem[f].b=0 (bit clear)
-
RMW
BSF f,b
Mem[f].b=1 (bit set)
-
RMW
BTFSC f,b
Skip next Instr. If Mem[f].b==0
-
BTFSS f,b
Skip next Instr. If Mem[f].b==1
-
ANDLW k
W&k -> W
Z
CALL k
Subroutine call: PC->stack, k -> PC
-
SWAP
PIC10F200. Instrucciones Instrucción
Descripción
Flags
comentarios
CLRWDT
Clear watchdog
TO,PD
watchdog
GOTO k
k -> PC
-
IORLW k
W|k -> W
Z
MOVLW k
k -> W
-
OPTION
W -> OPTION
-
RETLW k
k -> W, stack -> PC return from subroutine
-
Constant arrays
SLEEP
Stop oscillator
TO,PD
Power down
TRIS f
W -> TRIS
-
XORLW k
W^k -> W
Z
PIC10F200. Instrucciones RLF:
RRF:
H
Mem[f]
C
Mem[f]
C
L
SWAP:
RMW: Read/Modify/Write. Usar con precaución si f=GPIO Constant Arrays: Arrays of RETLW k instructions
PIC. Estructuras de programa • Bucles Contador:
Etiqueta:
equ 0x10 ; variable en RAM MOVLW MOVWF … … DECFSZ GOTO …
20 ; nº de vueltas Contador
Contador,f Etiqueta
PIC. Estructuras de programa • Tablas de constantes
tabla:
MOVF CALL … ADDWF RETLW RETLW RETLW … …
indice,w tabla PCL,f 0x25 0x33 0x12
;salto múltiple ;tabla[0] ;tabla[1] ;tabla[2]
PIC. Estructuras de programa • Aritmética de 16 bits ; AH:AL + BH:BL -> AH:AL ; (variables en RAM) MOVF
BL,w
ADDWF BTFSC INCF MOVF ADDWF
AL,f status,c AH,f BH,w AH,f
; ¿acarreo?
PIC10F200. Ejemplo de aplicación Artículo de broma: Grillo electrónico • Imita el canto de un grillo en la oscuridad • El PIC10F200 va a sustituir a toda la lógica de la figura
contador 14 bits
1024 ciclos
8192 ciclos
Q13 Q10 128 ciclos
Q7 /LUZ (sensor)
Reset
128 ciclos
altavoz Q0 187 us
OSC 2.66kHz
187 us
1 ciclo
PIC10F200. Ejemplo de aplicación • LDR: disminuye su resistencia con la luz • Altavoz piezoeléctrico: Impedancia de unos 2kohm. Se puede conectar directamente a los pines del micro • Altavoz entre dos pines: Aumenta el volumen del sonido (recomendable para tensiones de alimentación bajas)
PIC10F200 altavoz piezoelectrico
/MCLR GP0
+3V
GP1 GP2 LDR
PIC10F200. Código processor p10f200 __config 0x01C ; MCLR, no code protection, watchdog ON radix dec ; números en decimal por defecto ;---------------------------------------------;--------------- Definiciones ----------------w equ 0 ; W es destino f equ 1 ; File_reg es destino c equ 0 ; Carry flag en STATUS dc equ 1 ; Digit_Carry flag en STATUS z equ 2 ; Zero flag en STATUS ;------------ Registros especiales -----------indf equ 0x0 tmr0 equ 0x1 pcl equ 0x2 equ 0x3 status fsr equ 0x4 equ 0x5 osccal gpio equ 0x6
PIC10F200. Código ;----------- Variables del programa ----------cblock 0x10 ; primera posición libre cnt1 ; contador de 16 bits cnt2 tmp ; variable comodín endc ;------------------ RESET --------------------org
0
movwf movlw tris movlw option
osccal 0x0c gpio 0x4f
;calibramos oscilador ;GP0,GP1 salidas ;No Pull-UPs, prescaler 1/128 para WDT
;----------- BUCLE principal del programa ----------
PIC10F200. Código L0:
L1:
btfss sleep clrwdt incf btfsc incf movf andlw movwf movf andlw iorwf movlw btfsc movlw movwf movlw movwf decfsz goto goto end
gpio,2
; probamos luz
cnt1,f status,z cnt2,f cnt1,w 0x81 tmp cnt2,w 0x24 tmp,w 0x01 status,z 0x02 gpio 56 tmp tmp,f L1 L0
; (cnt1:cnt2)++
; Bits 0,7,10,13 en cero? ; bits 0 y 7
; bits 10 y 13 ; valor en buzzer. Depende de si los bits eran 0
; cambio en pines del buzzer ; retardo: 20+(56*3-1)=187 ciclos/muestra