TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Xelene en 29 de Octubre de 2004, 04:58:00
-
Espero q el primer programa sea el más dificilillo de sacar...
Toi intentando encender un simple LED. Tengo la placa PICDEM PLUS 2 de MICROCHIP, q tiene tres pulsadores (Reset, RA4 y RB0) y 4 LEDS (RB0,RB1,RB2 y RB3). Entonces...
Si quiero encender el LED RB0 pulsando el switch RB0... el trisb,0 lo configuro como entrada, salida??" no hace falta configurarlo??? Y otra cosilla, puedo encender más de un led pulsando el mismo switch????...
Sé q son tonterias... pero es q me estoy estancando aqui..
-
Hola guapa,
No te preocupes, que eso nos ha pasado a todos. Ya verás como pronto te haces una experta de estos cacharritos, y espero que dures en el foro! porque casi casi te diría que soy la única nena que anda por aquí en medio de estos osos con orejas...
espero que te traten bien, conmigo son estupendos.
A ver, con respecto a tu pregunta. Si quieres encender un led en RB0, tienes que configurar ese pin del puerto como salida, y no podrías usar el pulsador que trae la placa en el RB0, porque entonces lo tendrías que configurar como entrada. Una cosa u otra, no hay más tu tia. Para encender ese led, que recuerda debe ser una salida, debes configurar por ejemplo RB4 como entrada, porque hay tienes un pulsador también, no? y así te podría funcionar. Dime, ¿estás con ensamblador? lo digo para ayudarte con el código, si quieres pegarlo aquí y te comentamos cómo se haría exactamente.
Encender más de un led accionando la misma entrada es sencillo. Anda, pon el código y te ayudamos mejor.
-
Asias x tu ayuda Elena
!!! Seguramente seguiré x aki, xq me veo con mil dudas en la cabeza, jejeje y como me ayudais tanto, fijo q sigo ![Vacilando Vacilando]()
Hago el programa en ensamblador si, este es el q acabo de hacer, no lo he compilado ni he hecho na, asi q seguramente tendré errores o simplemente no funcionará, ya me dirás q opinas: (me ahorro la cabecera)
; LIST P=16F84
#INCLUDE <P16F84.INC>
status equ 0x03 ;Registro del estado Aritmético de la ALU
Porta equ 0x05 ;Puerto A
Portb equ 0x06 ;Puerto B
trisa equ 0x85 ;Registro de configuración del Puerto A
trisb equ 0x86 ;Registro de configuración del Puerto B
CONTA equ 0x0C
#define BANK1 bsf status,5 ;Macro para abreviar el BANCO 1
#define BANK0 bcf status,5 ;Macro para abreviar el BANCO 0
org 0 ;Posición 0 de la memoria de programa
INICIO BANK1 ;Seleccion del Banco 1
bcf trisb,0 ;Bit 0 de trisb en "0" RB0 = Salida
bsf trisa,4 ;Bit 4 de trisa en "1" RA4 = Entrada
BANK0 ;seleccion del Banco 0
bcf Portb,0 ;Bit 0 del Puerto B puesto a "0" (lógico). LED OFF
ESPERA btfss Porta,4 ;Lee el interruptor y espera a que sea "1". Han pulsado?
goto ESPERA ;No han pulsado, va a la etiqueta ESPERA
call PULSAR ;Si han pulsado, llama a la etiqueta PULSAR
PULSAR bsf Portb,0 ;Bit 0 del PUERTO B "1". Enciende el LED
btfsc Porta,4 ;Lee el interruptor y espera a que sea "0". Han soltado?
goto PULSAR ;No, va a la etiqueta PULSAR
call ESPERA ;Si, va a la etiqueta ESPERA
end ;fin del programa
-
Hola Xelene:
Dos cosas sobre el programa que pones
1º Aun que no los utilices ,cuando configures un puerto sea A o B es aconsejable que cofigures todo el y no sólo un pin de cada uno.
2º Cuando se trata de comprobar el estado de un pulsador, interruptor, etc. es muy aconsejable el poner algun tipo de retardo, bien por software o bien por Hardware. esto se debe porque al actuar un interruptor, por ejemplo, este no se cierra una sola vez sino que se producen un monton de apertutras y cierres del contacto, es lo que se llama efecto rebote. Es como una pelota que la tiras hacia arriba y al caer se producen unos botes, cada vez menores hasta que se estabiliza, pelota pegada al suelo.
Si no haces esto el micro es muy rápido al leer el estado del pulsador y leera cosasa extreñas(inestables).
Por lo demás creo que está bastante correcto el programa
Un saludo F.
-
Gracias x tu ayuda Fer_TACA
![Giño Giño]()
He hecho algunas modificaciones al programa, haciendo lo que decias en el mensaje anterior, aunq no estoy muy segura si he hecho bien lo del retardo, aqui os dejo el programa, ya me direis si lo he hecho bien o no;
; LIST P=16F84
w equ 0
f equ 1
status equ 0x03 ;Registro del estado Aritmético de la ALU
Porta equ 0x05 ;Puerto A
Portb equ 0x06 ;Puerto B
trisa equ 0x85 ;Registro de configuración del Puerto A
trisb equ 0x86 ;Registro de configuración del Puerto B
CONTA1 equ 0x0C ;Registro del primer contador
CONTA2 equ 0x0D ;Registro del segundo contador
#define BANK1 bsf status,5 ;Macro para abreviar el BANCO 1
#define BANK0 bcf status,5 ;Macro para abreviar el BANCO 0
org 0 ;Posición 0 de la memoria de programa
INICIO BANK1 ;Seleccion del Banco 1
clrf trisb ;Programa el puerto B como Salida
movlw b"00001111" ;
movwf trisa ;Programa el puerto A como Entrada
BANK0 ;seleccion del Banco 0
clrf CONTA1 ;Pone a 0 CONTA1
clrf CONTA2 ;Pone a 0 CONTA2
ESPERA clrf Portb ;Apaga los LEDS borrando el puerto B
btfss Porta,4 ;Lee el interruptor y espera a que sea "1". Han pulsado?
goto ESPERA ;No han pulsado, va a la etiqueta ESPERA
call RETARDO ;Si han pulsado, llama a la rutina RETARDO
PULSAR bsf Portb,0 ;Bit 0 del PUERTO B "1". Enciende el LED
btfsc Porta,4 ;Lee el interruptor y espera a que sea "0". Han soltado?
goto PULSAR ;No, va a la etiqueta PULSAR
call ESPERA ;Si, va a la etiqueta ESPERA
;******************************************************************************************
;ESTA RUTINA GENERA UN RETARDO PARA EVITAR QUE LOS REBOTES QUE GENERA EL PULSADOR AL SER
;PRESIONADO CONFUNDAN AL MICROCONTROLADOR.
;******************************************************************************************
RETARDO decfsz CONTA1,f ;Decrementa CONTA1 y comprueba si es 0
goto RETARDO ;Si no es 0, decrementa CONTA1
decfsz CONTA2,f ;si es 0, decrementa CONTA2
goto RETARDO ;si CONTA2 no es 0 decrementa CONTA1
return ;vuelve al programa principal
end ;fin del programa
-
Hola Xelene:
Respecto al programa que adjuntas me he permitido ponerte un ejemplo de como detecto el estado de un interruptor , pulsador, etc. Dependiendo de lo que quieras realizar los Wait_0 y Wait 1 pueden ir uno delante del otro y al revés.
Wait_0 btfss PORT,4 ;RA4 está a 1?
goto Wait_0 ; NO esperar
call retardo ;Retardo para eliminar rebotes
Wait_1 btfsc PORTA,4 ; RA4 está a 0?
goto Wait_1 ; No esperar
call retardo ;Eliminar rebotes. Ha habido un pulso
.....
Más programa.......
Por otra parte se me olvido comentarte lo siguiente: Co respecto al primer programa que posteaste si pones
#INCLUDE <P16F84.INC> después del LIST P=16F84, entonces no te hace falta poner ningún [color=FF0000][/color]"Equ" refiriendose a los registros del micro. Estos ya están definidos en el archivo P16F84.INC
No te preocupes ninguno nacimos sabiendo y estoy seguro que a todos nos costó el aprender
![Giño Giño]()
![Giño Giño]()
![Giño Giño]()
Un saludo Fermín
-
Ensamblado ok
Programado ok
xo no me hace lo q quiero!!!!! ![Llorica Llorica]()
Conecto la alimentacion y el led está encendido y al pulsar el switch se apaga... cual es el fallo??
-
Xelene, jeje, que no cunda el pánico, anda. Dinos, ¿qué programa has ensamblado? el que te sugirió Fermín o el tuyo del principio?
-
Ta todo controlauuuu!!!!
![Sonrisa Gigante Sonrisa Gigante]()
No problemo
resulta q mis pulsadores estan normalmente abiertos, osea q si no los pulso salen 5 voltios y si los pulso la salida es 0 así q el programa ya sí q sí, ha qdado tal q así:
;******************************************************************************************
; OSC: RC WDT: OFF PWRTE:ON CP:OFF
;******************************************************************************************
;
; LIST P=16F84
w equ 0
f equ 1
status equ 0x03 ;Registro del estado Aritmético de la ALU
Porta equ 0x05 ;Puerto A
Portb equ 0x06 ;Puerto B
trisa equ 0x85 ;Registro de configuración del Puerto A
trisb equ 0x86 ;Registro de configuración del Puerto B
CONTA1 equ 0x0C ;Registro del primer contador
CONTA2 equ 0x0D ;Registro del segundo contador
#define BANK1 bsf status,5 ;Macro para abreviar el BANCO 1
#define BANK0 bcf status,5 ;Macro para abreviar el BANCO 0
org 0 ;Posición 0 de la memoria de programa
goto INICIO ;Comienza el programa despues
org 5 ;del vector de interrupcion
INICIO BANK1 ;Seleccion del Banco 1
clrf trisb ;Programa el puerto B como Salida
movlw b"00001111" ;
movwf trisa ;Programa el puerto A como Entrada
BANK0 ;seleccion del Banco 0
clrf CONTA1 ;Pone a 0 CONTA1
clrf CONTA2 ;Pone a 0 CONTA2
ESPERA clrf Portb ;Apaga los LEDS borrando el puerto B
btfsc Porta,4 ;Lee el interruptor y espera a que sea "0". Han pulsado?
goto ESPERA ;No han pulsado, va a la etiqueta ESPERA
call RETARDO ;Si han pulsado, llama a la rutina RETARDO
PULSAR bsf Portb,0 ;Bit 0 del PUERTO B "1". Enciende el LED
btfss Porta,4 ;Lee el interruptor y espera a que sea "1". Han soltado?
goto PULSAR ;No, va a la etiqueta PULSAR
call ESPERA ;Si, va a la etiqueta ESPERA
;******************************************************************************************
;ESTA RUTINA GENERA UN RETARDO PARA EVITAR QUE LOS REBOTES QUE GENERA EL PULSADOR AL SER
;PRESIONADO CONFUNDAN AL MICROCONTROLADOR.
;******************************************************************************************
RETARDO decfsz CONTA1,f ;Decrementa CONTA1 y comprueba si es 0
goto RETARDO ;Si no es 0, decrementa CONTA1
decfsz CONTA2,f ;si es 0, decrementa CONTA2
goto RETARDO ;si CONTA2 no es 0 decrementa CONTA1
return ;vuelve al programa principal
end ;fin del programa
Gracias Elena, jejeje y gracias Fermin ![Rebotado Rebotado]()
Ya me furrula!!
-
Me alegro mucho!!!
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
y a mi no me des las gracias, que el único que te ha ayudado ha sido Fermín, yo no he hecho na de na..
Pues genial, ahora ya puedes avanzar y hacer un programa que controle el movimiento de un satélite, por ejemplo, además hay no hay rebotes. ![Giño Giño]()
-
Enhorabuena y bienvenida al mundo de los pics
, ya veras como poquito a poco vas haciendo algo más grande.
Fermín![Sonrisa Sonrisa]()