Google Búsqueda personalizada

Regístrate gratis para participar de los foros, o si ya estás registrado haz login.

Encender Leds con 16F877A

comentario del autor Mie Ago 05, 2009 3:47 pm
   
Estoy tratando de salir adelante con un proyecto para una materia. La idea final es hacer una alarma. Lamentablemente en el grupo tenemos casi cero practica con PIC. Estamos tratando de hacer todo de a poco y de a pasos. Nos construimos un programador (el de la pagina de www.pablin.com.ar) para el 16f877. Al principio no grababa, pero ahora si, al menos no da error y al leer el estado del micro luego de grabarlo vemos que tiene algo grabado (supuestamente es correcto, no sabemos si hay forma de chequearlo ya que solo vemos el ASCII dela memoria del PIC).
El programa simplemente pone ell bit cero del port b en 1 (PB0).
al simularlo en el MPLAB se ve bien, podemos observar como cambian de estados los bits del PortB.
Hicimos una placa de prueba donde dejamos unas tiras de pines con todos los puertos a mano. Probamos con un led y no enciende, probamos con el tester y no hay cambio de estado en PB0. Probamos en la pata de PIC directamente y nada. Esta con un xtal de 4Mhz.
Modificamos el programa para que encienda todo el Port B pero tampoco tuvimos resultados.
Chequeamos que la pata de reset este en 5v por las dudas, y la misma se pone a 0v al presionar el boton de reset y luego pasa a 5v.

Estamos muy desconcertados y estamos muy trabados en lo que supuestamente era muy sencillo ...... prender u led (y todavia çnos falta manejar display, teclado y programar menues etc, etc).

Espero alquien nos pueda dar una mano para poder seguir avanzando en nuestro proyecto.

Mil Gracias

daniloarg007

Reputación

asistió a la solución Mie Ago 05, 2009 5:11 pm
   
Ok.
Vamos por pasos.
1)-Suban el codigo fuente que escribieron para chequearlo.-
2)-El esquema de su hardware.-
Otra cosa, esta oscilando?, grabaron bien los parametros de configuracion?
Saludos.-

mammuky

Reputación

comentario del autor Mie Ago 05, 2009 5:46 pm
   
El circuito va adjunto (en los puertos podran ver unas tiras de pines enfrentadas. la idea es colocar jumpers alli de momento. pero medimos incluso en las patas del PortB sobre el PIC directamente)
Respecto a si oscila, si.
Los parametros de configuracion pusimos en el icprog tildado el solo el PWRT y el LVP, no sabemos bien eso como va. En oscilador esta en XT.

El codigo es el que va a continuacion. Ouede tener algun detalle porque en realidad comenzamos con la idea de hacer oscilar el led, pero como pensamos que el problema que no encendia era la velocidad de oscilacion (encendido y apagado) para no perder tiempo de momento buscando algo para hacer demora y poder probar la placa decidimos modificar para que se enciendan los leds y listo. Pero nada .......

LIST p=16F877A
INCLUDE<P16F877A.INC>

ORG 0000H
bsf STATUS,RP0 ;Banco-1
bcf TRISB,0 ;RB0 como salida

bcf TRISB,1
bcf TRISB,2
bcf TRISB,3

bcf STATUS,RP0 ;Banco-0



REPITE ;Etiqueta REPITE


bsf PORTB,0 ;RB0=1 (Enciendo el LED)

bsf PORTB,1
bsf PORTB,2
bsf PORTB,3

goto REPITE ;Salto hasta REPITE

END ;Fin de Programa.

circuito.pdf  (29.77 kb) -

daniloarg007

Reputación

asistió a la solución Mie Ago 05, 2009 6:20 pm
   
Ok.
El programa esta bien.
Tu error es que lo estas grabando con LVP y el programador de pablin no soporta esa configuracion.-
En el Ic-prog destilda eso, grabalo y me contas.-
Saludos.-

mammuky

Reputación

comentario del autor Jue Ago 06, 2009 11:23 am
   
Gracias por tu ayuda.
Te comento lo que me paso.
En principio no encendio nada. Despues lo que probe es destildar todos los bits de configuracion del IC^-Prog y en oscilador poner XT. Lo mismo configure en el MPLAB en Configure>configuration bits. Lo grabe de nuevo y nada. Pero en una de esas probando con el led y la resistencia (entre el pin del puerto y masa) pasandola por los diferentes pines a mano, veo que en uno encendio el led. Era en el pin 3. PEro el pin 0,1 y 2 nada. REsetie y dejando el led agarrado en esa pata y nada. Lo desconecte y probe en otras patas y tenia la 1 y 2 encendidas. Resetie y nada, luego de ir poniendo el led en diferentes patas encendio en la 0,2 y 3. MUY RARO .... al menos para mi.
Hice otro programa para que se enciendan todos los pines de todos los puertos, te lo copio abajo. En el MPLAB se simula bien, lo unico extraño que solo un bit del portA pasa a 1, pero en los otros puerttos pasan todos a uno. Le puse una demora que encontre por ahi en internet para que cambie de estado. En la simulacion va bien. Lo puse en el PIC con la configuracion de bits indicada (todo sin tildar) y nada. No enciende nada!!!.

Lo deje conectado. Al terminar de redactar el mensaje acabo de probar nuevamente por las dudas y nada.
Te copio abajo el codigo

;
list p=16f877a
include "p16f877a.inc"

;conteo equ 0x20 ; lleva conteo binario
PDel0 equ 0x21 ; subrutina
PDel1 equ 0x22 ; subrutina

org 0x00
goto inicio
org 0x05

inicio bsf STATUS,RP0 ; banco 1
bcf STATUS,RP1
clrf TRISA ; porta de salida
clrf TRISB ; portb de salida
clrf TRISC ; portc de salida
clrf TRISD ; portd de salida


;movlw b'00000110' ; porta todo digital
;movwf ADCON1
;clrf TRISA ; porta de salida
bcf STATUS,RP0 ; banco 0
bcf STATUS,RP1

;clrf conteo
contador ;movf conteo,W
;movwf PORTB ; pasa conteo a W

repite bsf PORTA,0
bsf PORTA,1
bsf PORTA,2
bsf PORTA,3
bsf PORTA,4
bsf PORTA,5
bsf PORTA,6
bsf PORTA,7
bsf PORTB,0
bsf PORTB,1
bsf PORTB,2
bsf PORTB,3
bsf PORTB,4
bsf PORTB,5
bsf PORTB,6
bsf PORTB,7
bsf PORTC,0
bsf PORTC,1
bsf PORTC,2
bsf PORTC,3
bsf PORTC,4
bsf PORTC,5
bsf PORTC,6
bsf PORTC,7
bsf PORTD,0
bsf PORTD,1
bsf PORTD,2
bsf PORTD,3
bsf PORTD,4
bsf PORTD,5
bsf PORTD,6
bsf PORTD,7


call DEMORA
;incf conteo
;goto contador


bcf PORTA,0
bcf PORTA,1
bcf PORTA,2
bcf PORTA,3
bcf PORTA,4
bcf PORTA,5
bcf PORTA,6
bcf PORTA,7
bcf PORTB,0
bcf PORTB,1
bcf PORTB,2
bcf PORTB,3
bcf PORTB,4
bcf PORTB,5
bcf PORTB,6
bcf PORTB,7
bcf PORTC,0
bcf PORTC,1
bcf PORTC,2
bcf PORTC,3
bcf PORTC,4
bcf PORTC,5
bcf PORTC,6
bcf PORTC,7
bcf PORTD,0
bcf PORTD,1
bcf PORTD,2
bcf PORTD,3
bcf PORTD,4
bcf PORTD,5
bcf PORTD,6
bcf PORTD,7

