Problemas con migración de código POV

Buenas noches con todos, estoy iniciandome en el mundo de los microcontroladores, intentando hacer un reloj pov (de los que giran y muestran la hora), me encontre con un pequeño problema.
El codigo que adjunto esta hecho para el pic 16f84, hice algunos cambios para adaptarlo a un pic 16f628a y pues lo compile y no hubieron errores pero al momento de grabar el pic y probar en el circuito no funciona.
Quisiera por favor si alguien podria revisar el codigo e indicarme si la migracion de codigo esta bien o quiza tuve algunos errores. Desde ya muchas gracias por su ayuda
 

Adjuntos

  • pic16f84.txt
    16.7 KB · Visitas: 19
  • pic16f628a.txt
    16.8 KB · Visitas: 13
Prueba el proyecto con los cambios que le realicé al código y nos comentas si funciona.
Incluyo dentro del archivo adjunto el esquema original del proyecto y la simulación de prueba.
El código lo modifiqué para un 16F628A basándome en el código original "Noblink.asm"

Saludos y suerte.
 

Adjuntos

  • 16F628A POV.rar
    47.8 KB · Visitas: 22
Buenas noches y muchas gracias por su ayuda.
Probe el codigo que usted corrigio y despues de unos pequeños cambios muestra los numeros que dan la hora, pero el reloj no avanza. Se puede configurar la hora pero el reloj se queda detenido
 
Buenas noches y muchas gracias por su ayuda.
Probé el código que usted corrigió y después de unos pequeños cambios muestra los números que dan la hora, pero el reloj no avanza. Se puede configurar la hora pero el reloj se queda detenido
Prueba ahora este código, el anterior tenía un error al no cambiar del banco 0 al banco 1 para el registro OPTION_REG.

Nota:
Los cambios realizados al código están comentados en español.

Suerte.
 

Adjuntos

  • 16F628A POV Rev2.rar
    5.5 KB · Visitas: 50
Muchisimas gracias!!!! Acabo de probar el codigo corregido y todo funciona muy bien. Muchas gracias nuevamente
De nada, que bien que el código corregido funcionó.

Si es posible que nos muestres algunas fotos o un vídeo del reloj POV funcionando estaría muy bien.
Así podremos ver como lo has realizado y también que nos comentes con que partes lo realizaste.

Saludos.
 
Buenas tardes, vengo a este foro en busca de ayuda, ya que estoy queriendo realizar un pov con un pic 16f84 y soy nuevo en esto de la programación y ya que muchos de ustedes tienen más idea que yo del tema quisiera ver si me pueden corregir el código o el circuito, ya que al momento de probarlo no pasa nada, les adjunto a continuación los mismos, desde ya muchas gracias y un saludo.
Código:
SWI	EQU	1
PC	EQU	02
REG1	EQU	0x0C
REG2	EQU	0x0D
REG3	EQU	0X0E
Apunta	EQU	0x0F
Conta	EQU	0x1C
AUX	EQU	0x2C

	GOTO	INICIO

TABLA:
	ADDWF	PC,1
	RETLW	d\'255\'	;F
	RETLW	d\'136\'	
	RETLW	d\'136\'
	RETLW	d\'136\'
	RETLW	d\'136\'
	RETLW	d\'128\'
	RETLW	d\'128\'	;F
	RETLW	d\'255\'	;E
	RETLW	d\'137\'	
	RETLW	d\'137\'
	RETLW	d\'137\'	
	RETLW	d\'129\'
	RETLW	d\'129\'	
	RETLW	d\'129\'	;E
	RETLW	d\'255\'	;L
	RETLW	d\'001\'	
	RETLW	d\'001\'	
	RETLW	d\'001\'	
	RETLW	d\'001\'
	RETLW	d\'001\'
	RETLW	d\'001\'	;L
	RETLW	d\'129\'	;I
	RETLW	d\'129\'
	RETLW	d\'129\'
	RETLW	d\'255\'
	RETLW	d\'129\'
	RETLW	d\'129\'
	RETLW	d\'129\'	;I
	RETLW	d\'131\'	;Z
	RETLW	d\'133\'	
	RETLW	d\'137\'
	RETLW	d\'145\'
	RETLW	d\'161\'
	RETLW	d\'193\'
	RETLW	d\'129\'	;Z
	RETLW	0x000	;ESPACIO
	RETLW	0x000
	RETLW	0x000
	RETLW	0x000
	RETLW	0x000
	RETLW	0x000
	RETLW	0x000	;ESPACIO
	RETLW	d\'031\'	;A
	RETLW	d\'036\'	
	RETLW	d\'068\'
	RETLW	d\'132\'
	RETLW	d\'068\'
	RETLW	d\'036\'
	RETLW	d\'031\'	;A
	RETLW	d\'255\'	;N
	RETLW	d\'064\'	
	RETLW	d\'032\'
	RETLW	d\'016\'
	RETLW	d\'008\'
	RETLW	d\'004\'
	RETLW	d\'255\'	;N
	RETLW	d\'129\'	;I
	RETLW	d\'129\'
	RETLW	d\'129\'
	RETLW	d\'255\'
	RETLW	d\'129\'
	RETLW	d\'129\'
	RETLW	d\'129\'	;I
	RETLW	d\'248\'	;V
	RETLW	d\'004\'
	RETLW	d\'002\'
	RETLW	d\'001\'
	RETLW	d\'002\'
	RETLW	d\'004\'
	RETLW	d\'248\'	;V
	RETLW	d\'255\'	;E
	RETLW	d\'137\'	
	RETLW	d\'137\'
	RETLW	d\'137\'	
	RETLW	d\'129\'
	RETLW	d\'129\'	
	RETLW	d\'129\'	;E
	RETLW	d\'255\'	;R
	RETLW	d\'136\'	
	RETLW	d\'136\'
	RETLW	d\'136\'	
	RETLW	d\'140\'
	RETLW	d\'138\'	
	RETLW	d\'113\'	;R
	RETLW	d\'098\'	;S
	RETLW	d\'145\'	
	RETLW	d\'145\'
	RETLW	d\'145\'	
	RETLW	d\'137\'
	RETLW	d\'137\'	
	RETLW	d\'070\'	;S
	RETLW	d\'031\'	;A
	RETLW	d\'036\'	
	RETLW	d\'068\'
	RETLW	d\'132\'
	RETLW	d\'068\'
	RETLW	d\'036\'
	RETLW	d\'031\'	;A
	RETLW	d\'255\'	;R
	RETLW	d\'136\'	
	RETLW	d\'136\'
	RETLW	d\'136\'	
	RETLW	d\'140\'
	RETLW	d\'138\'	
	RETLW	d\'113\'	;R
	RETLW	d\'129\'	;I
	RETLW	d\'129\'
	RETLW	d\'129\'
	RETLW	d\'255\'
	RETLW	d\'129\'
	RETLW	d\'129\'
	RETLW	d\'129\'	;I
	RETLW	d\'126\'	;O
	RETLW	d\'129\'
	RETLW	d\'129\'
	RETLW	d\'129\'
	RETLW	d\'129\'
	RETLW	d\'129\'
	RETLW	d\'126\'	;O

ms	movwf	REG1	;tiempo en milisegundos

repe	movlw	.2
	movwf	REG2

rep	NOP
	decfsz	REG2,1
	goto	rep
	decfsz	REG1,1
	goto	repe
	retlw	0

INICIO	clrf 	PORTB
	bsf	STATUS,RP0	
	movlw	0x00
	movwf	PORTA
	movlw	0x00
	movwf	PORTB
	bcf	STATUS,RP0
	movlw	.25
	call	ms
	movlw	5
	movwf	AUX

otra	;btfsc	PORTA,SWI
	;goto	otra
	;movlw	.20
	;call	ms
	clrf	PORTA
	movlw	.11
	movwf	Conta
	clrf	Apunta

novo	movf	Apunta,w
	incf	Apunta,1

sale	call	TABLA
	movwf	PORTB
	movlw	.5
	call	ms
	decfsz	AUX,1
	goto	novo
	clrf	PORTB
	movlw	.5
	movwf	AUX
	decfsz	Conta,1
	goto	novo
	goto	otra
	org	0x1ff
	goto	INICIO

	END
 

Adjuntos

  • POV.png
    POV.png
    37.4 KB · Visitas: 14
