Professional Documents
Culture Documents
PIC16F84A y PIC16F628A/648A
La idea de este tutorial es ayudar a los que recin estn empezando, aqu mostraremos como
comenzar. Usaremos en primer lugar el microcontrolador PIC16F84A, porque es el que por lo
general se usa en la enseanza. Comenzaremos explicando como esta constituido, los terminales,
manejo de corrientes de los puertos, osciladores externos, circuito de reset, memoria de programa
y memoria de datos. Luego iremos a lo interesante, que es la programacin, nuestros primeros
programitas, de los cuales se tratar de explicarlos detalladamente, el funcionamiento y los
registros que se usan en cada caso.INDICE
El PIC16F84A
Introduccin
Mi Primer Programa, control de un led
Creacin de Demoras, Led titilando
Creacin de Tablas, Control Display 7 Segmentos
Direccionamiento Indirecto, Control Display 7 Segmentos
Control de varios Displays 7 Segmentos con multiplexin
Control de varios Displays 7 Segmentos con 74LS164
Interrupciones, Registros y guardado temporario de STATUS y W
Interrupcin TMR0, modo Temporizador
Interrupcin TMR0, modo Contador
Interrupcin RB0, Control de Led
Interrupcin RB4 a RB7, Control Teclado Matricial
Control del LCD, Pantalla de Cristal Liquido
Comunicacin RS232
Todas las simulaciones hechas en proteus, aqui (Para el PIC16F84A)
El PIC16F628A/648A
Introduccin
Timer1 + Ejemplo
Timer2 + Ejemplo
Mdulo de comunicacin serie (Usart) + Ejemplo
Comparadores analgicos + Ejemplo
Mdulo CCP. Introduccin
Modo Captura + Ejemplo: Medir Frecuencia
Modo Comparacin + Ejemplo: Seal de frecuencia variable
Modo PWM + Ejemplo: Seal de 2 Frecuencias distintas
2 Ejemplo PWM. Variando el Ciclo de Trabajo.-
Ms Informacin
Herramientas
Software
Software
Una
Software
para
para
grabar
escribir
para
nuestro
nuestro
cdigo
simular:
plaquita
PIC, se puede
usar
y
el
compilar:
Proteus
WinPic800
MPLAB
programadora.
o el Icprog
DATASHEET
DATASHEET
del
del
PIC16F84A
PIC16F628A/648A
En lnea
Micros-Designs
Suky
Moderadores
DsPIC33
Desconecta
do
Introduccin
Respuesta #1 : 05 de Febrero de 2009, 20:20:10
Introduccion:
Con
El puerto A tiene solo cinco pines, el pin 3, sea, RA4/TOCKI puede ser
configurado a su vez como entrada/salida o como temporizador/contador. Cuando
es salida se comporta como colecto abierto, por lo tanto debemos poner una
resistencia Pull-up a Vdd de 1 Kohm. Cuando se configura como entrada,
funciona como disparador Schmitt Trigger por lo que puede reconocer seales
con
un
poco
de
distorsin.
El puerto B tiene 8 pines que pueden ser configurados como entrada/salida. RB0
puede programarse adems como entrada de interrupcin externa. Los pines RB4
a RB7 pueden programarse para responder a interrupciones por cambio de estado
y los pines RB6 y RB7 se corresponden con lneas de entrada de reloj y entrada
de
datos
cuando
esta
en
modo
programacin.
MCLR/Vpp, es la entrada de reset si esta a nivel bajo, tambin es habilitador de
tensin de programacin. Cuando su tensin es Vdd el PIC funciona
normalmente.
Vss y Vdd, son los pines de masa y alimentacin. La tensin de alimentacin
esta
comprendida
entre
los
2
y
5.5
Volt.
OSC1/CLKIN y OSC2/CLKOUT, pines de entrada externa de reloj y salida de
oscilador
a
cristal
respectivamente.-
Capacidad
de
corriente
de
los
puertos.
La mxima capacidad de corriente de cada uno de los pines de los puertos en
modo sumidero es de 25 mA y modo fuente de 20 mA. La mxima capacidad de
corriente
total
de
los
puestos
es,
Puerto A: Modo sumidero 80 mA; Modo fuente 50 mA.
Puerto B: Modo sumidero 150 mA; Modo fuente 100 mA.
El
Oscilador
externo.
Es un circuito externo que le indica al microcontrolador la velocidad a la que
debe
trabajar.
Puede
utilizar
cuatro
tipos
distintos:
RC, Oscilador con resistencia y condensador (Poco preciso)
XT,
Cristal
de
cuarzo.
HS,
Cristal
de
alta
velocidad
LP, Cristal de baja frecuencia y bajo consumo de potencia.
Al momento de programar un micro se debe especificar que tipo de oscilador se
usa.
Internamente la frecuencia del oscilador es dividida por 4, as que si temeos un
oscilador de 4 MHz, la frecuencia de trabajo es de 1 MHz, por lo que cada
instruccin
se
ejecuta
cada
1
us.
Aqu utilizaremos un cristal XT de 4 MHz que debe ir acompaado de dos
condensadores:
Reset.
El PIC 16F84A posee un temporizador interno conectado al pin de reset, que
funciona cuando se da alimentacin al microcontrolador. Esto hace que al
encender el sistema el microcontrolador quede en reset por un tiempo mientras se
estabilizan todas las seales del circuito. Para tener control sobre el reset se
utiliza el siguiente circuito:
En lnea
Micros-Designs
Suky
Estructura interna del Microcontrolador
Moderador
Respuesta #2 : 05 de Febrero de 2009, 20:20:56
es
DsPIC33
Estructura
interna
del
Microcontrolador.
Arquitectura del PIC, existen dos arquitecturas, la clsica de Von Neumann y la
Desconec arquitectura Harvard, esta ultima es la que usan los PICs. Dispone de dos
tado
memorias independientes, una que contiene solo instrucciones y la otra solo
contiene datos. Ambas disponen de sus respectivos buses de acceso y es posible
Sexo:
realizar operaciones de acceso simultneamente en ambas.
Argenti
na
Mensajes:
6741
Con
Qt...
Memoria
del
programa.
Aqu almacenamos nuestro programa o cdigo que debe ejecutar, en el PIC16F84A
es FLASH, es rpida, de bajo consumo y alta capacidad de almacenamiento. Se
divide en 2048 posiciones, pero este PIC solo tiene implementadas 1024 posiciones,
de 0x00 hasta 0x3FF.
Algo que se debe tener en cuenta es la pila o Stack, que consta de 8 posiciones,
cada posicin contiene la direccin y datos de la instruccin que se esta ejecutando,
as cuando se ejecuta una llamada call o una interrupcin, el PC sabe donde
regresar. (Limitar las llamadas anidadas)
ltima modificacin: 08 de Febrero de 2009, 01:08:57 por Suky
Micros-Designs
Suky
Moderadores
DsPIC33
Primer Programa
Respuesta #3 : 05 de Febrero de 2009, 20:22:06
En lnea
Con
Qt...
2.
list p=16F84A
3.
#include P16F84A.inc
CP: Activando este fuse tendremos la garanta de que el cdigo que escribamos
en el PIC no pueda ser ledo por otra persona, para que no nos lo copien,
modifiquen, etc. (Code Protection). Esto no impide que el PIC funcione como
siempre, ni que no se pueda sobrescribir su contenido
Cdigo
GeSHi (asm):
1.
__CONFIG
2.
Led
equ
0
; Definimos Led como el bit
cero de un registro, en este caso PORTB.-
3.
Pulsador equ
0
; Definimos Pulsador como el bit
0, en este caso sera para PORTA
Configuracin
de
puertos.
Para
la
configuracin
necesitamos
los
siguientes
registros:
STATUS > 0x03; PORTA > 0x05; PORTB > 0x06; TRISA > 0x86 y TRISB >
0x86.
Por defecto los puertos quedan configurados como entradas de datos y si se
quiere cambiar hay que configurarlos. Esto se realiza con los registros TRISA y
TRISB, teniendo en cuenta que si se asigna un cero (0) a un pin, quedara como
salida y si se asigna un uno (1), quedara como entrada.
En nuestro caso se necesita colocar TRISA igual a 11111 (o se puede dejar por
default) y TRISB 11111110. Ahora bien, cuando el PIC arranca se encuentra en el
Banco 0, TRISA y TRISB se encuentran en el Banco 1, entonces debemos
cambiar de Banco. Esto se realiza con el bit RP0 del registro STATUS. Si este se
pone un cero a RP0, estaremos en el Banco 0. Si se coloca un uno, estaremos en
el
Banco
1.
Registro W: es el registro ms importante que tiene el microcontrolador y es
denominado
ACUMULADOR.
Cdigo
GeSHi (asm):
1.
2.
Reset
org
0x00
3.
goto
4.
org
0x05
bsf
STATUS,RP0
5.
Inicio
Banco 1.-
Pasamos
de
Banco
6.
movlw
b'11111'
7.
movwf
TRISA
; Cargo en TRISA.-
8.
movlw
b'11111110'
9.
movwf
TRISB
10.
bcf
STATUS,RP0
11.
bcf
PORTB,Led
; Comienza apagado.-
3.
Bucle
logico.-
Led.-
goto
btfsc
Apagar
4.
bsf
PORTB,Led
Encendemos Led.-
5.
goto
Bucle
condicion del Pulsador.-
Esta
Testeamos
logico,
nuevamente
la
6.
7.
8.
Apagar
bcf
PORTB,Led
goto
Bucle
condicion del Pulsador.-
;Apagamos Led.;
Testeamos
nuevamente
la
9.
10.
end
En lnea
Micros-Designs
Suky
Moderadores
DsPIC33
Desconecta
do
1.
Sexo:
Argentina
GeSHi (asm):
2.
Mensajes: 3.
6741
list p=16F84A
Con
#include P16F84A.inc
4.
__CONFIG
5.
6.
Led
equ
Pulsador equ
0
; Definimos Pulsador como el bit
0, en este caso sera para PORTA
8.
9.
Reset
org
0x00
10.
goto
11.
org
0x05
bsf
STATUS,RP0
12.
Inicio
Banco 1.-
Pasamos
de
Banco
13.
movlw
b'11111'
14.
movwf
TRISA
; Cargo en TRISA.-
15.
movlw
b'11111110'
16.
movwf
TRISB
17.
bcf
STATUS,RP0
18.
bcf
PORTB,Led
; Comienza apagado.-
19.
20.
Bucle
logico.-
21.
Led.-
goto
btfsc
Apagar
22.
bsf
PORTB,Led
Encendemos Led.-
23.
goto
Bucle
condicion del Pulsador.-
Esta
Testeamos
logico,
nuevamente
la
24.
25.
Apagar
bcf
PORTB,Led
26.
goto
Bucle
condicion del Pulsador.-
;Apagamos Led.;Testeamos
nuevamente
la
27.
28.
end
Desconecta
do
Sexo:
Argentina
Mensajes:
6741
Ciclo
de
maquina:
Con
Qt... btfss,
btfsc,
return,
etc)
que
necesitan
dos
ciclos
maquina.
Demora_xxus
2.
movlw
duracin (1)
3.
movwf
4.
5.
0xXX
Contador
Repeticion
sale
Decfsz Contador
; Decrementa contador y si es cero
(1 si no sale, 2 si sale)
6.
goto
7.
return
Repeticion
; No es 0, repetimos (2)
; Regresamos de la subrutina (2)
Entre parntesis se muestra el nmero de ciclos que demora cada instruccin.De manera que el nmero de ciclos de instruccin Tsub consumidos por la rutina,
incluyendo
los
2
ciclos
de
la
llamada
(CALL)
sern
Tsub = [2 + 1 + 1 + (0xXX - 1)*(1 + 2) + 2 + 2] ciclos = (3*0xXX + 5) *Tcy
Donde Tcy es la duracin en segundos de un ciclo de instruccin. Utilizando un
oscilador de 4 MHz la mayor duracin posible es de 770 us, con 0xXX = 0xFF.Demoras
mediante
Lazos
anidados
Para lograr demoras de mayor duracin deben utilizarse lazos anidados, poniendo
un lazo de demora dentro de otro.
Cdigo
GeSHi (asm):
1.
Demora_xx
2.
movlw
0xXX
; (1)
3.
movwf
Contador1
; (1)
4.
Repeticion1
5.
movlw
0xYY
; (1)
6.
movwf
Contador2
; (1)
7.
Repeticion2
8.
decfsz Contador2,1
; (1 si no sale, 2 si sale)
9.
goto
; (2)
10.
decfsz Contador1,1
; (1 si no sale, 2 si sale)
11.
goto
; (2)
12.
return
Repeticion2
Repeticion1
; (2)
La
duracin
de
esta
rutina
en
ciclos
de
reloj
ser
Tsub = 2 + 1 + 1 + (0xXX)*[1 + 1 + (0xYY - 1)*(1 + 2) + 2 + 1 + 2] + [1 + 1 +
(0xYY
1)*(1
+
2)
+
2
+
2
+
2]
ciclos
Lo
cual
se
puede
simplificar
como
sigue
Tsub
=
[0xXX*((0xYY
1)*3
+
7)
+
5]
Tcy
En este caso el mximo que se puede conseguir es de aprox. 196 milisegundos.Bueno ahora que se entiende como se realizan las demoras, les adjunto un
programita que obtiene el cdigo necesario para una pausa, ingresando el valor
de la misma y la frecuencia del oscilador utilizado. ltima modificacin: 20 de Junio de 2009, 14:55:17 por Suky
En lnea
Micros-Designs
Suky
Moderadores
DsPIC33
Desconecta
do
Sexo:
Argentina
Mensajes:
6741
Con
Qt...
Cdigo
GeSHi (asm):
1.
2.
list p=16F84A
3.
#include P16F84A.inc
4.
__CONFIG
5.
6.
7.
Contador1 equ
0x0C
;
memoria RAM (GPR) para guardar
Seleccionamos
posicion
en
la
8.
9.
Contador2 equ
0x0D
Led
equ
0
; Definimos Led como el bit
cero de un registro, en este caso PORTB.-
10.
Pulsador equ
0
; Definimos Pulsador como el bit
0, en este caso sera para PORTA
11.
12.
Reset
org
0x00
13.
goto
14.
org
0x05
bsf
STATUS,RP0
15.
Inicio
Banco 1.-
16.
movlw
Pasamos
b'11111'
de
Banco
17.
movwf
TRISA
18.
movlw
b'11111110'
19.
movwf
TRISB
20.
bcf
STATUS,RP0
21.
bcf
PORTB,Led
; Comienza apagado.-
22.
23.
Bucle
logico.-
24.
Led.-
goto
btfsc
Apagar
25.
bsf
PORTB,Led
Encendemos Led.-
26.
call
milisegundos
27.
bcf
Demora_150ms
PORTB,Led
28.
call
Demora_150ms
realizamos un titilo.-
29.
goto
Bucle
condicion del Pulsador
Esta
Mantenemos
logico,
prendido
150
; Apagamos Led
;
Apagamos
durante
Testeamos
150
ms,
Ya
nuevamente
la
30.
31.
Apagar
bcf
PORTB,Led
32.
goto
Bucle
condicion del Pulsador.-
33.
34.
Demora_150ms
;Apagamos Led.;
Testeamos
nuevamente
35.
movlw
0xFF
36.
movwf
Contador1
; Iniciamos contador1.-
37.
la
Repeticion1
38.
movlw
0xC3
39.
movwf
Contador2
; Iniciamos contador2
40.
Repeticion2
41.
decfsz Contador2,1
es 0 sale.-
42.
goto
43.
decfsz Contador1,1
; Decrementa Contador1.-
44.
goto
; Si no es cero repetimos
ciclo.-
Repeticion2
; Decrementa Contador2 y si
Repeticion1
Si
no
es
repetimos
ciclo.45.
return
; Regresa de la subrutina.-
46.
47.
end
En lnea
DsPIC33
Desconec
tado
Sexo:
Un Display es una coleccin de Leds ubicados de forma estratgica. Si se los agrupa
Argenti uniendo sus ctodos ser de CTODO COMUN, o bien agrupando sus nodos, un
na
Display
de
ANODO
COMUN.
Por otro lado estos Leds pueden ser fabricados en forma de Puntos o Segmentos, tal
Mensajes: es as que se encuentran Display de 7 segmentos, como los de la imagen:
6741
Con
Qt...
Tabla
2.
addwf
PCL,f
3.
retlw
Valor0
4.
retlw
Valor1
5.
retlw
Valor2
6.
retlw
Valor3
7.
....
Donde Valor0, Valor1, Valor2... etc. son los valores que queremos almacenar en la
tabla.
La estrategia a seguir para consultar algn valor de la tabla es cargar en el
acumulador (W) la direccin de la tabla donde se encuentra el valor que quieres leer
y
despus
llamar
a
la
subrutina TABLA (con
un CALL).
Advertencia: la carga de W no puede superar el nmero de valores de la tabla, sino
se estar ejecutando una instruccin errnea provocando un mal funcionamiento del
programa.-
2.
list p=16F84A
3.
#include P16F84A.inc
4.
__CONFIG
5.
6.
Contador equ
0x0C
7.
Contador1 equ
demora.-
0x0D
Registro
utilizado
en
8.
Contador2 equ
demora.-
0x0E
Registro
utilizado
en
9.
Pulsador equ
7
bit 7, en este caso sera para PORTB
conteo
10.
;**** Inicio
11.
Reset
12.
goto
Registro
para
almacenar
org
0x00
Inicio
13.
14.
15.
16.
17.
org
0x05
18.
BCD7SEG:
catodo comun
19.
addwf
programa.-
retlw
PCL,1
Se
20.
retlw
b'0111111'
; 0
21.
retlw
b'0000110'
; 1
b'gfedcba'
incrementa
el
para
display
contador
del
22.
retlw
b'1011011'
; 2
23.
retlw
b'1001111'
; 3
24.
retlw
b'1100110'
; 4
25.
retlw
b'1101101'
; 5
26.
retlw
b'1111101'
; 6
27.
retlw
b'0000111'
; 7
28.
retlw
b'1111111'
; 8
29.
retlw
b'1101111'
; 9
30.
clrf
Contador
31.
retlw
b'0111111'
; 0
32.
33.
34.
35.
Inicio
bsf
STATUS,RP0
1.36.
movlw
salida.-
b'10000000'
37.
movwf
TRISB
38.
bcf
STATUS,RP0
39.
movlw
b'0111111'
; Comienza en cero.-
40.
movwf
PORTB
41.
clrf
Contador
42.
43.
Testeo
44.
btfss
45.
goto
Testeo
46.
call
Demora_20ms
47.
btfss
48.
goto
testeando.-
49.
incf
Contador,1
incrementamos contador.-
50.
movfw
Contador
51.
call
BCD7SEG
Se
Alarma,
seguimos
ha
pulsado,
; Llamamos tabla.-
movwf
PORTB
Tabla en PORTB
btfsc
pulsador -**-
Falsa
; pasamos contador a W
52.
53.
PORTB,Pulsador ;
54.
goto
$-1
PORTA,Pulsador.-
Esperamos
que
se
call
Demora_20ms
56.
btfsc
goto
$-4
a testear a que se suelte (**).-
58.
goto
Testeo
el
55.
57.
suelte
59.
60.
61.
Demora_20ms
62.
movlw
0xFF
63.
movwf
Contador1
; Iniciamos contador1.-
64.
Repeticion1
65.
movlw
0x19
66.
movwf
Contador2
; Iniciamos contador2
67.
Repeticion2
68.
decfsz Contador2,1
es 0 sale.-
69.
goto
Repeticion2
; Decrementa Contador2 y si
Si
no
es
repetimos
ciclo.70.
decfsz Contador1,1
; Decrementa Contador1.-
71.
goto
72.
return
ciclo.-
Repeticion1
Si
no
es
cero
repetimos
; Regresa de la subrutina.-
73.
74.
end
BCD7SEG:
catodo comun
2.
addwf
programa.-
3.
0x6F
PCL,1
retlw
Se
b'gfedcba'
incrementa
el
para
display
contador
del
4.
clrf
Contador
5.
retlw
0x3F
En lnea
Micros-Designs
Suky
Moderadore
s
DsPIC33
Desconect
ado
Sexo:
En la programacin de los microcontroladores PIC la mayora de las instrucciones
Argentin emplean direccionamiento directo, pero tambin es posible que operen en un modo
a
de direccionamiento directo. Para el direccionamiento indirecto se emplean dos
registros especiales: el FSR y el INDF (este ultimo no es un registro fsico). El
Mensajes:
registro FSR se emplea para sealar o apuntar a una direccin de la memoria
6741
RAM cuyo contenido puede ser ledo o escrito de forma indirecta empleando
cualquier instruccin que use como operando al registro INDF.
Esta forma de direccionamiento es particularmente til cuando se manejan tablas o
arreglos
de
datos.Con
Qt... Directo
Cdigo
GeSHi (asm):
vs
Indirecto.
1.
; DIRECTO:
2.
3.
MyRegistro
equ
0x10
; Ubicado en 0x10.-
4.
5.
6.
movlw
0x8A
7.
movwf
MyRegistro
; MyRegistro = 0x8a.-
8.
9.
10.
movfw
MyRegistro
MyRegistro a W.-
PORTB.-
movwf
PORTB
Movemos
Por
el
ejemplo,
valor
lo
que
tenga
cargamos
en
11.
12.
; INDIRECTO:
13.
14.
movlw
0x10
FSR
movlw
0x8A
movwf
valor 0x8A.-
INDF
15.
movwf
en 0x10.-
16.
17.
Cargamos
registro
direccionado
con
el
18.
19.
20.
21.
movwf
en 0x10.-
0x10
FSR
22.
movfw
INDF
seleccionado a W.-
23.
movwf
PORTB
2.
list p=16F84A
3.
#include P16F84A.inc
4.
__CONFIG
5.
6.
7.
Contador equ
0x0C
la memoria RAM (GPR) para guardar
; Seleccionamos posicin en
demora.-
8.
Contador1 equ
demora.-
0x0D
9.
Contador2 equ
0x0E
10.
Pulsador equ
7
bit 0, en este caso ser para PORTA
registro
Registro
utilizado
utilizado
12.
Reset
14.
org
0x00
en
11.
13.
para
15.
goto
Inicio
16.
17.
18.
Inicio
19.
bsf
STATUS,RP0
20.
clrf
TRISB
21.
bcf
STATUS,RP0
22.
Config_Tabla
23.
INDF
PORTB
; Mostramos el CERO.-
call
7 segmentos.movfw
el CERO.-
24.
movwf
25.
26.
Bucle
27.
call
Demora_190ms
28.
incf
FSR,1
movlw
0x1A
codigo para mostrar "10",
29.
30.
subwf
FSR,0
apunta a 0x10--> "0".-
Consulamos
31.
btfss
STATUS,Z
32.
goto
33.
movlw
0x10
34.
movwf
FSR
0.-
35.
si
se
pide
; Si reseteo puntero.;
Muestro_Display
36.
movfw
INDF
37.
movwf
PORTB
; Lo cargo en PORTB.-
FSR.-
Leo
Registro
que
apunta
38.
goto
Bucle
; Continuo conteo.-
39.
40.
41.
42.
Demora_190ms
43.
movlw
0xFF
44.
movwf
Contador1
; Iniciamos contador1.-
45.
Repeticion1
46.
movlw
0xFF
47.
movwf
Contador2
; Iniciamos contador2
48.
Repeticion2
49.
decfsz Contador2,1
es 0 sale.-
50.
goto
Repeticion2
; Decrementa Contador2 y si
Si
no
es
repetimos
ciclo.51.
decfsz Contador1,1
; Decrementa Contador1.-
52.
goto
; Si no es cero repetimos
53.
return
ciclo.-
Repeticion1
; Regresa de la subrutina.-
54.
55.
Config_Tabla
56.
movlw
0x10
57.
movwf
FSR
la memoria RAM (GPR).-
58.
movlw
0x3F
59.
movwf
INDF
60.
61.
;....................
incf
FSR,1
62.
movlw
0x06
63.
movwf
INDF
64.
;....................
65.
incf
FSR,1
66.
movlw
0x5B
67.
movwf
INDF
68.
;....................
69.
incf
FSR,1
70.
movlw
0x4F
71.
movwf
INDF
72.
;....................
73.
incf
FSR,1
74.
movlw
0x66
75.
movwf
INDF
76.
;....................
77.
incf
FSR,1
78.
movlw
0x6D
79.
movwf
INDF
80.
;....................
81.
incf
FSR,1
82.
movlw
0x7D
83.
movwf
INDF
84.
;....................
85.
incf
FSR,1
86.
movlw
0x07
87.
movwf
INDF
88.
;....................
89.
incf
FSR,1
90.
movlw
0xFF
91.
movwf
INDF
92.
;....................
93.
incf
FSR,1
94.
movlw
0x6F
95.
movwf
INDF
96.
;....................
97.
movlw
0x10
98.
movwf
FSR
99.
return
;
; Direccionamos Registro del CERO.; Cargado los valores, retornamos.-
100.
;...........................................................
.......
101.
end
En lnea
Micros-Designs
Suky
Modera
dores
DsPIC3
3
Desco
nectado
por el microcontrolador, con l administraremos el encendido de cada display y sus
Sexo:
segmentos
(lo
cual
se
hace
por
programa).
Arg Para ejemplificar haremos un contador automtico de 0 a 999:
entina
El hardware necesario es el siguiente:
Mensaj
es:
6741
Con
Qt...
Diagramas de Flujo:
Se observa que el Puerto B se utiliza para enviar los datos a mostrar en cada display,
mientras que por el Puerto A seleccionas el display que mostrar ese dato. Supongamos
que quiero mostrar "231", pues muy fcil, pongo el puerto B en 0000110 (cdigo para
el 1), y activo ahora el 3 transistor por un periodo de tiempo corto, desactivamos este
transistor, cargamos el puerto B con 1001111 y activamos el 2 transistor por un
tiempito, lo mismo hacemos para mostrar 1. Repetimos esta misma secuencia
mientras se quiera mostrar este valor. La secuencia es tan rpida que el observador no
nota el momento en que cambias de display.
Control
de
conteo:
Para realizar el conteo incrementamos continuamente Unidad, cuando est llega a 10,
las reseteamos a 0, e incrementamos en 1 Decena. La misma operacin se realiza con
Decena, al llegar a 10 se lleva a 0 y se incrementa Centena.Cdigo
GeSHi (asm):
1.
2.
list p=16F84A
3.
#include P16F84A.inc
4.
__CONFIG
5.
6.
Unidad
equ
0x0C
equ
0x0D
Guardamos
conteo
unidad
7.
Decena
8.
Centena
equ
0x0E
9.
Contador1 equ
demora.-
0x0F
Registro
utilizado
en
10.
0x10
Registro
utilizado
en
11.
0x11
Contador2 equ
demora.Contador equ
Display.-
Control
de
Refresco
de
12.
13.
MuestroU equ
Display
Para
control
del
14.
Para
control
del
15.
Para
control
del
MuestroD equ
Display
MuestroC equ
Display
16.
17.
18.
Reset
19.
org
0x00
20.
goto
Inicio
21.
22.
23.
24.
25.
org
26.
BCD7SEG
27.
addwf
comun
0x05
PCL,1
Se
incrementa
el
contador
del
programa.28.
DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F
29.
30.
31.
32.
Inicio
33.
bsf
STATUS,RP0
34.
clrf
TRISA
35.
clrf
TRISB
36.
bcf
STATUS,RP0
37.
clrf
PORTA
38.
clrf
Unidad
39.
clrf
Decena
40.
clrf
Centena
41.
goto
displays.-
Actualizo_Display
42.
43.
Bucle
Esta
rutina
multiplexa
los
44.
incf
Unidad,1
; Incremeto Unidad.
45.
movlw
d'10'
46.
subwf
Unidad,0
47.
btfss
STATUS,Z
48.
goto
Actualizo_Display
49.
clrf
Unidad
; Si, reseteo.-
50.
incf
Decena,1
; Incremento Decena.-
51.
movlw
d'10'
Centena
; no es 10
52.
subwf
Decena,0
53.
btfss
STATUS,Z
54.
goto
Actualizo_Display
55.
clrf
Decena
; Si, reseteo.-
56.
incf
Centena,1
; Incremento Centena.-
57.
movlw
d'10'
; Si es 10 Reseteo.-
58.
subwf
Centena,0
59.
btfss
STATUS,Z
60.
goto
Actualizo_Display
61.
clrf
Centena
; No es 10.-
; No es 10.-
; Si, reseto
62.
63.
Actualizo_Display
64.
movlw
d'20'
; Cargo Contador = 20
65.
movwf
Contador
visualizacion del mismo valor
66.
67.
Para
repeticiones
de
Refresco
68.
movfw
para Unidad.-
69.
call
Unidad
BCD7SEG
70.
bcf
PORTA,MuestroC ; Apago Display de Centena, Se entiende
al mirar rutina.-
71.
movwf
PORTB
72.
bsf
73.
call
Demora_5ms
74.
movfw
para Decena.-
75.
call
Decena
BCD7SEG
Obtengo
codigo
Segmentos
76.
bcf
77.
movwf
PORTB
78.
bsf
79.
call
Demora_5ms
80.
movfw
Centena.-
Centena
81.
call
BCD7SEG
82.
bcf
83.
movwf
PORTB
84.
bsf
85.
call
Demora_5ms
86.
decfsz Contador,1
10 veces el ciclo?
; Pregunto si ya se ha repetido
87.
goto
Refresco
; No, repito.-
88.
goto
Bucle
89.
90.
Demora_5ms
91.
movlw
0xFF
92.
movwf
Contador1
; Iniciamos contador1.-
93.
Repeticion1
94.
movlw
0x05
95.
movwf
Contador2
; Iniciamos contador2
96.
Repeticion2
97.
decfsz Contador2,1
0 sale.Repeticion2
; Decrementa Contador2 y si es
98.
goto
99.
decfsz Contador1,1
; Decrementa Contador1.-
100.
goto
Repeticion1
; Si no es 0 repetimos ciclo.-
Si
no
es
cero
repetimos
ciclo.101.
return
; Regresa de la subrutina.-
102.
103.
end
En este ejemplo se mantiene la visualizacin del mismo valor durante aprox. 300 ms,
se puede determinar ya que utilizamos 3 demoras de 5 ms despreciando los ciclos
utilizados en los comandos, que son aprox. 30 (30 us). Entonces por ciclo tenemos 15
ms, y por 20 repeticiones, 300 ms.Al final de este hilo se ha agregado un ejemplo de control de 3 display con el registro
de
desplazamiento
74LS164.
Ejemplo
ltima modificacin: 20 de Junio de 2009, 15:18:26 por Suky
En lnea
Micros-Designs
Suky
Re: Mis primeros programas. Manual PIC16F84A
Moderad
Respuesta #10 : 05 de Febrero de 2009, 20:46:41
ores
DsPIC33 Decodificador
BCD.
Con Qt...
En lnea
Micros-Designs
Suky
Moderadores
DsPIC33
de
las
caractersticas
ms
importante
de
los
Desconecta
do
Sexo:
Argentina
Mensajes:
6741
Con
Qt...
Nota: El nico registro que se salva en la PILA es PC, para preservar algn otro
registro debe ser el propio programa de atencin a la interrupcin el que se
encargue de salvar su estado al inicio de la rutina y de devolverlos al final del
mismo.
Resumiendo, las acciones que se realizan automticamente el microcontrolador y
las que el programador debe tener en cuenta en sus programas son las siguientes:
Cuando se activa una posible causa de interrupcin, el flag
correspondiente se activa. Si el bit de permiso correspondiente est a 1 y el bit de
habilitacin de todas las interrupciones (GIE) est a 1, se produce la interrupcin.
Para evitar que se produzca otra interrupcin mientras se est atendiendo
a otra anterior, el bit GIE se pone a 0.
El valor del PC se guarda en la PILA
El PC se carga con el valor 0x04, que es el vector de interrupciones
El programador, debe comenzar la rutina de atencin a la interrupcin con
un salto a la posicin de memoria donde se encuentra el programa, seguidamente
se guardan todos los registros que puedan ser modificados por esta, seguidamente
si estn habilitadas varias vas de interrupcin, se debe explorar el valor de las
banderas para determinar la causa de la interrupcin.
Dependiendo de la causa de la interrupcin, la rutina de interrupcin se
bifurca a la subrutina correspondiente.
Se deben devolver los valores que tenan los registros antes de producirse
la interrupcin y se deben borrar por software las banderas que indican las
fuentes de las interrupciones, antes del retorno al programa principal.
Cuando se llega a la ltima instruccin de la rutina de interrupcin,
RETURN, se carga el PC con el valor que se guard inicialmente en la PILA y el
bit GIE se pone automticamente a 1.
Bits utilizados.
INTF para RB0/INT, bit 1 de INTCON, si es 1 ocurri interrupcin
externa
RBIF para los pines B4 a RB7, bit 0 de INTCON, si es 1 por lo menos un
pin cambio de estado
T0IF para TMR0, bit 2 de INTCON, si es 1 TMR0 desbordado
EEIF para la EEPROM, bit 4 de EECON1, si es 1 se ha completado
escritura
GIE, bit 7 de INTCON, si es 1 habilita todas las interrupciones
EEIE, bit 6 de INTCON, si es 1 se activa interrupciones de perifricos
T0IE, bit 5 de INTCON, si es 1 int. TMR0 activada
INTE, bit 4 de INTCON, si es 1 int. Externa activada
RBIE, bit 3, si es 1 int. Por RB4 a RB7 activada
Todos estos bits al resetearse o iniciarse el micro se encuentran en 0.
Rutina
de
Servicio
de
Interrupciones:
Primero debes guardar el contenido del registro W, el problema de mover W a
otro registro (haciendo uso de movf) es que esta instruccin corrompe la bandera
Z, modificando el registro de STATUS. Segn la hoja de datos otorgada por
Microchip, en uno de sus apartados recomienda una secuencia de cdigo que
permite guardar y restaurar los registros sin modificarlos.
Cdigo
GeSHi (asm):
1.
2.
3.
Inicio_ISR
4.
movwf
5.
swapf
STATUS, W
registro STATUS.-
;Invertimos
6.
movwf
temporal.-
7.
STATUS_Temp
los
nibles
del
8.
ISR
; Atendemos la interrupcin.-
9.
10.
Fin_ISR
11.
swapf
STATUS_Temp.-
STATUS_Temp,W
Invertimos
lo
nibles
de
12.
movwf
13.
STATUS
swapf
W_Temp, f
;
guardamos en el mismo registro.-
Invertimos
los
nibles
lo
14.
15.
retfie
; Salimos de interrupcin.-
En lnea
Micros-Designs
Suky
Moderadores
DsPIC33
Desconecta
do
Sexo:
Argentina
Mensajes:
6741
Con
Qt...
El
modo
Temporizador
En el modo temporizador la seal de reloj que controla el incremento del registro
TMR0 es la frecuencia Fcy = Fosc/4, la cual puede ser dividida opcionalmente
por el preescalador si as se desea. Como se puede ver en la figura anterior, este
modo es seleccionado al limpiar el bit T0CS (OPTION_REG<5>). En este
modo, el contenido del registro TMR0 se incrementar a la frecuencia Fcy
dividida de acuerdo al preescalador, sin embargo, si se realiza una escritura al
registro TMR0, su incremento es inhibido por los siguientes dos ciclos de
instruccin
(Tcy).
El
modo
Contador
En el modo contador, la seal que controla los incrementos del registro TMR0 es
una seal externa que proviene de la patita T0CKI. En la figura anterior se puede
ver que este modo se selecciona poniendo el bit T0CS en alto. Se puede
seleccionar la transicin que provoca los incrementos mediante el bit Timer0
Source Edge Select T0SE (OPTION_REG<4>), limpiando este bit se
selecciona la transicin de subida, mientras que al ponerlo en alto se selecciona la
de
bajada.
Observacin: En este modo, la seal conectada a TOCKI es muestreada durante
los ciclos Q2 y Q4 del reloj interno, por ello es necesario que permanezca en alto
al menos por 2 Tosc ms un pequeo retardo de 20nseg y lo mismo en bajo. (Es
decir, seales demasiado estrechas (rpidas) no podrn ser detectadas).
El
preescalador
El preescalador es un divisor de frecuencia de mdulo seleccionable. Como se
puede ver en la figura anterior, el preescalador est compartido entre el timer0 y
el mdulo Watchdog, sin embargo slo puede conectarse a uno de los dos y esto
se establece mediante el bit PSA (OPTION_REG<3>), as, con este bit en alto
el preescalador es asignado al reloj del Watchdog, mientras que con un nivel bajo
en PSA el preescalador dividir la frecuencia que maneja al Timer 0.
La seleccin del mdulo (valor de divisin de frecuencia) del preescalador se
puede realizar mediante los bits PS2,PS1,PS0 (OPTION_REG<2:0>) de
acuerdo a la siguiente tabla:
PS2 PS1 PS0
Divisor
000
1/2
001
1/4
010
1/8
011
1/16
100
1/32
101
1/64
110
1/128
111
1/256
NOTA: Si se necesita el timer en 1:1 solo hay que asociar el preescaler al
Watchdog.
ltima modificacin: 17 de Mayo de 2009, 16:00:53 por Suky
En lnea
Micros-Designs
Suky
Moderadores
DsPIC33
Desconecta
do
Ejemplo
modo
temporizador.
6741
Con
tendramos:
Cdigo
GeSHi (asm):
1.
2.
list p=16F84A
3.
#include P16F84A.inc
4.
__CONFIG
5.
6.
Contador equ
desbordes de TMR0.-
0x0C
7.
W_Temp
equ
temporalmente W.-
0x0D
8.
STATUS_Temp
temporalmente STATUS
equ
0x0E
9.
Contador
Registro
para
detectar
para
Registro
para
guardar
guardar
10.
Led
equ
0
;
Definimos
como el bit cero de un registro, en este caso PORTB.-
Led
11.
12.
13.
Reset
14.
org
0x00
15.
goto
Inicio
16.
17.
org
0x04
18.
goto
Inicio_ISR
; Atiendo Interrupcion.-
19.
20.
21.
22.
org
0x05
23.
Inicio
24.
bsf
STATUS,RP0
25.
movlw
b'11111110'
26.
movwf
TRISB
27.
movlw
b'00000111'
;
Se
temporizador y preescaler de 1/256.-
selecciona
TMR0
modo
28.
movwf
OPTION_REG
29.
bcf
STATUS,RP0
30.
bcf
PORTB,Led
0x3D
31.
movlw
aprox. 50ms.-
32.
movwf
TMR0
33.
clrf
Contador
; Iniciamos contador.-
34.
movlw
b'10100000'
Habilitamos
GIE
T0IE
movwf
INTCON
36.
37.
Bucle
38.
nop
cualquier otra tarea
39.
goto
Bucle
en un bucle de demora.-
Aqui
el
micro
puede
ejecutar
40.
41.
42.
43.
44.
45.
46.
47.
48.
Inicio_ISR
49.
movwf
50.
swapf
STATUS, W
registro STATUS.-
51.
movwf
temporal.-
STATUS_Temp
;Invertimos
53.
ISR
btfss
55.
goto
valores.-
56.
incf
nibles
del
52.
54.
los
INTCON,T0IF
Fin_ISR
Contador
No,
entonces
restauramos
57.
movlw
4 desbordes
0x04
58.
subwf
Contador,0
59.
btfss
STATUS,Z
60.
goto
61.
clrf
Contador
PORTB,Led
Led.62.
btfss
viseversa.-
63.
goto
Prendo_led
64.
bcf
PORTB,Led
Si
Actualizo_TMR0
obtener una temporizacion de 50 ms.movlw
0x3D
67.
movwf
TMR0
68.
bcf
INTCON,T0IF
Interrupcion.-
69.
70.
goto
Fin_ISR
apagado,
prendo
; Apago Led.-
65.
66.
esta
Actualizo
TMR0
para
; d'61'
Borro
bandera
de
control
de
nibles
de
; Restauro valores.-
Prendo_led
71.
bsf
PORTB,Led
72.
goto
Actualizo_TMR0
; prendo Led.-
73.
74.
Fin_ISR
75.
swapf
STATUS_Temp.-
76.
77.
movwf
STATUS_Temp,W
lo
STATUS
swapf
W_Temp, f
;
guardamos en el mismo registro.-
78.
Invertimos
Invertimos
los
nibles
lo
79.
80.
retfie
; Salimos de interrupcin.-
;..........................................
81.
82.
end
Una
ayuda
adicional
El programita presentado en el primer post, tiene una utilidad que nos ayudar en
el clculo del preescaler y valor inicial del Timer para obtener una temporizacin
deseada, aparte de generar el cdigo.
En lnea
Micros-Designs
Suky
Moderadores
DsPIC33
Desconecta
do
Ejemplo
modo
contador.
El siguiente programa realiza el conteo del nmero de veces que produce una
transicin de bajo a alto en la patita T0CKI. El valor del contador se incrementar
Sexo:
una vez por cada dos transiciones, y al detectarse 10 cambiamos el estado del
Argentina Led conectado a RB0.
Mensajes:
6741
Con
Qt...
Diagrama de Flujo:
Cdigo
GeSHi (asm):
1.
2.
list p=16F84A
3.
#include P16F84A.inc
4.
__CONFIG
5.
6.
Contador equ
desbordes de TMR0.-
0x0C
7.
W_Temp
equ
temporalmente W.-
0x0D
8.
STATUS_Temp
temporalmete STATUS
equ
0x0E
equ
Contador
Registro
para
detectar
para
Registro
guardar
para
guardar
9.
10.
Led
Definimos
13.
Reset
14.
org
0x00
15.
goto
Inicio
16.
17.
org
0x04
18.
goto
Inicio_ISR
; Atiendo Interrupcion.-
19.
20.
21.
22.
org
0x05
23.
Inicio
24.
bsf
STATUS,RP0
25.
movlw
b'11111110'
26.
movwf
TRISB
27.
movlw
b'00100000'
;
Contador, transicion positiva
Se
selecciona
TMR0
28.
movwf
OPTION_REG
; y preescaler de 1/2.-
29.
bcf
STATUS,RP0
30.
bcf
PORTB,Led
31.
movlw
0xFB
10 pulsos en RA4/TOCKI.-
32.
movwf
movlw
b'10100000'
(interrupcin del TMR0)
movwf
TMR0
33.
34.
modo
INTCON
Habilitamos
GIE
T0IE
35.
36.
Bucle
37.
nop
cualquier otra tarea
38.
goto
Bucle
en un bucle de demora.-
Aqui
el
micro
puede
ejecutar
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Inicio_ISR
50.
movwf
51.
swapf
STATUS, W
registro STATUS.-
52.
movwf
temporal.-
STATUS_Temp
;Invertimos
54.
ISR
btfss
56.
goto
valores.-
57.
btfss
nibles
del
53.
55.
los
INTCON,T0IF
Fin_ISR
PORTB,Led
No,
Si,
entonces
Controlamos
restauramos
Led.Si
esta
goto
Prendo_led
59.
bcf
PORTB,Led
; Apago Led.-
60.
Actualizo_TMR0
contar 10 pulsos en RA4/TOCKI.-
61.
movlw
0xFB
62.
movwf
TMR0
63.
bcf
INTCON,T0IF
Interrupcion.-
64.
65.
goto
Fin_ISR
; d'251'
Borro
bandera
de
control
de
nibles
de
; Restauro valores.-
Prendo_led
66.
bsf
PORTB,Led
67.
goto
Actualizo_TMR0
; prendo Led.-
68.
69.
Fin_ISR
70.
swapf
STATUS_Temp.-
71.
movwf
STATUS_Temp,W
swapf
W_Temp, f
;
guardamos en el mismo registro.swapf
W_Temp,W
y lo guardamos en W.-
74.
75.
retfie
lo
STATUS
72.
73.
Invertimos
Invertimos
los
nibles
lo
; Salimos de interrupcin.-
;..........................................
76.
77.
end
En lnea
Suky
Moderadores
DsPIC33
Desconecta
do
Sexo:
Argentina Para el control de la interrupcin externa se necesitan dos bits ms, ellos son
RPBU (OPTION_REG<7>), que activa o desactiva las resistencias Pull-Up
Mensajes:
internas del PORTB, en caso de que el dispositivo conectado al puerto sea de
6741
colector abierto y el ms importante INTEDG (OPTION_REG<6>), si esta en
1, la interrupcin se genera por flanco ascendente, y en 0, la interrupcin se
genera
por
flanco
descendente.Para mostrar su uso haremos un ejemplo sencillo que muestre como se configura,
el cual al presionar un pulsador conectado a RB0 cambiar el estado de un led
Con
Qt... conectado a RB1, para ello configuramos que la interrupcin de genere por
flanco ascendente:
Diagrama de Flujo:
Cdigo
GeSHi (asm):
1.
2.
list p=16F84A
3.
#include P16F84A.inc
4.
__CONFIG
5.
6.
Contador1 equ
0x0C
7.
Contador2 equ
0x0D
8.
9.
Pulsador equ
10.
Led
; pin RB1
; pin RB0
equ
11.
12.
13.
Reset
14.
org
15.
goto
16.
0x00
Inicio
17.
org
18.
goto
0x04
; Atiendo Interrupcion.-
ISR
19.
20.
21.
22.
org
programa.-
23.
0x05
Origen
del
STATUS,RP0
Pasamos
de
codigo
de
Inicio
24.
bsf
Banco 1.-
25.
movlw
salida.-
b'11111101'
RB0
como
entrada
Banco
RB1
como
26.
movwf
TRISB
27.
movlw
b'01000000'
28.
movwf
OPTION_REG
29.
bcf
STATUS,RP0
30.
bcf
PORTB,Led
31.
movlw
b'10010000'
Habilitamos
GIE
INTE
movwf
INTCON
33.
34.
Bucle
35.
nop
36.
goto
;
Bucle
37.
38.
;.............................................
39.
40.
41.
ISR
42.
btfss
INTCON,INTF
Consultamos
si
es
por
RB0.43.
retfie
interrupcin.-
44.
call
Demora_20ms
45.
btfss
PORTB,Pulsador
goto
salimos.-
Fin_ISR
47.
PORTB,Led
48.
goto
49.
bcf
50.
goto
51.
Salimos
de
; Comprueba si es rebote.-
46.
btfss
apagamos.-
No,
Es
Si
rebote,
esta
entonces
prendido,
lo
Prender_Led
PORTB,Led
; Apagamos Led
PORTB,Led
; Encendemos Led
INTCON,INTF
Fin_ISR
Prender_Led
52.
bsf
53.
Fin_ISR
54.
bcf
bandera.-
Limpiamos
55.
retfie
interrupcin.-
56.
;..........................................
57.
58.
Demora_20ms
Salimos
59.
movlw
0xFF
60.
movwf
Contador1
; Iniciamos contador1.-
61.
de
Repeticion1
62.
movlw
0x19
63.
movwf
Contador2
; Iniciamos contador2
64.
Repeticion2
65.
decfsz Contador2,1
es 0 sale.-
66.
goto
Repeticion2
; Decrementa Contador2 y si
Si
no
es
repetimos
ciclo.67.
decfsz Contador1,1
; Decrementa Contador1.-
68.
goto
; Si no es cero repetimos
69.
return
ciclo.-
Repeticion1
; Regresa de la subrutina.-
70.
71.
end
En lnea
Suky
Moderado
res
DsPIC33
Descon
ectado
Sexo:
Aprovecharemos esta interrupcin para detectar cuando se ha presionado una tecla de
Argen un Teclado Matricial. Un teclado matricial es un simple arreglo de botones
tina
conectados en filas y columnas, de modo que se pueden leer varios botones con el
mnimo nmero de pines requeridos. Un teclado matricial 43 solamente ocupa 4
Mensajes: lneas de un puerto para las filas y otras 3 lneas para las columnas, de este modo se
6741
pueden leer 12 teclas utilizando solamente 7 lneas de un microcontrolador.
Para detectar la tecla presionada se utilizara el siguiente hardware:
Con Qt...
Configuraremos RB0 a RB3 como salida y las colocaremos a nivel bajo. RB4 y RB7
configuradas como entradas, y en estado normal (sin presin de teclas) estarn a nivel
alto. Al presionar una tecla se conecta una fila con una columna, se produce un
cambio de nivel en alguna de las columnas (De nivel alto a bajo), y se genera la
interrupcin. Para detectar que tecla se ha presionado, se colocan RB0 a RB3 a nivel
alto, y se pasan a nivel bajo de a una por vez, detectando si se produce algn cambio
en las columnas.
Se utiliza una variable que se incrementa con la cuenta de las teclas revisadas, de este
modo al detectar una pulsacin el valor de la cuenta ser el valor de la tecla
presionada. Si al final no se presion ninguna tecla la variable se pone a cero y la
cuenta
vuelve
a
comenzar.
En nuestro ejemplo representaremos la tecla presionada en forma binaria con leds
conectados
al
puerto
A.
Diagrama de Flujo:
Cdigo
GeSHi (asm):
1.
2.
list p=16F84A
3.
#include P16F84A.inc
4.
__CONFIG
5.
6.
7.
NTecla
equ
0x0C
memoria RAM (GPR) para guardar
W_Temp
equ
0x0D
; Seleccionamos posicin en la
W.8.
STATUS_Temp
temporalmete STATUS
equ
0x0E
Registro
para
guardar
9.
10.
11.
12.
13.
Reset
14.
org
0x00
15.
goto
Inicio
16.
17.
org
0x04
18.
goto
Inicio_ISR
; Atiendo Interrupcion.-
19.
20.
21.
Inicio
22.
bsf
STATUS,RP0
23.
clrf
TRISA
24.
movlw
b'11110000'
como Entrada.-
25.
movwf
TRISB
26.
bcf
STATUS,RP0
27.
clrf
PORTB
28.
bcf
INTCON,RBIF
Interrupcion.-
29.
movlw
b'10001000'
(interrupcin RB4 a RB7)
30.
movwf
INTCON
Borramos
Habilitamos
bandera
GIE
de
RBIE
31.
clrf
NTecla
32.
33.
Bucle
34.
nop
35.
goto
36.
Bucle
37.
38.
39.
40.
41.
42.
Inicio_ISR
43.
movwf
swapf
STATUS.-
44.
STATUS, W
;Invertimos
45.
STATUS_Temp
movwf
temporal.-
Guardamos
46.
47.
ISR
los
nibles
STATUS
en
del
registro
un
registro
48.
btfss
INTCON,RBIF
49.
goto
Fin_ISR
50.
call
presionada
Tecla_Presionada
51.
movfw
NTecla
52.
movwf
PORTA
Se
detecta
que
tecla
53.
54.
Fin_ISR
fue
55.
swapf
STATUS_Temp.-
56.
movwf
STATUS_Temp,W
Invertimos
nibles
de
STATUS
57.
swapf
W_Temp, f
;
guardamos en el mismo registro.-
58.
swapf
W_Temp,W
lo guardamos en W.-
59.
lo
retfie
Invertimos
los
nibles
lo
; Salimos de interrupcin.-
60.
61.
62.
63.
64.
Tecla_Presionada
65.
clrf
NTecla
66.
incf
NTecla,1
67.
movlw
b'00001110'
68.
movwf
PORTB
; de la Puerta B
69.
nop
70.
Test_Columnas
71.
btfss
PORTB,4
; Primera columna = 0
72.
goto
Suelta_tecla
73.
incf
NTecla,1
74.
btfss
PORTB,5
; Segunda columna = 0
75.
goto
Suelta_tecla
76.
incf
NTecla,1
77.
btfss
PORTB,6
; Tercera columna = 0
78.
goto
Suelta_tecla
tecla.
tecla.
79.
incf
tecla.
NTecla,1
80.
81.
; btfss
PORTB,7
; Cuarta columna = 0
82.
; goto
Suelta_tecla
83.
; incf
NTecla,1
; Si no tecla pulsada,incrementa n
Tecla.
84.
85.
Ultima_tecla
86.
btfss
PORTB,3
filas?
87.
goto
Null_tecla
presionado ninguna.-
88.
bsf
a 1 Bit C
STATUS,C
89.
rlf
PORTB,1
rotacin a izqda.
90.
goto
asi
la
Fila
pasa
con
la
Test_Columnas
91.
92.
Null_tecla
93.
clrf
NTecla
94.
bcf
INTCON,RBIF
Interrupcion.-
95.
clrf
otra tecla.-
96.
PORTB
return
Borramos
bandera
de
; y regresa.
97.
98.
Suelta_tecla
99.
100.
; y reactivaciones de tecla
101.
Espera1
102.
btfss
PORTB,4
103.
goto
Espera1
; vuelve a esperar.
104.
Espera2
105.
btfss
PORTB,5
106.
goto
Espera2
; vuelve a esperar.
107.
Espera3
108.
btfss
PORTB,6
109.
goto
Espera3
; vuelve a esperar.
110.
Espera4
111.
btfss
PORTB,7
112.
goto
Espera4
; vuelve a esperar.
113.
114.
bcf
INTCON,RBIF
Interrupcion.-
115.
clrf
otra tecla.-
PORTB
116.
return
que hizo la llamada.
117.
118.
Borramos
bandera
de
;..........................................
end
movfw
NTecla
2.
call
Tabla_TMatricial
3.
4.
5.
Tabla_TMatricial
6.
7.
"#"
addwf
PCL,1
DT
"1","2", "3", "4", "5", "6", "7", "8", "9", "*", "0",
En lnea
Micros-Designs
Suky
Moderador
es
DsPIC33
Desconec
tado
Sexo:
Descripcin: La pantalla de cristal liquido o LCD (Liquid Crystal Display) es un
Argenti dispositivo Controlado de visualizacin grafico para la presentacin de caracteres,
na
smbolos o incluso dibujos (en algunos modelos). En este caso dispone de 2 filas
de 16 caracteres cada una y cada carcter dispone de una matriz de 5x7 puntos
Mensajes: (pixels), aunque los hay de otro nmero de filas y caracteres. Este dispositivo esta
6741
gobernado internamente por un microcontrolador Hitachi 44780 y regula todos los
parmetros de presentacin, este modelo es el mas comnmente usado y la
informacin que se adjunta se basar en el manejo de este u otro LCD compatible.
Conexin del modulo LCD al PIC16F84A mediante bus de 4 bits.
Con
Qt...
#DEFINE LCD_E
LCD_PORT_Control,E
macro
ARGUMENTO1,
ARGUMENTO2,
ETC
TEXTO
TEXTO...
endm
De este modo NOMBRE ser sustituido como comando por la secuencia completa
definida tras macro hasta endm, y los sucesivos argumentos sern, a su vez,
sustituidos
dentro
del
texto.
En nuestro ejemplo lo utilizaremos para enviar un carcter o un comando al LCD,
de la siguiente manera:
Cdigo
GeSHi (asm):
1.
LCD_Putc macro
Carac
2.
movlw
Carac
3.
call
LCD_Caracter
4.
endm
5.
LCD_Putd macro
Coman
6.
movlw
Coman
7.
call
LCD_Comando
8.
endm
Rutinas
de
Control:
LCD_Config_puertos: Configura los puertos del PIC para el uso del modulo LCD,
solo
afecta
a
los
pines
utilizados.LCD_Init: Inicializa el mdulo LCD para su correcto funcionamiento. Es necesario
ejecutar esta subrutina al principio de los programas que vayan a utilizar la
visualizacin
mediante
LCD.
LCD_Bandera: Explora el estado de la bandera Busy (ocupado) del mdulo LCD y
espera que termine cualquier comando previo antes de volver a la rutina que le
llamo.LCD_Enable: Habilita el mdulo LCD durante 2us para recepcin de datos o
envo.LCD_Comando: Configura mdulo LCD para recibir un comando mediante rutina
LCD_Envio_Data.LCD_Caracter: Configura mdulo LCD para recibir un carcter mediante rutina
LCD_Envio_Data.LCD_Envio_Data: Enva dato al LCD, Cargando el nible alto y luego el nible bajo.Nota: Observar que las lneas de control y bus de datos es fcilmente modificable
en Declaracin de bits para control LCD y Declaracin de Bytes del LCD.
En lnea
Micros-Designs
Suky
Moderadore
s
DsPIC33
Desconect
Cdigo
ado
GeSHi (asm):
Sexo:
1.
Argentin
a
2.
Mensajes: 3.
6741
#include P16F84A.inc
4.
5.
__CONFIG
Con
Qt...
6.
;///////////////////////////////////////////////////////////
////////
;**** Declaracin de Registros ****
7.
LCD_Dato
equ
para guardar dato a enviar al LCD
0x0C
;registro
8.
Loop
equ
para inicializacion del LCD
0x0D
;registro
9.
Contador1
para demoras
0x0E
;registro
equ
10.
Contador2 equ
demoras
0x0F
;registro
11.
12.
RS
equ
13.
RW
equ
14.
15.
BACK
equ
17.
D4
equ
18.
D5
equ
19.
D6
equ
20.
D7_BF
equ
21.
22.
LCD_PORT_Control equ
equ
para
16.
0x05
del LCD
23.
LCD_PORT_Data
de Datos al LCD
equ
0x06
24.
LCD_TRIS_Control equ
0x85
; TRISA
25.
LCD_TRIS_Data
26.
27.
LCDLinea1 equ
0x80
28.
LCDLinea2 equ
0xC0
29.
LCDClr
cursor a Inicio
equ
equ
30.
LCDInicio equ
cambios
0x86
0x01
0x02
PORTB
para
envio
; TRISB
Borra
pantalla,
31.
LCDInc
equ
0x06
Modo
incrementa
32.
LCDDec
equ
0x04
Modo
decrementa
33.
LCDOn
equ
0x0C
; Pantalla On
34.
LCDOff
equ
0x08
; Pantalla Off
35.
CursOn
cursor On
equ
0x0E
Pantalla
On,
36.
equ
0x0C
Pantalla
On,
Pantalla
On,
cursor
cursor
CursOff
cursor Off
37.
CursBlink equ
parpadeante
38.
CurIzda
izquierda
39.
0x0F
equ
CurDecha equ
40.
DisIzda
izquierda
41.
42.
LCDBus_4_2
lneas, 5x7
0x10
0x14
equ
DisDecha equ
Cursor
; Mueve cursor a la
0x1C
equ
; Mueve Display a
la
Bus
bits,
43.
44.
#DEFINE
LCD_E
LCD_PORT_Control,E
45.
#DEFINE
LCD_RS
LCD_PORT_Control,RS
46.
#DEFINE
LCD_RW
47.
#DEFINE
LCD_D4
LCD_PORT_Data,D4
48.
#DEFINE
LCD_D5
LCD_PORT_Data,D5
49.
#DEFINE
LCD_D6
LCD_PORT_Data,D6
50.
#DEFINE
LCD_D7_BF
LCD_PORT_Data,D7_BF
LCD_PORT_Control,RW
51.
#DEFINE CD_backlight
Control Backligth.-
52.
53.
LCD_Putc macro
movlw
Carac
55.
call
LCD_Caracter
endm
57.
LCD_Putd macro
Carac
54.
56.
LCD_PORT_Control,BACK
Coman
58.
movlw
Coman
59.
call
LCD_Comando
60.
endm
61.
;//////////////////////////////////////////////////////////
62.
63.
org
0x00
64.
goto
Inicio
65.
66.
org
67.
Inicio
68.
call
0x05
LCD_Config_puertos
Configuramos
Puertos
call
LCD_Init
; Inicializamos LCD.-
70.
bsf
LCD_backlight
; Prendemos Backlight.-
71.
LCD_Putd CursBlink
; Cursor Parpadeante.-
72.
LCD_Putc 'T'
; Escribimos en LCD.-
73.
LCD_Putc 'o'
74.
LCD_Putc 'd'
75.
LCD_Putc 'o'
76.
77.
LCD_Putc 'P'
78.
LCD_Putc 'I'
79.
LCD_Putc 'C'
80.
Bucle
81.
nop
82.
goto
Bucle
; Bucle Infinito.-
83.
84.
85.
86.
87.
LCD_Config_puertos
88.
bsf
STATUS,RP0
89.
bcf
LCD_RS
de control y bus como Salidas.-
90.
bcf
LCD_RW
91.
bcf
LCD_E
92.
bcf
LCD_D4
93.
bcf
LCD_D5
94.
bcf
LCD_D6
95.
bcf
LCD_D7_BF
96.
bcf
LCD_backlight
97.
bcf
STATUS,RP0
98.
bcf
LCD_RS
99.
bcf
LCD_RW
100.
bcf
LCD_E
101.
bcf
LCD_D4
102.
bcf
LCD_D5
103.
bcf
LCD_D6
104.
bcf
LCD_D7_BF
105.
bcf
LCD_backlight
106.
return
107.
;...................................
108.
109.
LCD_Init
110.
bcf
STATUS,RP0
111.
movlw
0x03
112.
movwf
Loop
113.
bsf
LCD_D4
114.
bsf
LCD_D5
115.
116.
bsf
LCD_E
117.
call
Demora_5ms
118.
bcf
LCD_E
119.
call
Demora_5ms
120.
decfsz Loop
121.
goto
122.
$-5
123.
bcf
LCD_D4
124.
bsf
LCD_E
125.
call
Demora_5ms
126.
bcf
LCD_E
127.
call
Demora_5ms
128.
129.
movlw
LCDBus_4_2
130.
call
LCD_Comando
131.
132.
movlw
LCDClr
133.
call
LCD_Comando
134.
return
135.
;.........................................
136.
137.
LCD_Bandera
138.
bcf
LCD_RW
139.
bcf
LCD_RS
140.
bcf
LCD_E
141.
bcf
LCD_D4
142.
bcf
LCD_D5
143.
bcf
LCD_D6
144.
bcf
LCD_D7_BF
145.
nop
146.
147.
bsf
bsf
; Banco 1.-
148.
bsf
LCD_D7_BF
estado del LCD.-
Configura
149.
bcf
STATUS,RP0
; Banco 1.-
150.
bsf
LCD_E
151.
nop
152.
btfsc
LCD_D7_BF
153.
goto
$-1
154.
bcf
LCD_E
155.
bsf
STATUS,RP0
; Banco 1.-
156.
bcf
Data.-
LCD_D7_BF
157.
bcf
STATUS,RP0
; Banco 1.-
158.
return
Reconfigura
159.
;.............................
160.
161.
LCD_Enable
162.
bsf
163.
nop
164.
nop
165.
bcf
166.
return
TRIS
TRIS
para
para
recibir
envio
de
LCD_E
LCD_E
167.
;.............................
168.
169.
170.
LCD_Envio_Data
171.
movwf
LCD_Dato
172.
173.
bcf
LCD_D4
; Cargamos un cero.-
174.
btfsc
seguimos.-
LCD_Dato,4
175.
bsf
LCD_D4
176.
bcf
LCD_D5
177.
btfsc
LCD_Dato,5
178.
bsf
LCD_D5
179.
bcf
LCD_D6
180.
btfsc
LCD_Dato,6
181.
bsf
LCD_D6
182.
bcf
LCD_D7_BF
183.
btfsc
LCD_Dato,7
184.
bsf
LCD_D7_BF
185.
call
Data.-
LCD_Enable
186.
187.
LCD_D4
; Cargamos un cero.-
188.
btfsc
seguimos.-
LCD_Dato,0
189.
bsf
LCD_D4
190.
bcf
LCD_D5
191.
btfsc
LCD_Dato,1
192.
bsf
LCD_D5
193.
bcf
LCD_D6
194.
btfsc
LCD_Dato,2
195.
bsf
LCD_D6
196.
bcf
LCD_D7_BF
197.
btfsc
LCD_Dato,3
198.
bsf
LCD_D7_BF
199.
call
Data.200.
LCD_Enable
return
201.
;.............................
202.
203.
LCD_Comando
204.
call
LCD_Bandera
;Controla si el LCD esta en
condiciones de recibir un nuevo dato.205.
bcf
LCD_RW
; Modo escritura.-
206.
bcf
LCD_RS
; Se enviara Comando.-
207.
call
208.
return
209.
;.............................
210.
211.
LCD_Caracter
212.
call
LCD_Bandera
;Controla si el LCD esta en
condiciones de recibir un nuevo dato.213.
bcf
LCD_RW
; Modo escritura.-
214.
bsf
LCD_RS
; Se enviara Caracter.-
215.
call
216.
return
217.
;..............................
218.
219.
Demora_5ms
220.
movlw
0xC8
; 200
221.
222.
movwf
Contador1
; Iniciamos contador1.-
Repeticion1
223.
movlw
0x07
224.
movwf
Contador2
; Iniciamos contador2
225.
Repeticion2
226.
decfsz Contador2,1
es 0 sale.-
; Decrementa Contador2 y si
227.
goto
ciclo.-
228.
Repeticion2
decfsz Contador1,1
229.
goto
ciclo.-
Repeticion1
230.
return
subrutina.-
Si
no
es
repetimos
Regresa
de
la
231.
232.
233.
;...............................
end
Tengo que ser sincero, no logre simularlo con Proteus. Pero con elementos reales,
lo prob en varias configuraciones de lneas de control y bus de datos, por lo que
debera funcionar sin problemas.En lnea
Micros-Designs
Suky
Moderadore
s
DsPIC33
Desconect
ado
Sexo:
Argentin Asociacin de Industrias Electrnicas (EIA) la cual define la interfase mecnica,
a
los pines, las seales y los protocolos que debe cumplir la comunicacin serial. La
Mensajes:
6741
Con
Qt...
Los puertos series son accesibles mediante conectores. La norma RS232 establece
dos tipos de conectores llamados DB-25 y DB-9, machos y hembras. La norma
RS232 se estableci para conectar un ordenador con un modem, por lo que
aparecen muchas patillas en los conectores DB-25 que en otro tipo de aplicaciones
no se utilizan y en las que es mas comn utilizar el conector DB-9.
Cada una de las patillas del conector RS232 tiene una funcin especfica. Patillas
del DB-9:
Los pines que portan los datos son RxD y TxD los dems se encargan de otros
trabajos, el DTR indica que el ordenador esta encendido, DSR que el dispositivo
conectado al puerto esta encendido, RTS que el ordenador al no estar ocupado
puede recibir datos, al revs de CTS que lo que informa es que es el dispositivo el
que puede recibir datos, DCD detecta que existen presencia de datos, etc.
Formato
de
un
byte:
El protocolo establecido por la norma RS232 envia la informacin estructurada en
4
partes:
- Bit de inicio o arranque (START). Es un paso de -12V a +12V, es decir de un
1 a un 0 lgico en la lgica negativa de la norma RS232.
- Bits de datos (Datas) Los bits de datos son enviados al receptor despus del bit
Start. El bit de menos peso LSB es trasmitido primero. Un carcter de datos suele
consistir
en
7
u
8
bits.
- Bit de Paridad (Parity) Dependiendo de la configuracin de la transmisin un
bit de paridad puede ser enviado despus de los bits de datos. Con este bit se suele
descubrir errores en la transmisin, puede dar paridad par o impar.
- Bit de Parada (STOP) la lnea que a -12V despus del ultimo bit enviado, es
decir queda a 1 en lgica negativa de la norma. El protocolo permite 1, 1.5 o 2
bits
de
parada.
MAX
232.
En el mercado hay muchos circuitos integrados que permiten la conversin entre
niveles TTL y niveles RS232. El ms destacado es el transceptor MAX232:
Este convierte los niveles RS232 <+12 y -12> a voltajes TTL <0 y +5> y viceversa
sin requerir mas que una fuente de +5V y un par de capacitores.
www.todopic.com.ar/foros/index.php?topic=24720.0