TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: MS en 15 de Agosto de 2008, 19:38:40
-
Realmente no se que es lo que estoy haciendo mal, estoy tratando de iniciarme en la programación de los PIC y para probar construí un grabador pipo2, estoy usando el programa Mplab V8.00 y para grabar el pic el WinPic800 v 3.63C y todo esto en una PC con Windows XP y el pic que estoy usando es un 16F870. Genero el archivo hex sin errores y luego lo grabo al pic sin aparentes inconvenientes incluso indicando que el oscilador es del tipo XT, ya que en el circuito de prueba utilizo un cristal de 4MHZ.. Cuando le indico al WinPic que lea el pic lo hace sin problemas y también lo reconoce perfectamente. Pero cuando armo el circuito, el led conectado al RB0 no enciende. Ya probé con dos pic por si uno estaba dañado y el resultado es el mismo con los dos. Mi consulta es ¿Como puedo para verificar que hago mal? Les paso el código del programa que utilizo el cual lo tome de Internet para no cometer errores en eso tampoco. Desde ya muchas gracias.
;---------------Encabezado-------------
LIST p=16f870
radix hex
;------------mapa de memoria---------
estado equ 0x03 ; Haciendo asignaciones
TRISB equ 0x06
ptob equ 0x06
reg1 equ 0x0C ; Estos 3 registros los utilizaré
reg2 equ 0x0D ; para hacer el retardo
reg3 equ 0x0E
;-------Configuración de puertos-------
reset org 0x00 ; origen del programa, aquí comenzará
; siempre que ocurra un reset
goto inicio ; salta a "inicio"
inicio bsf estado,5 ; pone rp0 a 1 y pasa al banco1
movlw b'00000000' ; carga W con 00000000
movwf TRISB ; y pasa el valor a trisb
bcf estado,5 ; pone rp0 a 0 y regresa al banco0
;----Aquí enciende y apaga el LED-----
ahora bsf ptob,0 ; pone un 1 en RB0 (enciende el LED)
call retardo ; llama al retardo
bcf ptob,0 ; pone a 0 RB0 (apaga el LED)
call retardo ; llama al retardo
goto ahora ; repite todo de nuevo
;-----------Rutina de Retardo-----------
retardo movlw 10 ; Aquí se cargan los registros
movwf reg1 ; reg1, reg2 y reg3
; con los valores 10, 20 y 30
tres movlw 20 ; respectivamente
movwf reg2
dos movlw 30
movwf reg3
uno decfsz reg3,1 ; Aquí se comienza a decrementar
goto uno ; Cuando reg3 llegue a 0
decfsz reg2,1 ; le quitare 1 a reg2
goto dos ; cuando reg2 llegue a 0
decfsz reg1,1 ; le quitare 1 a reg1
goto tres ; cuando reg1 llegue a 0
retlw 00 ; regresare al lugar
; de donde se hizo la llamada
;------------------------------------------
end ; se acabó
;------------------------------------------
-
Qué tal MS!
Bueno veo por encimita dos cosas:
1-
TRISB equ 0x06
ptob equ 0x06
Por qué tienes asignada a TRISB la misma dirección de memoria que a PORTB? La TRISB es 0x86.
2-
reg1 equ 0x0C ; Estos 3 registros los utilizaré
reg2 equ 0x0D ; para hacer el retardo
reg3 equ 0x0E
Esas tres posiciones de memoria no puedes usarlas como variables, pues corresponden a los SFR, o registros para funciones especiales del micro. Las posiciones de memoria para "propósito general" comienzan en 0x20 en el banco cero.
Esas cositas fueron las que detalle, supongo que el código de retardo está bien... de todos modos sería bueno que simularas en el MPLAB antes de grabar en el micro, a ver si el código está correcto.
Ok saludos, nos leemos! :mrgreen:
-
Firepic
Gracias por tu respuesta y disculpa mi demora por responder pero es que estoy a mil con mis cosas y no he tenido mucho tiempo para darle a esto. Ya hice los cambios que me comentaste e incluso ya simule el programa en el MPLAB y también me baje el PIC Simulator IDE y probé mi programita y en ambos funciona, luego grabe el pic con el winpic800 y lo monte en mi circuito de prueba pero nada, sigue sin funcionar. Al leer el pic con el winpic800, este me muestra la información grabada, no se que probar, que me sugieres qua haga, puedo medir algunos valores con el tester ademas del valor de la fuente. Desde ya muchas gracias. Te paso de nuevo el programa por las dudas.
;---------------Encabezado-------------
LIST p=16f870
radix hex
;------------mapa de memoria---------
estado equ 0x03 ; Haciendo asignaciones
TRISB equ 0x86
ptob equ 0x06
reg1 equ 0x20 ; Estos 3 registros los utilizaré
reg2 equ 0x21 ; para hacer el retardo
reg3 equ 0x22
;-------Configuración de puertos-------
reset org 0x00 ; origen del programa
goto inicio ; salta a "inicio"
inicio bsf estado,5 ; pasa al banco1
movlw b'00000000' ; carga W con 00000000
movwf TRISB ; y pasa el valor a trisb
bcf estado,5 ; regresa al banco0
;----Aquí enciende y apaga el LED-----
ahora bsf ptob,0 ; pone un 1 en RB0 (enciende el LED)
call retardo ; llama al retardo
bcf ptob,0 ; pone a 0 RB0 (apaga el LED)
call retardo ; llama al retardo
goto ahora ; repite todo de nuevo
;-----------Rutina de Retardo-----------
retardo movlw 10 ; Aquí se cargan los registros reg1
movwf reg1
tres movlw 20 ; reg2
movwf reg2
dos movlw 30 ; y reg3 con los valores 10, 20 y 30 respectivamente
movwf reg3
uno decfsz reg3,1 ; Aquí se comienza a decrementar
goto uno ; Cuando reg3 llegue a 0
decfsz reg2,1 ; le quitare 1 a reg2
goto dos ; cuando reg2 llegue a 0
decfsz reg1,1 ; le quitare 1 a reg1
goto tres ; cuando reg1 llegue a 0
return ; regresare al lugar de donde se hizo la llamada
;------------------------------------------
end ; se acabó
;------------------------------------------
-
Firepic
Gracias por tu respuesta y disculpa mi demora por responder pero es que estoy a mil con mis cosas y no he tenido mucho tiempo para darle a esto. Ya hice los cambios que me comentaste e incluso ya simule el programa en el MPLAB y también me baje el PIC Simulator IDE y probé mi programita y en ambos funciona, luego grabe el pic con el winpic800 y lo monte en mi circuito de prueba pero nada, sigue sin funcionar. Al leer el pic con el winpic800, este me muestra la información grabada, no se que probar, puedo medir alguna tensión con un tester ademas de la tensión de la fuente?, que me sugieres qua haga. Desde ya muchas gracias. Te paso de nuevo el programa por las dudas.
;---------------Encabezado-------------
LIST p=16f870
radix hex
;------------mapa de memoria---------
estado equ 0x03 ; Haciendo asignaciones
TRISB equ 0x86
ptob equ 0x06
reg1 equ 0x20 ; Estos 3 registros los utilizaré
reg2 equ 0x21 ; para hacer el retardo
reg3 equ 0x22
;-------Configuración de puertos-------
reset org 0x00 ; origen del programa
goto inicio ; salta a "inicio"
inicio bsf estado,5 ; pasa al banco1
movlw b'00000000' ; carga W con 00000000
movwf TRISB ; y pasa el valor a trisb
bcf estado,5 ; regresa al banco0
;----Aquí enciende y apaga el LED-----
ahora bsf ptob,0 ; pone un 1 en RB0 (enciende el LED)
call retardo ; llama al retardo
bcf ptob,0 ; pone a 0 RB0 (apaga el LED)
call retardo ; llama al retardo
goto ahora ; repite todo de nuevo
;-----------Rutina de Retardo-----------
retardo movlw 10 ; Aquí se cargan los registros reg1
movwf reg1
tres movlw 20 ; reg2
movwf reg2
dos movlw 30 ; y reg3 con los valores 10, 20 y 30 respectivamente
movwf reg3
uno decfsz reg3,1 ; Aquí se comienza a decrementar
goto uno ; Cuando reg3 llegue a 0
decfsz reg2,1 ; le quitare 1 a reg2
goto dos ; cuando reg2 llegue a 0
decfsz reg1,1 ; le quitare 1 a reg1
goto tres ; cuando reg1 llegue a 0
return ; regresare al lugar de donde se hizo la llamada
;------------------------------------------
end ; se acabó
;------------------------------------------
-
¿Puedes poner l palabra de configurción que as configurado? Me parece que el error está aquí.
-
Leon Pic
Por favor podrías ser un poco mas claro sobre la palabra a que haces referncia, ya que no tengo idea a que te referis. desde ya muchas gracias.
-
La palabra de configuración a la que se refiere Leon_Pic es:
Como configuras a la hora de programar el pic los siguientes elementos: oscilador, watchdog, power-on,..........
ES posible que alguno de ellos no esté bien. Por ejemplo si tienes habilitado el watchdog casi con toda seguridad se desbordara casi de inmedato y no podrás realizar nada.
Fermin
-
Fer TACA
Ok, muchas gracias, bien ya configuré el WinPic con los siguientes valores Osc. XT (ya que uso un cristal de 4 Mhz), wdte, pwrte, cpd, cp y debugger desactivados y lvp, boden y wrt activados. Y luego grabe el pic pero no funcionó en mi circuito de prueba que solo tiene los pines 1 y 20 a 3,8 V ( tres pilas de 1,5 V); pines 8 y 19 a 0V; pines 8 y 10 el cristal con sus respectivos capacitores a masa y en el pin 21 con un led y su respectiva resistencia en serie de 220 ohms a masa y por último un condensador entre el positivo y el negativo. Luego usando el ICProg y mediante la prueba de hard que tiene probé mi grabador y con un tester medí los siguientes valores entre VSS y MCLR (pin 1) estando desactivado desde ICProg 0V activado 11,9 V, DATA (ping 28) desactivado 0 V, activado 4,9 V; Clock (ping 27) desactivado 0,5 V y activado 5,05 V. Posteriormente usando el WinPic800 leí el pic y con la opción de pasar a assembler el código hexa leído obtuve lo siguiente:
0x0000 : 0x2801 goto 0x01
0x0001 : 0x1683 bsf 0x03 , 5
0x0002 : 0x3000 movlw 0x00
0x0003 : 0x0086 movwf 0x06
0x0004 : 0x1283 bcf 0x03 , 5
0x0005 : 0x1406 bsf 0x06 , 0
0x0006 : 0x200A call 0x0A
0x0007 : 0x1006 bcf 0x06 , 0
0x0008 : 0x200A call 0x0A
0x0009 : 0x2805 goto 0x05
0x000A : 0x3010 movlw 0x10
0x000B : 0x00A0 movwf 0x20
0x000C : 0x3020 movlw 0x20
0x000D : 0x00A1 movwf 0x21
0x000E : 0x3030 movlw 0x30
0x000F : 0x00A2 movwf 0x22
0x0010 : 0x0BA2 decfsz 0x22 , F
0x0011 : 0x2810 goto 0x10
0x0012 : 0x0BA1 decfsz 0x21 , F
0x0013 : 0x280E goto 0x0E
0x0014 : 0x0BA0 decfsz 0x20 , F
0x0015 : 0x280C goto 0x0C
0x0016 : 0x0008 return
0x0017 : 0x3FFF Data 0x3FFF ; ?
.
.
0x07FF : 0x3FFF Data 0x3FFF ; ?
ORG 0x2100 ; DATA
Data 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ;
Data 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ;
Data 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ;
Data 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ;
Data 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ;
Data 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ;
Data 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ;
Data 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ;
ORG 0x2000 ; ID
Data 0x3FFF
Data 0x3FFF
Data 0x3FFF
Data 0x3FFF
ORG 0x2007 ; CONFIG
Data 0x3FF9
end ;
Perdón por poner tantos datos pero este es mi primer pic que intento grabar y realmente no se para donde agarrar. Alguien me podría dar una mano para verificar que hago mal.
-
El error es bien simple. Al activar LVP, el PIC al detectar 5 volt, se pone en modo de programación, ya que LVP es programación con baja tensión.
Utiliza al principio, todas las opciones desactivadas y el oscilador con el que configuraste está bien. Una vez que domines bien al Pic, podrás activar lo que necesites.
-
Holas MS
En tu descripción del hardware conectado me llamó la atención lo siguiente: "...pines 8 y 10 el cristal con sus respectivos capacitores a masa...". De ser esto así, estaría mal conectado, ya que el cristal va en los pines 9 y 10 (ojo con el datasheet)
Espero te sirva de algo..... :)
Saludos a quienes nos leen
-
OK, Leo Pic, Fer TACA; firepic gracias por sus aportes FUNCIONO. sansanoloko lo del pin 8 fue un error de tipeo, tenes razon es 9 muchas gracias. Otra cosa ya que estamos, donde puedo ver bien el tema de las funciones de las opciones de configuración. Bueno de nuevo muchas gracias a todos. Nol leemos.
-
¿que tal en el datasheet del micro utilizado? :) :) :) :mrgreen: :mrgreen: :mrgreen:
Fer.
-
OK gracias, pense que era general y no propio de cada micro, disculpen pero recien estoy empesando en esto.
-
Felicitaciones MS!
No te preocupes, al principio tenemos muchas preguntas y dudas, no dejes de hacerlas pues así es como aprenderás.
Te deseo éxito en tu trabajo con los microcontroladores! Te divertirás en grande! :-/
Saludos, nos leemos! :mrgreen: