Autor Tema: Programa correcto en PIC16F84 y no funciona en PIC16F628A  (Leído 4460 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Programa correcto en PIC16F84 y no funciona en PIC16F628A
« en: 18 de Mayo de 2015, 05:37:18 »
Hola, he hecho un programa para 16F84 y lo quiero pasar a 16F628A. Por más que mire en internet y probar montón de cosas, el programa no funciona en el 16F628A (en proteus).  Supongo que es un problema de puertos e historias que no domino mucho.

Este es la configuración inicial código en PIC16F84A que funciona correctamente.

Código: [Seleccionar]
__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST    P=16F84A
INCLUDE  <P16F84A.INC>

CBLOCK  0x0C
contador
ENDC

#DEFINE Pulsador PORTA,4 ; Pulsador conectado a RA4.

; ZONA DE CÓDIGOS ********************************************************************

ORG 0 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
movlw b'00000111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf OPTION_REG
bcf STATUS,RP0 ; Acceso al Banco 0.
clrf PORTB


Y esta es la del 16F628A que no funciona  :( :( :(

Código: [Seleccionar]
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
LIST    P=16F628A
INCLUDE  <P16F628A.INC>

CBLOCK  0x0C
contador
ENDC

#DEFINE Pulsador PORTA,4 ; Pulsador conectado a RA4.

; ZONA DE CÓDIGOS ********************************************************************

ORG 0x05
     
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
movlw b'00000111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf OPTION_REG
bcf STATUS,RP0 ; Acceso al Banco 0.
clrf PORTB

Como siempre,muy agradecido.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 209
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #1 en: 18 de Mayo de 2015, 07:01:02 »
tenés que desactivar los comparadores, creo que era...

BCF STATUS,RP0 ;banco 0.
movlw b'00000111' ; desactivar comparador
movwf CMCON

ANTES de hacer cualquier cosa con ese puerto A.
por cierto en vez de remarla solo, has visto:

http://www.todopic.com.ar/foros/index.php?topic=24720.0

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #2 en: 18 de Mayo de 2015, 10:21:28 »
Tambien yo solo veo una parte del codigo, si es todo el codigo jamas verias nada, ya que no posee un loop infinito, es decir se ejecutaria una ves cada muchisimo tiempo.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #3 en: 18 de Mayo de 2015, 10:34:37 »
Otro detalle que existe en el código, además de configurar el puerto A como digital (como lo sugiere AleSergi); es la direccion asignada a la variable "contador".
Esta deberia ser así:

CBLOCK  0x20
contador
ENDC


saludos,

elreypic.

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #4 en: 18 de Mayo de 2015, 18:42:01 »
Muchas gracias por las respuestas:Efectivamente no es todo el código, es solo la parte de las configuración que es lo unico que cambia entre un pic y otro. No he puesto todo el codigo para no liar más.
Bueno he probado varias combinaciones pero la cosa sigue igual, vamos que no sale nada. Os cuelgo lo que he puesto a ver si me voy acercando al bueno.

Código: [Seleccionar]
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
LIST    P=16F628A
INCLUDE  <P16F628A.INC>

CBLOCK  0x20
contador
ENDC

#DEFINE Pulsador PORTA,4 ; Pulsador conectado a RA4.

; ZONA DE CÓDIGOS ********************************************************************

ORG 0x05
     
Inicio
bcf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
movlw b'00000111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf OPTION_REG
movwf CMCON
bcf STATUS,RP0 ; Acceso al Banco 0.
clrf PORTB

También he mirado los tutos del foro, pero aún no domino tanto como para llegar a entenderlo del todo, aunque me lo he mirado.
A ver si progreso .... gracias a todosssss  :mrgreen: :mrgreen: :mrgreen:
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #5 en: 18 de Mayo de 2015, 18:54:54 »
Esta bien si no queres poner todo el codigo, por lo que debo de suponer que lo demas esta bien.

ya no hay nada mas que configurar de los puertos.

Puerto A : PORTA / TRISA / CMCON / VRREF (creo que era asi el registro pero viene desactivado en el reset)
Puerto B : PORTB / TRISB / OPTION ( pullup)

Nada mas.

Una cosa mas que me queda inconclusa... Que es lo que no anda? Podrias dar una idea de cuales son las entradas / salidas ?
Aunque como ya dije parece que las entradas/salidas estan configuradas, solo quedaria la otra porcion del codigo que puede ser la causante.

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #6 en: 20 de Mayo de 2015, 05:21:45 »
Ueeeeeeeeeeeeeeeeeeee vaya tela, lo escribo bien en el post y en el programa no, resulta que la dirección de la variable contador la ponía mal en el programa. Cosas de las prisas ... en fin, ya funciona el programa igual de bien con un pic  y con otro. Esoty intentando hacer un programa que se encienda un led y se apague cada segundo lo más exactamente posible. Creo que casi lo tengo, ahora me queda pelearme con el contador de ciclos que por alguna razón no me sale activado. Tengo la versión 6.60 (es vieja pero no necesito mas) y me he bajado la última pero también me sale desactivada. Alguna sugerencia?

Cuelgo el código completo para que lo critiqueis.

Código: [Seleccionar]
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
LIST    P=16F628A
INCLUDE  <P16F628A.INC>

CBLOCK  0x20
contador
ENDC


#DEFINE Salida PORTB,3 ; Puerto donde se conecta los diodos LED.

; ZONA DE CÓDIGOS ********************************************************************

ORG 0x05 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
bcf Salida ; Las líneas del Puerto B se configuran como salida.
movlw b'00000111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf OPTION_REG
movwf CMCON
bcf STATUS,RP0 ; Acceso al Banco 0.
Memoria
movlw d'10'
movwf contador

Principal
movlw d'100'
movwf contador
bsf Salida
call Un_segundo
movlw d'100'
movwf contador
bcf Salida
call Un_segundo
goto Principal

Un_segundo_carga EQU -d'39'

Un_segundo
movlw Un_segundo_carga
movwf TMR0
bcf INTCON,T0IF

Timer0_Rebosamiento
btfss INTCON,T0IF
goto Timer0_Rebosamiento
decfsz contador,1
goto Un_segundo
RETURN

END

Como siempre muy agradecido, no se que haría yo sin el foro.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #7 en: 20 de Mayo de 2015, 10:23:48 »
Que tal fulgitron,

Veo varios detalles.

El primero es:
                           Un_segundo_carga   EQU      -d'39'
deberia ser:
                           Un_segundo_carga   EQU      d'39' 
Sin el signo de "-"
y la sentencia deberias colocarla al inicio del codigo de la siguiente manera:
#DEFINE Salida      PORTB,3      ; Puerto donde se conecta los diodos LED.
Un_segundo_carga   EQU      d'39'

Analicemos la subrutina de tiempo con el Timer0.

En la configuración estás asignando el prescalar al TMR0 y definiéndolo como 1:256, según la intruccion que colocaste:
        movlw   b'00000111'      ; Las 5 líneas del Puerto A se configuran como entrada.
   movwf   OPTION_REG

Ahora bien, el TMR0 lo inicializas con el valor 39, lo que quiere decir que realizará una cuenta de 256-39 = 217, pero como tu prescalar es de 1:256, entonces multiplicamos el 217 X 256 y esto nos da como resultado: 55552. Esto quiere decir que si el cristal que estas usando es de 4 MHZ, el ciclo instruccion es de 1 microsegundo (us, recuerda que la frecuencia de operacion es la frecuencia del cristal usado dividida entre 4)por lo tanto el TMR0 se desbordará cada 55.552 ms. Ahora bien tu tienes un contador de ciclos de 100 (valor de la variable contador). Entonces 55.552ms X 100 = 5.5552 segundos!!!!!

Como puedes ver estas usando valores inadecuados para la inicializacion del TMR0.

Lo que yo te recomiendo es lo siguiente:

Inicializa el TMR0 con el valor de 195, en lugar del 39 que estas usando, con este valor tendrás lo siguiente:

Carga del TMR0 X Prescalar X variable contador = tiempo total.

Carga del TMR0 = 195
Valor del prescalar es 256
variable contador = 20

Entonces sustituyendo:

195 X 256 X 20 = 998400 ciclos.

Ahora bien si tu cristal es de 4 MHz, entonces cada cilo es de 1us, por lo tanto el tiempo total que tienes ahora es es 0.9984 segundos. Como puedes darte cuenta no es exactamente 1 segundo pero es muy cercano. Tu error de tiempo seria: (1,000,000 - 998400)*100/1,000,000 = 0.16%

Espero esto te sirva de ayuda.

Elreypic.







Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #8 en: 20 de Mayo de 2015, 12:35:00 »
Te corrijo redpic,

Citar
El primero es:
                           Un_segundo_carga   EQU      -d'39'
deberia ser:
                           Un_segundo_carga   EQU      d'39'

Eso lo puede hacer tranquilamente, estaria cargando justamente el valor -39 , o el complemento a 2 de 39 en el timer. Lo cual estaria cargando 217.
Con 39 , 39*256 = 9984, es decir 9.984ms, con 100 estaria cerca, y estaria en 0.9984 + las instrucciones del programa puede que este en el segundo.

Lo que si eso es una constante, yo prefiero usarla con un #define, pero es valido tambien con un EQU, por ultimo si, deberias colocar todas las constantes al comienzo del programa tal cual dijo redpic

No digo de utilizar interrupciones por que no vale la pena si es solo para un led. Aun asi lo que estas haciendo es un delay. Y como siempre sigo prefiriendo las interrupciones.

La otra seria perdiendo un pin como salida (pero podes seguir usandolo como entrada), podrias usar el modulo CCP, Entonces cargas el valor que queres en el modulo CCP, eso se compara con el Timer1 (que es de 16 bits) Cuando se produce un match ( que son ambos iguales ) se genera una interrupcion ( o se activa un flag ) y solo se resetea el timer. Lo bueno es que: No necesitas cargar el valor del timer, ya no cargas complemento a 2 sino que ahora el numero deseado y solo te dedicas a contar los ciclos de interrupciones con el flag del CCP.
Mucho mas exacto? Usa un cristal externo de 32768Khz en el timer1.

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #9 en: 21 de Mayo de 2015, 00:55:33 »
Gracias por los consejos y gracias killer por corregir a reypic. Por un momento pensaba que lo estaba haciendo fatal, sigo siendo un novato pero pensaba que estaba cerca del segundo. Seguiré vuestros consejos. Tengo otro post de desesperado con las interrupciones que me gustaría continuar pero el tiempo no me da para todo. Pero este año quiero acabar dominándolas y quizás empiece a incluirlas.

Por cierto, porque no se me activa la opcion del stopwatch en el MPLAB? no me funciona ni en la versión 6.60 ni en la última.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #10 en: 21 de Mayo de 2015, 02:11:05 »
No se por que tenes una version tan vieja. o es MPLAB 8.xx (que ya no tiene mas soporte ) o es el MPLAB X (creo que anda en la version 2 y algo). Yo desde que probe puse el stopwatch y cuando lo simulo entre breakpoints te aparece los ciclos y el tiempo. Por ahi configurar la frecuencia del oscilador es lo unico que necesito.

Las interrupciones son simples, no es nada complejo pero podes hacer el codigo polleando los flags de las mismas.

Si queres mejorar aun mas lo que ya tenes hecho. Cuando cuente los 100, intenta buscar un valor de timer que te rellene esos 16ms que faltan (0.9984s) en un overflow mas corto, y asi tendrias un valor mas cercano.
Por ejemplo cargando 250 al TMR0 con ese preescaler tendrias 15.36 ms, bastante cerca del valor que querias.

Si no, usa el modulo CCP. Confgiuralo para que reinicie solo el timer1
Carga el valor 62500 en los registros de ese modulo
Pone el timer1 cno preescaler 1/8 y necesitarias que se active 2 veces el flag del CCP y listo, ya tenes tu segundo.

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #11 en: 31 de Mayo de 2015, 17:10:00 »
Aquí sigo con mis problemas. He modificado un par de cosas siguiendo vuestros consejos, muchas gracias. Pero mi vida es un calvario con estos temas (jijijiji) ahora en el Proteus funciona OK, pero en la realidad no. El LED se enciende pero ya está. En proteus se enciende y se paga cada segundo. Os dejo el código y un par de fotos a ver que veis.

Código: [Seleccionar]
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
LIST    P=16F628A
INCLUDE  <P16F628A.INC>

CBLOCK  0x20
contador
ENDC


#DEFINE Salida PORTB,3 ; Puerto donde se conecta los diodos LED.
#DEFINE Un_segundo_carga -d'39'
; ZONA DE CÓDIGOS ********************************************************************

ORG 0x05 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB
movlw b'00000111'
movwf OPTION_REG
movwf CMCON
bcf STATUS,RP0 ; Acceso al Banco 0.
clrf PORTB
Memoria
movlw d'10'
movwf contador

Principal
movlw d'100'
movwf contador
bsf Salida
call Un_segundo
movlw d'100'
movwf contador
bcf Salida
call Un_segundo
goto Principal



Un_segundo
movlw Un_segundo_carga
movwf TMR0
bcf INTCON,T0IF

Timer0_Rebosamiento
btfss INTCON,T0IF
goto Timer0_Rebosamiento
decfsz contador,1
goto Un_segundo
RETURN

END





Los botones aún no está conectados y los cables de la alimentación, los colores están al revés. A ver que veis y puedo ver un LED parpadeando en mi breadboard.

Un saludo y muy agradecido por todo.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #12 en: 31 de Mayo de 2015, 18:17:39 »
Si en proteus anda y en la realidad no, normalmente suele ser problema de los fuses.

Tenes:

_MCLRE_ON

Pero en tu protoboard aunque el cable no parece estar conectado al pin 4, sino al 5. Aunque esto haria que no se encienda ningun led. Por las dudas ponelo OFF al MCLRE mientras probas.

Tu programa funciona bien, lo simule y anda perfecto, solo queda la configuracion de los fuses. Que puede estar molestando.

Desconectado Fulguitron

  • PIC16
  • ***
  • Mensajes: 122
    • Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #13 en: 02 de Junio de 2015, 01:00:26 »
Killerjc, eres un experto, has dado en el clavo. Probé 10.000 cosas y no había manera, entre ellas recuerdo que borré lo de MCLRE y tampoco funcionó. Ya he dado un pasito más. Mi idea es hacer un reloj binario que más o menos ya voy perfilando la programación, ahora me falta hacer una interrupción (tengo otro post de desesperado con las interrupciones que voy a retomar) y contar ciclos para que funcioné de forma precisa.

Como siempre, muy agradecido y seguiremos informando.
Disfruta de mi blog, hobbies y gadgets diferentes y poco comunes.

http://hobbiesygadgets.blogspot.com.es/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Programa correcto en PIC16F84 y no funciona en PIC16F628A
« Respuesta #14 en: 02 de Junio de 2015, 02:08:55 »
Me alegro que pudieras resolverlo, cualquier cosa sabes que podes preguntar y cualquiera del foro puede darte una mano.