Autor Tema: Cronómetro con pic18f4550  (Leído 1559 veces)

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

Desconectado JOSIP151

  • PIC10
  • *
  • Mensajes: 5
Cronómetro con pic18f4550
« 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;
    }
}

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Cronómetro con pic18f4550
« Respuesta #1 en: 30 de Noviembre de 2021, 09:31:54 »
¿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?
« Última modificación: 30 de Noviembre de 2021, 09:34:49 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Cronómetro con pic18f4550
« Respuesta #2 en: 30 de Noviembre de 2021, 11:42:49 »
Algunos errores:

Citar
nt i,a;
int b;
int d;
int c;
int a;

a está declarada dos veces.   Otro compilador de daría error.


Código: [Seleccionar]
            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.

Código: [Seleccionar]
    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.


Código: [Seleccionar]
        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?

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Cronómetro con pic18f4550
« Respuesta #3 en: 30 de Noviembre de 2021, 12:25:39 »
Algunos errores:

Citar
nt i,a;
int b;
int d;
int c;
int a;

a está declarada dos veces.   Otro compilador de daría error.


Código: [Seleccionar]
            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.

Código: [Seleccionar]
    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.


Código: [Seleccionar]
        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.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado JOSIP151

  • PIC10
  • *
  • Mensajes: 5
Re:Cronómetro con pic18f4550
« Respuesta #4 en: 30 de Noviembre de 2021, 13:06:50 »
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

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Cronómetro con pic18f4550
« Respuesta #5 en: 30 de Noviembre de 2021, 13:14:11 »
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í:
Código: C
  1. for(a=0;a<=3600;a++)
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado JOSIP151

  • PIC10
  • *
  • Mensajes: 5
Re:Cronómetro con pic18f4550
« Respuesta #6 en: 30 de Noviembre de 2021, 13:26:45 »
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

Citar
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í:
Código: C
  1. for(a=0;a<=3600;a++)
Perdón, apenas estoy aprendiendo y no sabia del error que tenía en el for, agradezco la retroalimentación

Desconectado JOSIP151

  • PIC10
  • *
  • Mensajes: 5
Re:Cronómetro con pic18f4550
« Respuesta #7 en: 30 de Noviembre de 2021, 13:28:57 »
Citar
Algunos errores:

Citar
nt i,a;
int b;
int d;
int c;
int a;

a está declarada dos veces.   Otro compilador de daría error.


Código: [Seleccionar]
            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.

Código: [Seleccionar]
    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

Citar
Código: [Seleccionar]
        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

Desconectado JOSIP151

  • PIC10
  • *
  • Mensajes: 5
Re:Cronómetro con pic18f4550
« Respuesta #8 en: 30 de Noviembre de 2021, 13:30:17 »
Algunos errores:

Citar
nt i,a;
int b;
int d;
int c;
int a;

a está declarada dos veces.   Otro compilador de daría error.


Código: [Seleccionar]
            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.

Código: [Seleccionar]
    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.


Código: [Seleccionar]
        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.

Citar
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.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Cronómetro con pic18f4550
« Respuesta #9 en: 30 de Noviembre de 2021, 13:45:21 »
Lo primero que debes hacer es que te funcione un simple led (activarlo y apagarlo periódicamente).

Superado eso vamos al siguiente paso.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything