TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: JOSIP151 en 30 de Noviembre de 2021, 01:28:39
-
Hola, buen día, ¿alguien me podría decir que estoy haciendo mal?, llevo días intentando hacer el cronómetro pero no hay manera. Adjunto código:
#include <xc.h>
#include "Configuracion.h"
#define _XTAL_FREQ 20000000
char Display[10]={0x3f, 0x06, 0x5B, 0x4f, 0x66, 0x6D, 0x7D, 0x07, 0x7f, 0x6f};
int i,a;
int b;
int d;
int c;
int a;
int us=0, ds=0 ,cs=0 ,ms=0;
void timerprincipal(void){
INTCONbits.GIE = 0;
T0CONbits.T0CS = 0;
T0CONbits.PSA = 0;
T0CONbits.T0PS = 0b111;
T0CONbits.T08BIT = 0;
T0CONbits.TMR0ON = 1;
INTCONbits.TMR0IF = 0;
INTCONbits.TMR0IE = 1;
INTCONbits.PEIE = 1;
INTCONbits.GIE = 1;
}
void main (void){
timerprincipal();
ADCON1bits.PCFG = 1;
TRISD=0;
LATD=0;
TRISB=0;
LATB=0;
TRISBbits.RB5 = 0;
TRISBbits.RB6 = 0;
TRISBbits.RB7 = 0;
TRISBbits.RB0 = 0;
TRISBbits.RB1 = 0;
TRISBbits.RB2 = 0;
TRISBbits.RB3 = 0;
while(1){
while(PORTBbits.RB5 == 1){
for(a=0;a==3600;a++){
for(b=0;b==3600;b++){
for(c=0;c==3600;c++){
for(d=0;d==3600;d++){
TMR0L = 3034;
TMR0H = (3034) >> 8;
us=d%360;
LATD= Display[us];
LATBbits.LATB0=1;
__delay_ms(10);
LATBbits.LATB0=0;
LATD= Display[ds];
LATBbits.LATB1=1;
__delay_ms(10);
LATBbits.LATB1=0;
LATD= Display[cs];
LATBbits.LATB2 = 1;
__delay_ms(10);
LATBbits.LATB2 = 0;
LATD= Display[ms];
LATBbits.LATB3=1;
__delay_ms(10);
LATBbits.LATB3=0;
}
ds=c/720;
}
cs=b%360;
}
ms=a/720;
}
}
if(PORTBbits.RB7 == 1){
LATD= Display[us];
LATD= Display[ds];
LATD= Display[cs];
LATD= Display[ms];
}
if(PORTBbits.RB6 == 1){
ms=0;
cs=0;
ds=0;
us=0;
LATD= Display[0];
LATBbits.LATB0=1;
LATBbits.LATB1 =1;
LATBbits.LATB2=1;
LATBbits.LATB3=1;
}
}
}
void __interrupt () ISR_TIMER_0 (void){
if(INTCONbits.TMR0IF == 1){
TMR0L = 3034;
TMR0H = (3034) >> 8;
INTCONbits.TMR0IF = 0;
}
}
-
¿Y no te funciona en una simulación o en una placa verdadera?
¿Creaste tu proyecto de poco en poco?
Por ejemplo, lo primero que se hace es verificar voltajes sean los correctos, que el pin MCLR esté en 1 lógico. (Obviamente si es en una placa verdadera?)
¿Hiciste ejemplo sencillo, como parpadear un led, para verificar si el oscilador funciona?
A continuación empiezas a enviar sólo un dígito a un display sin temporizador aún, etc etc
Es decir que vas construyendo tu código poco a poco hasta que llegues a un punto donde no te funciona algo y si ya no puedes solucionarlo, pides ayuda diciendo "esta parte del código no me funciona...."
¿O escribiste todo tu código completo y esperaste que te funcione con al primera vez que descargaste/simulaste el proyecto con el microcontrolador?
-
Algunos errores:
nt i,a;
int b;
int d;
int c;
int a;
a está declarada dos veces. Otro compilador de daría error.
for(a=0;a==3600;a++){
for(b=0;b==3600;b++){
for(c=0;c==3600;c++){
for(d=0;d==3600;d++){
Ninguno de esos for se ejecuta pues la condición a==3600 (y las otras) son falsas de entrada y el for se ejecuta mientras sea verdadera.
LATD= Display[us];
LATBbits.LATB0=1;
__delay_ms(10);
LATBbits.LATB0=0;
LATD= Display[ds];
LATBbits.LATB1=1;
__delay_ms(10);
LATBbits.LATB1=0;
A menos que hayas puesto un transistor para excitar el dígito, la polaridad de RBx está al revés.
if(PORTBbits.RB7 == 1){
LATD= Display[us];
LATD= Display[ds];
LATD= Display[cs];
LATD= Display[ms];
}
Esto no es un error, es un misterio: ¿Qué quisiste hacer?
-
Algunos errores:
nt i,a;
int b;
int d;
int c;
int a;
a está declarada dos veces. Otro compilador de daría error.
for(a=0;a==3600;a++){
for(b=0;b==3600;b++){
for(c=0;c==3600;c++){
for(d=0;d==3600;d++){
Ninguno de esos for se ejecuta pues la condición a==3600 (y las otras) son falsas de entrada y el for se ejecuta mientras sea verdadera.
LATD= Display[us];
LATBbits.LATB0=1;
__delay_ms(10);
LATBbits.LATB0=0;
LATD= Display[ds];
LATBbits.LATB1=1;
__delay_ms(10);
LATBbits.LATB1=0;
A menos que hayas puesto un transistor para excitar el dígito, la polaridad de RBx está al revés.
if(PORTBbits.RB7 == 1){
LATD= Display[us];
LATD= Display[ds];
LATD= Display[cs];
LATD= Display[ms];
}
Esto no es un error, es un misterio: ¿Qué quisiste hacer?
A parte de eso, tengo dos dudas.
La primera es que la interrupción del temporizador sólo inicializa a un valor, me imagino que es para generar un tiempo fijo, tal vez 1us.
Pero no utiliza para nada en el código principal, sólo en una parte esta volviendo a colocar el valor de inicialización, me imagino que quiere con ese temporizador actualizar las variables que muestra en el display.
La segunda, suponiendo que funciona, creo que sería muy difícil visualizar en un display como se incrementa al ritmo de microsegundos. Es decir que talvez desde de milisegundos será posible ver como un display cambia de valores.
-
Es totalmente simulado, en un momento adjunto mi programa de proteus, el oscilador definitivamente no me funciona(hice la prueba mediante el LED)
El código efectivamente lo construí en varios días pero ya estoy estancado, lo estuve corrigiendo por días pero por mas que le muevo no veo donde esta el problema. :( y bueno el uso del Timer 0 es algo nuevo para mí, apenas estoy aprendiendo del uso de los Pics
-
Es totalmente simulado, en un momento adjunto mi programa de proteus, el oscilador definitivamente no me funciona(hice la prueba mediante el LED)
El código efectivamente lo construí en varios días pero ya estoy estancado, lo estuve corrigiendo por días pero por mas que le muevo no veo donde esta el problema. :( y bueno el uso del Timer 0 es algo nuevo para mí, apenas estoy aprendiendo del uso de los Pics
Pero si ni un led lograbas activar, peor lo demás que quieres hacer.
También es un error lo del for como indica Eduardo2.
Debería ser así:
-
Es totalmente simulado, en un momento adjunto mi programa de proteus, el oscilador definitivamente no me funciona(hice la prueba mediante el LED)
El código efectivamente lo construí en varios días pero ya estoy estancado, lo estuve corrigiendo por días pero por mas que le muevo no veo donde esta el problema. :( y bueno el uso del Timer 0 es algo nuevo para mí, apenas estoy aprendiendo del uso de los Pics
Pero si ni un led lograbas activar, peor lo demás que quieres hacer.
También es un error lo del for como indica Eduardo2.
Debería ser así:
Perdón, apenas estoy aprendiendo y no sabia del error que tenía en el for, agradezco la retroalimentación
-
Algunos errores:
nt i,a;
int b;
int d;
int c;
int a;
a está declarada dos veces. Otro compilador de daría error.
for(a=0;a==3600;a++){
for(b=0;b==3600;b++){
for(c=0;c==3600;c++){
for(d=0;d==3600;d++){
Ninguno de esos for se ejecuta pues la condición a==3600 (y las otras) son falsas de entrada y el for se ejecuta mientras sea verdadera.
LATD= Display[us];
LATBbits.LATB0=1;
__delay_ms(10);
LATBbits.LATB0=0;
LATD= Display[ds];
LATBbits.LATB1=1;
__delay_ms(10);
LATBbits.LATB1=0;
A menos que hayas puesto un transistor para excitar el dígito, la polaridad de RBx está al revés.
Gracias por señalar mis errores, en un momento los corrijo
if(PORTBbits.RB7 == 1){
LATD= Display[us];
LATD= Display[ds];
LATD= Display[cs];
LATD= Display[ms];
}
Esto no es un error, es un misterio: ¿Qué quisiste hacer?
Quería que fuera la función de pausa
-
Algunos errores:
nt i,a;
int b;
int d;
int c;
int a;
a está declarada dos veces. Otro compilador de daría error.
for(a=0;a==3600;a++){
for(b=0;b==3600;b++){
for(c=0;c==3600;c++){
for(d=0;d==3600;d++){
Ninguno de esos for se ejecuta pues la condición a==3600 (y las otras) son falsas de entrada y el for se ejecuta mientras sea verdadera.
LATD= Display[us];
LATBbits.LATB0=1;
__delay_ms(10);
LATBbits.LATB0=0;
LATD= Display[ds];
LATBbits.LATB1=1;
__delay_ms(10);
LATBbits.LATB1=0;
A menos que hayas puesto un transistor para excitar el dígito, la polaridad de RBx está al revés.
if(PORTBbits.RB7 == 1){
LATD= Display[us];
LATD= Display[ds];
LATD= Display[cs];
LATD= Display[ms];
}
Esto no es un error, es un misterio: ¿Qué quisiste hacer?
A parte de eso, tengo dos dudas.
La primera es que la interrupción del temporizador sólo inicializa a un valor, me imagino que es para generar un tiempo fijo, tal vez 1us.
Pero no utiliza para nada en el código principal, sólo en una parte esta volviendo a colocar el valor de inicialización, me imagino que quiere con ese temporizador actualizar las variables que muestra en el display.
Así es, eso era lo que tenía planeado
La segunda, suponiendo que funciona, creo que sería muy difícil visualizar en un display como se incrementa al ritmo de microsegundos. Es decir que talvez desde de milisegundos será posible ver como un display cambia de valores.
-
Lo primero que debes hacer es que te funcione un simple led (activarlo y apagarlo periódicamente).
Superado eso vamos al siguiente paso.