call DEMORA

goto repite

; Descripcion: Delay 500000 ciclos
;-------------------------------------------------------------
DEMORA movlw .239 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .232 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 goto PDelL6 ; 2 ciclos delay
PDelL6 goto PDelL7 ; 2 ciclos delay
PDelL7 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------
end

daniloarg007

Reputación

sin valorar Jue Ago 06, 2009 6:23 pm
   
Ok.
Mira te adjunto un hex que enciende secuencialmente leds conectados al puertob.
Grabalo y fijate si anda.
Si to te anda el problema esta en tu programador o en la implementacion de tu hardware.-
Recorda de destildar LVP o sea:
Config Word: 3F39h (todos desmarcados)
Oscilador: XT
Write Enable: Write Off
Probalo y comentame.-
Saludos.-

Sec.rar  (178 kb) -

mammuky

Reputación

sin valorar Jue Ago 06, 2009 6:43 pm
   
ok...

entiendo que estas empezando y no sabes mucho en lo practico...tal vez tu conexion del circuito te esta fallando....
te recomendaria un software para simular tu circuito con el PIC.....buscate o descarga el PROTEUS....

este software te ayudara a simular el PIC sin necesidad de armarlo...podras cargar el codigo fuente en el software y ver como funciona en la simulacion....despues una vez que te funcione en la simulacion con proteus...lo pones a la practica...

y te recuerdo que para cada led tienes que dar un retardo ejemplo....

para encender uno por uno
bsf portb,1
call retardo
bsf portb,2
call retardo
.....
para apagar uno por uno
bcf portb,1
call retardo
bcf portb,2
call retardo

para que enciendan los leds uno por uno...asi como esta en tu programa se encenderan todos a la vez ya que la velocidad del cristal es de 4Mhz o sea 1/4000000 segundos...no podra ser persivido....tendras que darle un retardo en cada encendido del led...

te recomendaria que lo simularas en PROTEUS antes...

saludos...

nogueda

Reputación

solución Jue Ago 06, 2009 10:39 pm
   
daniloarg007 escribió:Gracias por tu ayuda.
Te comento lo que me paso.
En principio no encendio nada. Despues lo que probe es destildar todos los bits de configuracion del IC^-Prog y en oscilador poner XT. Lo mismo configure en el MPLAB en Configure>configuration bits. Lo grabe de nuevo y nada. Pero en una de esas probando con el led y la resistencia (entre el pin del puerto y masa) pasandola por los diferentes pines a mano, veo que en uno encendio el led. Era en el pin 3. PEro el pin 0,1 y 2 nada. REsetie y dejando el led agarrado en esa pata y nada. Lo desconecte y probe en otras patas y tenia la 1 y 2 encendidas. Resetie y nada, luego de ir poniendo el led en diferentes patas encendio en la 0,2 y 3. MUY RARO .... al menos para mi.
Hice otro programa para que se enciendan todos los pines de todos los puertos, te lo copio abajo. En el MPLAB se simula bien, lo unico extraño que solo un bit del portA pasa a 1, pero en los otros puerttos pasan todos a uno. Le puse una demora que encontre por ahi en internet para que cambie de estado. En la simulacion va bien. Lo puse en el PIC con la configuracion de bits indicada (todo sin tildar) y nada. No enciende nada!!!.

Lo deje conectado. Al terminar de redactar el mensaje acabo de probar nuevamente por las dudas y nada.
Te copio abajo el codigo

;
list p=16f877a
include "p16f877a.inc"

;conteo equ 0x20 ; lleva conteo binario
PDel0 equ 0x21 ; subrutina
PDel1 equ 0x22 ; subrutina

org 0x00
goto inicio
org 0x05

inicio bsf STATUS,RP0 ; banco 1
bcf STATUS,RP1
clrf TRISA ; porta de salida
clrf TRISB ; portb de salida
clrf TRISC ; portc de salida
clrf TRISD ; portd de salida


