LED en marcha a diferente velocidad usando el temporizador

0

Soy nuevo en la programación C Quiero programar un LED en funcionamiento en mi PIC24 (PIC24HJ256GP206)

Tengo 5 LED en mi PORT G y tengo entrada PORTB (RB0)

Mi programa debería, si RB0 está conectado a tierra (pongo el puente en mi circuito) el LED funcionará más rápido, de lo contrario, el LED funcionará más lento.

Pero hay un problema, el LED no se está ejecutando.

aquí mi código:

// PIC24HJ256GP206 Configuration Bit Settings

// 'C' sourc#include <p24Hxxxx.h>e line config statements

#include <p24Hxxxx.h>

 int FBS __attribute__((space(prog), address(0xF80000))) = 0xCF ;
//_FBS(
//    BWRP_WRPROTECT_OFF & // Boot Segment Write Protect (Boot Segment may be written)
//    BSS_NO_FLASH &       // Boot Segment Program Flash Code Protection (No Boot program Flash segment)
//    RBS_NO_RAM           // Boot Segment RAM Protection (No Boot RAM)
//);
 int FSS __attribute__((space(prog), address(0xF80002))) = 0xCF ;
//_FSS(
//    SWRP_WRPROTECT_OFF & // Secure Segment Program Write Protect (Secure segment may be written)
//    SSS_NO_FLASH &       // Secure Segment Program Flash Code Protection (No Secure Segment)
//    RSS_NO_RAM           // Secure Segment Data RAM Protection (No Secure RAM)
//);
 int FGS __attribute__((space(prog), address(0xF80004))) = 0x7 ;
//_FGS(
//    GWRP_OFF &           // General Code Segment Write Protect (User program memory is not write-protected)
//    GSS_OFF              // General Segment Code Protection (User program memory is not code-protected)
//);
 int FOSCSEL __attribute__((space(prog), address(0xF80006))) = 0xFF78 ;
//_FOSCSEL(
//    FNOSC_FRC &          // Oscillator Mode (Internal Fast RC (FRC))
//    IESO_OFF             // Two-speed Oscillator Start-Up Enable (Start up with user-selected oscillator)
//);
 int FOSC __attribute__((space(prog), address(0xF80008))) = 0xFFFF ;
//_FOSC(
//    POSCMD_NONE &        // Primary Oscillator Source (Primary Oscillator Disabled)
//    OSCIOFNC_OFF &       // OSC2 Pin Function (OSC2 pin has clock out function)
//    FCKSM_CSDCMD         // Clock Switching and Monitor (Both Clock Switching and Fail-Safe Clock Monitor are disabled)
//);
 int FWDT __attribute__((space(prog), address(0xF8000A))) = 0xFF7F ;
//_FWDT(
//    WDTPOST_PS32768 &    // Watchdog Timer Postscaler (1:32,768)
//    WDTPRE_PR128 &       // WDT Prescaler (1:128)
//    WINDIS_OFF &         // Watchdog Timer Window (Watchdog Timer in Non-Window mode)
//    FWDTEN_OFF           // Watchdog Timer Enable (Watchdog timer enabled/disabled by user software)
//);
 int FPOR __attribute__((space(prog), address(0xF8000C))) = 0xFFFF ;
//_FPOR(
//    FPWRT_PWR128         // POR Timer Value (128ms)
//);
 int FICD __attribute__((space(prog), address(0xF8000E))) = 0xFFDF ;
