Tengo problemas con la configuración del reloj en mi PIC32.
Un minuto tiene una duración de 10 segundos con la configuración actual.
¿Alguien sabe dónde debo cambiar mi configuración?
Aquí está el código:
// Master header file for all peripheral library includes
#include
// configuration settings
#pragma config FNOSC = PRIPLL, POSCMOD = HS, FPLLMUL = MUL_18, FPLLIDIV = DIV_2, FPBDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FWDTEN = OFF
// pin definitions
#define PPEins LATFbits.LATF4
#define PPZwei LATDbits.LATD15
#define PPDrei LATDbits.LATD14
#define PPVier LATBbits.LATB15
#define MHUhr LATBbits.LATB3 // provisorisch
#define PMFuenf LATBbits.LATB11
#define PMZehn LATBbits.LATB10
#define PMViertel LATAbits.LATA15
#define PMZwanzig LATAbits.LATA1
#define PMVor LATAbits.LATA14
#define PMNach LATAbits.LATA5
#define PMHalb LATFbits.LATF13
#define PHEins LATAbits.LATA4
#define PHZwei LATAbits.LATA3
#define PHDrei LATFbits.LATF12
#define PHVier LATAbits.LATA2
#define PHFuenf LATBbits.LATB13
#define PHSechs LATBbits.LATB12
#define PHSieben LATFbits.LATF8
#define PHAcht LATFbits.LATF2
#define PHNeun LATBbits.LATB14
#define PHZehn LATFbits.LATF5
#define PHElf LATBbits.LATB5 // provisorisch
#define PHZwoelf LATEbits.LATE9 // provisorisch
// + BUTTON SETTINGS
// D2 Als output für (5V Ersatz) für Buttons definieren
// und auch gleich als high setzen
// + BUZZER SETTINGS
int main(void) {
// PORT SETTINGS
DDPCONbits.JTAGEN = 0; // disable JTAGport, free up PORTA
TRISFbits.TRISF4 = 0; // PPEins
TRISDbits.TRISD15 = 0; // PPZwei
TRISDbits.TRISD14 = 0; // PPDrei
TRISBbits.TRISB15 = 0; // PPVier
// TODO: TRIS für PMUhr
TRISBbits.TRISB11 = 0; // PMFuenf
TRISBbits.TRISB10 = 0; // PMZehn
TRISAbits.TRISA15 = 0; // PMViertel
TRISAbits.TRISA1 = 0; // PMZwanzig
TRISAbits.TRISA14 = 0; // PMVor
TRISAbits.TRISA5 = 0; // PMNach
TRISFbits.TRISF13 = 0; // PMHalb
TRISAbits.TRISA4 = 0; // PHEins
TRISAbits.TRISA3 = 0; // PHZwei
TRISFbits.TRISF12 = 0; // PHDrei
TRISAbits.TRISA2 = 0; // PHVier
TRISBbits.TRISB13 = 0; // PHFuenf
TRISBbits.TRISB12 = 0; // PHSechs
TRISFbits.TRISF8 = 0; // PHSieben
TRISFbits.TRISF2 = 0; // PHAcht
TRISBbits.TRISB14 = 0; // PHNeun
TRISFbits.TRISF5 = 0; // PHZehn
// TODO: elf
// TODO: zwölf
// Initial pin settings
PPEins = 0;
PPZwei = 0;
PPDrei = 0;
PPVier = 0;
MHUhr = 0;
PMFuenf = 0;
PMZehn = 0;
PMViertel = 0;
PMZwanzig = 0;
PMVor = 0;
PMNach = 0;
PMHalb = 0;
PHEins = 0;
PHZwei = 0;
PHDrei = 0;
PHVier = 0;
PHFuenf = 0;
PHSechs = 0;
PHSieben = 0;
PHAcht = 0;
PHNeun = 0;
PHZehn = 0;
PHElf = 0;
PHZwoelf = 0;
rtccTime tm, tAlrm; // time structure
rtccDate dt, dAlrm; // date structure
// Configure the device for maximum performance.
// This macro sets flash wait states, PBCLK divider and DRM wait states based on the specified
// clock frequency. It also turns on the cache mode if avaialble.
// Based on the current frequency, the PBCLK divider will be set at 1:2. This knoweldge
// is required to correctly set UART baud rate, timer reload value and other time sensitive
// setting.
SYSTEMConfigPerformance(72000000L);
PPEins = 1;
delay_us(1000000); // TEST 1
PPEins = 0;
RtccInit(); // init the RTCC
while(RtccGetClkStat()!=RTCC_CLK_ON); // wait for the SOSC to be actually running and RTCC to have its clock source
// could wait here at most 32ms
PPZwei = 1;
delay_us(1000000); // TEST 2
PPZwei = 0;
RtccOpen(0x10073000, 0x07011602, 0);
PPDrei = 1;
delay_us(1000000); // TEST 3
PPDrei = 0;
while(1){
RtccGetTimeDate(&tm, &dt);
// update single minutes
int singleminutes = (int) (unbcd(tm.min)%5);
switch(singleminutes){
case 0:
PPEins = 0;
PPZwei = 0;
PPDrei = 0;
PPVier = 0;
break;
case 1:
PPEins = 1;
PPZwei = 0;
PPDrei = 0;
PPVier = 0;
break;
case 2:
PPEins = 1;
PPZwei = 1;
PPDrei = 0;
PPVier = 0;
break;
case 3:
PPEins = 1;
PPZwei = 1;
PPDrei = 1;
PPVier = 0;
break;
case 4:
PPEins = 1;
PPZwei = 1;
PPDrei = 1;
PPVier = 1;
break;
}
// update 5 minutes
int nfminutes = (int) (unbcd(tm.min)/5);
switch(nfminutes){
case 0:
MHUhr = 1;
PMFuenf = 0;
PMZehn = 0;
PMViertel = 0;
PMZwanzig = 0;
PMVor = 0;
PMNach = 0;
PMHalb = 0;
break;
case 1:
MHUhr = 0;
PMFuenf = 1;
PMZehn = 0;
PMViertel = 0;
PMZwanzig = 0;
PMVor = 0;
PMNach = 1;
PMHalb = 0;
break;
case 2:
MHUhr = 0;
PMFuenf = 0;
PMZehn = 1;
PMViertel = 0;
PMZwanzig = 0;
PMVor = 0;
PMNach = 1;
PMHalb = 0;
break;
case 3:
MHUhr = 0;
PMFuenf = 0;
PMZehn = 0;
PMViertel = 1;
PMZwanzig = 0;
PMVor = 0;
PMNach = 1;
PMHalb = 0;
break;
case 4:
MHUhr = 0;
PMFuenf = 0;
PMZehn = 0;
PMViertel = 0;
PMZwanzig = 1;
PMVor = 0;
PMNach = 1;
PMHalb = 0;
break;
case 5:
MHUhr = 0;
PMFuenf = 1;
PMZehn = 0;
PMViertel = 0;
PMZwanzig = 0;
PMVor = 1;
PMNach = 0;
PMHalb = 1;
break;
case 6:
MHUhr = 0;
PMFuenf = 0;
PMZehn = 0;
PMViertel = 0;
PMZwanzig = 0;
PMVor = 0;
PMNach = 0;
PMHalb = 1;
break;
case 7:
MHUhr = 0;
PMFuenf = 1;
PMZehn = 0;
PMViertel = 0;
PMZwanzig = 0;
PMVor = 0;
PMNach = 1;
PMHalb = 1;
break;
case 8:
MHUhr = 0;
PMFuenf = 0;
PMZehn = 0;
PMViertel = 0;
PMZwanzig = 1;
PMVor = 1;
PMNach = 0;
PMHalb = 0;
break;
case 9:
MHUhr = 0;
PMFuenf = 0;
PMZehn = 0;
PMViertel = 1;
PMZwanzig = 0;
PMVor = 1;
PMNach = 0;
PMHalb = 0;
break;
case 10:
MHUhr = 0;
PMFuenf = 0;
PMZehn = 1;
PMViertel = 0;
PMZwanzig = 0;
PMVor = 1;
PMNach = 0;
PMHalb = 0;
break;
case 11:
MHUhr = 0;
PMFuenf = 1;
PMZehn = 0;
PMViertel = 0;
PMZwanzig = 0;
PMVor = 1;
PMNach = 0;
PMHalb = 0;
break;
}
// update hours
int hours = (int) (unbcd(tm.hour)%12);
if(nfminutes>=5) hours++;
switch(hours){
case 0:
PHEins = 0;
PHZwei = 0;
PHDrei = 0;
PHVier = 0;
PHFuenf = 0;
PHSechs = 0;
PHSieben = 0;
PHAcht = 0;
PHNeun = 0;
PHZehn = 0;
PHElf = 0;
PHZwoelf = 1;
break;
case 1:
PHEins = 1;
PHZwei = 0;
PHDrei = 0;
PHVier = 0;
PHFuenf = 0;
PHSechs = 0;
PHSieben = 0;
PHAcht = 0;
PHNeun = 0;
PHZehn = 0;
PHElf = 0;
PHZwoelf = 0;
break;
case 2:
PHEins = 0;
PHZwei = 1;
PHDrei = 0;
PHVier = 0;
PHFuenf = 0;
PHSechs = 0;
PHSieben = 0;
PHAcht = 0;
PHNeun = 0;
PHZehn = 0;
PHElf = 0;
PHZwoelf = 0;
break;
case 3:
PHEins = 0;
PHZwei = 0;
PHDrei = 1;
PHVier = 0;
PHFuenf = 0;
PHSechs = 0;
PHSieben = 0;
PHAcht = 0;
PHNeun = 0;
PHZehn = 0;
PHElf = 0;
PHZwoelf = 0;
break;
case 4:
PHEins = 0;
PHZwei = 0;
PHDrei = 0;
PHVier = 1;
PHFuenf = 0;
PHSechs = 0;
PHSieben = 0;
PHAcht = 0;
PHNeun = 0;
PHZehn = 0;
PHElf = 0;
PHZwoelf = 0;
break;
case 5:
PHEins = 0;
PHZwei = 0;
PHDrei = 0;
PHVier = 0;
PHFuenf = 1;
PHSechs = 0;
PHSieben = 0;
PHAcht = 0;
PHNeun = 0;
PHZehn = 0;
PHElf = 0;
PHZwoelf = 0;
break;
case 6:
PHEins = 0;
PHZwei = 0;
PHDrei = 0;
PHVier = 0;
PHFuenf = 0;
PHSechs = 1;
PHSieben = 0;
PHAcht = 0;
PHNeun = 0;
PHZehn = 0;
PHElf = 0;
PHZwoelf = 0;
break;
case 7:
PHEins = 0;
PHZwei = 0;
PHDrei = 0;
PHVier = 0;
PHFuenf = 0;
PHSechs = 0;
PHSieben = 1;
PHAcht = 0;
PHNeun = 0;
PHZehn = 0;
PHElf = 0;
PHZwoelf = 0;
break;
case 8:
PHEins = 0;
PHZwei = 0;
PHDrei = 0;
PHVier = 0;
PHFuenf = 0;
PHSechs = 0;
PHSieben = 0;
PHAcht = 1;
PHNeun = 0;
PHZehn = 0;
PHElf = 0;
PHZwoelf = 0;
break;
case 9:
PHEins = 0;
PHZwei = 0;
PHDrei = 0;
PHVier = 0;
PHFuenf = 0;
PHSechs = 0;
PHSieben = 0;
PHAcht = 0;
PHNeun = 1;
PHZehn = 0;
PHElf = 0;
PHZwoelf = 0;
break;
case 10:
PHEins = 0;
PHZwei = 0;
PHDrei = 0;
PHVier = 0;
PHFuenf = 0;
PHSechs = 0;
PHSieben = 0;
PHAcht = 0;
PHNeun = 0;
PHZehn = 1;
PHElf = 0;
PHZwoelf = 0;
break;
case 11:
PHEins = 0;
PHZwei = 0;
PHDrei = 0;
PHVier = 0;
PHFuenf = 0;
PHSechs = 0;
PHSieben = 0;
PHAcht = 0;
PHNeun = 0;
PHZehn = 0;
PHElf = 1;
PHZwoelf = 0;
break;
}
// BUTTON CHECKING
} // end: while(1)
}
int unbcd(int bcd) {
return ((bcd>>4)*10)+bcd%16;
}
int bcd(int dec) {
return ((dec/10)