;movlw b'00000110' ; porta todo digital
;movwf ADCON1
;clrf TRISA ; porta de salida
bcf STATUS,RP0 ; banco 0
bcf STATUS,RP1

;clrf conteo
contador ;movf conteo,W
;movwf PORTB ; pasa conteo a W

repite bsf PORTA,0
bsf PORTA,1
bsf PORTA,2
bsf PORTA,3
bsf PORTA,4
bsf PORTA,5
bsf PORTA,6
bsf PORTA,7
bsf PORTB,0
bsf PORTB,1
bsf PORTB,2
bsf PORTB,3
bsf PORTB,4
bsf PORTB,5
bsf PORTB,6
bsf PORTB,7
bsf PORTC,0
bsf PORTC,1
bsf PORTC,2
bsf PORTC,3
bsf PORTC,4
bsf PORTC,5
bsf PORTC,6
bsf PORTC,7
bsf PORTD,0
bsf PORTD,1
bsf PORTD,2
bsf PORTD,3
bsf PORTD,4
bsf PORTD,5
bsf PORTD,6
bsf PORTD,7


call DEMORA
;incf conteo
;goto contador


bcf PORTA,0
bcf PORTA,1
bcf PORTA,2
bcf PORTA,3
bcf PORTA,4
bcf PORTA,5
bcf PORTA,6
bcf PORTA,7
bcf PORTB,0
bcf PORTB,1
bcf PORTB,2
bcf PORTB,3
bcf PORTB,4
bcf PORTB,5
bcf PORTB,6
bcf PORTB,7
bcf PORTC,0
bcf PORTC,1
bcf PORTC,2
bcf PORTC,3
bcf PORTC,4
bcf PORTC,5
bcf PORTC,6
bcf PORTC,7
bcf PORTD,0
bcf PORTD,1
bcf PORTD,2
bcf PORTD,3
bcf PORTD,4
bcf PORTD,5
bcf PORTD,6
bcf PORTD,7

call DEMORA

goto repite

; Descripcion: Delay 500000 ciclos
;-------------------------------------------------------------
DEMORA movlw .239 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .232 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 goto PDelL6 ; 2 ciclos delay
PDelL6 goto PDelL7 ; 2 ciclos delay
PDelL7 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------
end


Hola. Compadre no lei todo el mensaje, pero segun lo que pude leer no vi mencion alguna del perro guardian. En el programa largo que postiaste no hace falta configurarlo ya que se borra automatico en los delays, pero al programa corto seria bueno que si estas trabajando con bucles, borres frecuentemente el perro guardian(CLRWDT) o para quitarte la molestia, apagalo en la palabra de configuracion al momento de programar. La cosa seria desmarcando la casilla WRTEN. A 4 MHz y preescaler a 256 TMR0 el perro guardian se desborda aproximadamente en 18 mS.

Del puerto A, me parece raro lo que pasa, pero por si las moscas, recuerda que el pin RA4 como salida es del tipo colector abierto, es decir que si lo mandas con un led y un resistor a tierra no haces nada, tendrias que poner el led con un resistor de 1.2 k a VCC.

Saludos!

Fofo almarales

Reputación

comentario del autor Vie Ago 21, 2009 4:43 pm
   
mammuky, podrias enviarme el fuente del sec.hex que me enviaras, asi lo miro y veo donde tengo errores en mi codigo. Encontre un error en el oscilador y ahora parece que funciona. Al menos tu codigo sec.hex me enciende fijo el led de RB0, pero cuando hago otro codigo mio no esta funcionando.

Mil gracias

daniloarg007

Reputación



Hacer una pregunta

Boletín de Noticias

Reciba noticias de tecnología, tips de reparación y ofertas exclusivas.



Reglamento / P+F

Foros

Miembros / Expertos