//_FICD(
//    ICS_PGD1 &           // Comm Channel Select (Communicate on PGC1/EMUC1 and PGD1/EMUD1)
//    JTAGEN_OFF           // JTAG Port Enable (JTAG is Disabled)
//);


 void onled (int LedIdx)
 {
     //set output
     TRISGbits.TRISG1  = 0  ;//PIN60 //D01
     TRISGbits.TRISG0  = 0  ;//PIN61 //D02
     TRISGbits.TRISG13 = 0  ;//PIN64 //D03
     TRISGbits.TRISG14 = 0  ;//PIN62 //DO4
     TRISGbits.TRISG12 = 0  ;//PIN63 //D05

     //Off all the LED/ DO
     LATGbits.LATG1    = 0 ; //DO1 OFF
     LATGbits.LATG0    = 1 ; //DO2 OFF
     LATGbits.LATG13   = 1 ; //DO3 OFF
     LATGbits.LATG14   = 1 ; //DO4 OFF
     LATGbits.LATG12   = 1 ; //DO5 OFF

     //turn on based on LDIDX
     if (LedIdx == 0)
        LATGbits.LATG1    = 1  ;
     else if ( LedIdx == 1 )
         LATGbits.LATG0    = 0 ;
     else if ( LedIdx == 2 )
         LATGbits.LATG13   = 0 ;
     else if ( LedIdx == 3 )
         LATGbits.LATG14   = 0 ;
     else if ( LedIdx == 4 )
           LATGbits.LATG12 = 0 ;
 }

 int main (void)
 {

     int LED = 0;
             // Set Timer
             TMR1 = 0;
             PR1 = 5760 ; //5760 = 100ms // 28571 = 496ms
             //select clock souce souce as Tcy
             T1CONbits.TCS = 0 ;
             // Select pre scaler = 1:256
             T1CONbits.TCKPS = 2;
             //on timer
             T1CONbits.TON=1 ;

     // output = 0 : input = 1
     //set output
     TRISGbits.TRISG1  = 0  ;//PIN60 //D01
     TRISGbits.TRISG0  = 0  ;//PIN61 //D02
     TRISGbits.TRISG13 = 0  ;//PIN64 //D03
     TRISGbits.TRISG14 = 0  ;//PIN62 //DO4
     TRISGbits.TRISG12 = 0  ;//PIN63 //D05

     //Off all the LED/ DO
     LATGbits.LATG1    = 0 ; //DO1 OFF
     LATGbits.LATG0    = 1 ; //DO2 OFF
     LATGbits.LATG13   = 1 ; //DO3 OFF
     LATGbits.LATG14   = 1 ; //DO4 OFF
     LATGbits.LATG12   = 1 ; //DO5 OFF

     TRISBbits.TRISB0 = 1 ;
     //set all anolog pin to digital
     AD1PCFGL = 0xFFFF;


     while (1) // keep looping
     {

         if (PORTBbits.RB0 == 0 )
         {
                         // Set Timer
             TMR1 = 0;
             PR1 = 5760 ; //5760 = 100ms // 28571 = 496ms
             //select clock souce souce as Tcy
             T1CONbits.TCS = 0 ;
             // Select pre scaler = 1:256
             T1CONbits.TCKPS = 2;
             //on timer
             T1CONbits.TON=1 ;

             if (IFS0bits.T1IF == 1 ) //SET FLAG TO 1
             {

                 LATGbits.LATG0 = 1; //check timer
                 IFS0bits.T1IF = 0 ;

                 onled (LED);
                 LED++;
                 // Only have 5 LED
                 if (LED >= 5)
                     LED = 0 ;
             }
         }

         else
         {
                     // Set Timer
             TMR1 = 0;
             PR1 = 5760 ; //5760 = 100ms // 28571 = 496ms
             //select clock souce souce as Tcy
             T1CONbits.TCS = 0 ;
             // Select pre scaler = 1:256
             T1CONbits.TCKPS = 2;
             //on timer
             T1CONbits.TON=1 ;

             if (IFS0bits.T1IF == 1 ) //
             {               

                 LATGbits.LATG0 = 1; //check timer
                 IFS0bits.T1IF = 0 ;

                 onled (LED);
                 LED++;
                 // Only have 5 LED
                 if (LED >= 5)
                     LED = 0 ;
             }
         }
     }
 }
    
pregunta Nazif Jaafar

1 respuesta

2

El bucle principal está reiniciando continuamente el temporizador, por lo que el temporizador nunca caducará y establecerá la bandera.

En este caso, solo deberías reiniciar el temporizador después de que el temporizador haya caducado y se haya establecido el indicador del temporizador.

    
respondido por el HandyHowie

Lea otras preguntas en las etiquetas