Buenas noches, me migre a c para programar el pic y creo que logre algo, solamente quisiera saber si es correcto el código que acabo de realizar, por supuesto que es una compilación de varios códigos. Y pienso utilizar un oscilador de 4MHz externo. Creo que logre configurar el reloj. Y quisiera que me digan si le ven algún error al código para comenzar a hacer el diseño del mismo. Un saludo y muchas gracias a la comunidad.

Código:
#include <16f84a.h>            //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#byte portb =0x06

const char letter_SPC[8]= {0,0,0,0,0,0,0};
const char letter_L[8]= {255,1,1,1,1,1,1};
const char letter_U[8]= {255,1,1,1,1,1,255};
const char letter_I[8]= {129,129,129,255,129,129,129};
const char letter_S[8]= {98,145,145,145,137,137,70};

void printChar(char l);

void main(){
     set_tris_a(0x01);
     set_tris_b(0x00);
     
     while(1){
      if(input(pin_a0)==1){
            printChar('L');
            printChar('U');
            printChar('I');
            printChar('S');
         }
     }
}

void printChar(char l){
   int n;
   
   for(n=0;n<8;n++){
        if(l == ' ') PORTB = letter_SPC[n];
        else if(l == 'L') PORTB = letter_L[n];
        else if(l == 'U') PORTB = letter_U[n];
        else if(l == 'I') PORTB = letter_I[n];
        else if(l == 'S') PORTB = letter_S[n];
   }
   PORTB = 0;
   Delay_ms(2);  // adjust this to compensate for rpm differences
        
} //end printChar function
 
Según el código, estás sacando las letras de LUIS por el puerto B, con una separación de 2 ms entre letras. Es poco tiempo para apreciarlo a simple vista, pero si es lo que quieres hacer, entonces está bien.
 
Buenas, les comento que ya probé el circuito y funciona perfectamente, lo único es que no se alcanza a distinguir el mensaje, eh intentado cambiando el delay pero no alcanza a darle la suficiente corriente a los led's para que se distinga el efecto de pov, intente sacando las resistencias limitadoras de 220 y se noto el cambio, pero aún no logro que pase la suficiente intensidad como para que se note, quisiera saber que me recomendarían ustedes que le ponga? Yo estaba pensando en ponerle unos transistores, pero no se. Por lo pronto voy a seguir probando y les comentaré mis resultados. Muchas gracias por la mano y disculpen las molestias
 
Debes poner un retraso entre cada letra, que es el tiempo que permanecen encendido los LED.

Es cuestión de matemáticas: tienes que medir el tiempo que tarda el reloj hacer un desplazamiento de la barra de LED. A lo largo de ese tiempo es donde quieres que se pinte el nombre. Por ejemplo, si el periodo de movimiento es de 500 ms, y queremos que aparezcan 4 letras en ese espacio, pues significa que tenemos 500 /4 = 125 ms por letra. Y esa letra se compone de 8 columnas (por ejemplo), entonces tenemos 125 / 8 = 15.625 ms por cada columna.

Ese es el tiempo de retraso que debes poner por cada columna de cada letra.

Bueno, en realidad hay que tener en cuenta una columna más, como separador entre letras.

Para simplificar las cosas, lo que se hace es "pintar" las letras, espacios, símbolos en un trozo de la memoria. Entonces la rutina de pintado solo tiene que ir mandando esos bytes uno tras otro. Y el programa puede entonces hacer desplazamiento (scroll) de ese contenido de forma fácil.
 
Tienes que ponerle un tiempo dentro del FOR en mi caso a unas 3000rpm aproximadamente me quedo con unos 80us.

te deberia de funcionar con esta modificacion:
for(n=0;n<8;n++){
if(l == ' ') PORTB = letter_SPC[n];
else if(l == 'L') PORTB = letter_L[n];
else if(l == 'U') PORTB = letter_U[n];
else if(l == 'I') PORTB = letter_I[n];
else if(l == 'S') PORTB = letter_S[n];
Delay_us(100); // depende de las rpm
}
PORTB = 0;
Delay_us(100) //depende de las rpm
 
Muchas gracias,anduvo de lujo con eso, ahora estoy viendo como armar la estructura, les agradecería si me dan una mano, y quisiera saber si al 16f84 lo puedo alimentar con una pila para no gastarme en pensar como llevar la alimentación. Muchas gracias
 
Atrás
Arriba