Varje gång jag flashar kortet visas 55:55 innan jag resetar den. Så jag antar att det är ngt default värde alla minnesplatser i eepromet har innan man faktiskt har skrivit till det.
Nu till problemet. När jag använder klockan så händer det rätt ofta efter jag startar om den att den på ngn position visar 55. Trots att det innan avstängning varit ngt helt annat värde.
Jag använder fyra olika minnesplatser för att kunna spara 2 st timpositioner och 2st minut positioner. Sekunder sparas ej. Alla fyra minnesplaster kan ibland visa 55, har dock inte hänt samtidigt.
Har försökt i koden lögga till ngn from av check av minnet men det hjälper nada. Det verkar verkligen som skriving och läsning sker rätt men sedan på ngt sätt blir
minnet korrupt vid avstängning.
Kortet jag har byggt var för en helt annan grej men den används inte längre och det var därför smidigt iom allt med knappar, lcd etc fanns. Så jag sklängde bara på denna koden.
Får också tillägga att när den väl läst 55 så gör den det vid varje omstar tills jag aktivt raderar minnet eller låter klockan räkna upp
Vad tror ni vad är det som sker och vad kan jag prova som åtgärd?
Kod: Markera allt
#define BTN_up PORTB.F1
#define BTN_down PORTB.F2
#define BTN_Start PORTC.F4
short unsigned nSec=0; //Sätt alla varibler för att räkna tid
short unsigned nMin=0;
short unsigned nHour=0;
short unsigned nSec2=0;
short unsigned nMin2=0;
short unsigned nHour2=0;
short unsigned memTest=0;
short int a=1,b=0; //a och b används för knapp status
char MinOut[7]; //sträng för att printa tiden i minut och en för timme
char HourOut[7];
//LCD module connection
sbit LCD_RS at RD7_bit;
sbit LCD_EN at RD6_bit;
sbit LCD_D4 at RD5_bit;
sbit LCD_D5 at RD4_bit;
sbit LCD_D6 at RD3_bit;
sbit LCD_D7 at RC3_bit;
sbit LCD_RS_Direction at TRISD7_bit;
sbit LCD_EN_Direction at TRISD6_bit;
sbit LCD_D4_Direction at TRISD5_bit;
sbit LCD_D5_Direction at TRISD4_bit;
sbit LCD_D6_Direction at TRISD3_bit;
sbit LCD_D7_Direction at TRISC3_bit;
//End LCD module connection
void InitMain(){
//IO direction settings
TRISA=0b00000000;
TRISB=0b00111110;
TRISC=0b00010000;
TRISD=0b00000000;
TRISE=0b00000111;
//Turn of ADC
ANSELA=0b00000000;
ANSELB=0b00000000;
ANSELD=0b00000000;
ANSELE=0b00000000;
//Oscillator set to 4MHz
OSCCON=0b01101010;
LCD_Init();
LCD_Cmd(_LCD_CURSOR_OFF);
Delay_ms(200);
Lcd_out(2,1," KS2021 R1.0");
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);
if(BTN_up==0){ //Reset funktion för att nollställa räknare
Lcd_out(1,1,"Reset $1??");
Lcd_out(2,1," ");
delay_ms(1500);
EEPROM_Write(0x00,0); //Redare inormation i EEPROM minnet
EEPROM_Write(0x01,0);
Lcd_out(1,1,"Reset DONE!!");
while(BTN_up==0){
//wait
}
}
if(BTN_down==0){
Lcd_out(1,1,"Reset $2??");
Lcd_out(2,1," ");
delay_ms(1500);
EEPROM_Write(0x02,0);
EEPROM_Write(0x03,0);
Lcd_out(1,1,"Reset DONE!!");
while(BTN_down==0){
//wait
}
}
Lcd_out(1,1," ");
Lcd_out(2,1," ");
Lcd_out(1,1,"$1 00:00");
Lcd_out(2,1,"$2 00:00");
nMin=EEPROM_Read(0x00);
if(nMIN==55)
nMin=EEPROM_Read(0x00);
//Läs ut innehållet i minnet för att fortsätta på tiden
nHour=EEPROM_Read(0x01);
if(nHour==55) //flera läsningar då ibland korrupt läsning sker
nHour=EEPROM_Read(0x01);
nMin2=EEPROM_Read(0x02);
if(nMin2==55)
nMin2=EEPROM_Read(0x02);
nHour2=EEPROM_Read(0x03);
if(nHour2==55)
nHour2=EEPROM_Read(0x03);
a=EEPROM_Read(0x04);
if(a>2)
a=EEPROM_Read(0x04);
//läs ut senast tid som användes $1 eller $2
IntToStr(nMin,MinOut); //printa ut tiden som visades innan avstänging
Lcd_Out(1,8,MinOut+4);
IntToStr(nHour,HourOut);
Lcd_Out(1,5,HourOut+4);
IntToStr(nMin2,MinOut);
Lcd_Out(2,8,MinOut+4);
IntToStr(nHour2,HourOut);
Lcd_Out(2,5,HourOut+4);
if(a==1){
Lcd_Out(1,15,":)");
Lcd_Out(2,15,":(");
}
else{
Lcd_Out(1,15,":(");
Lcd_Out(2,15,":)");
}
}
void Timer1(){
Lcd_Out(1,15,":)");
Lcd_Out(2,15,":(");
Lcd_Out(1,11,"RUN");
Lcd_Out(2,11," ");
Delay_ms(967); //count each sec
nSec++;
if(nSec==60){
nMin++;
IntToStr(nMin,MinOut);
Lcd_Out(1,8,MinOut+4);
nSec=0;
if(nMin==60){
nHour++;
IntToStr(nHour,HourOut);
Lcd_Out(1,5,HourOut+4);
nMin=0;
}
}
}
void Timer2(){
Lcd_Out(1,15,":(");
Lcd_Out(2,15,":)");
Lcd_Out(1,11," ");
Lcd_Out(2,11,"RUN");
Delay_ms(967); //count each sec
nSec2++;
if(nSec2==60){
nMin2++;
IntToStr(nMin2,MinOut);
Lcd_Out(2,8,MinOut+4);
nSec2=0;
if(nMin2==60){
nHour2++;
IntToStr(nHour2,HourOut);
Lcd_Out(2,5,HourOut+4);
nMin2=0;
}
}
}
void Button_check(){
if(BTN_up==0){
a=1;
while(BTN_down==0){
//wait
}
}
if(BTN_down==0){
a=0;
while(BTN_down==0){
//wait
}
}
if((BTN_Start==0)&&(b==0)){
b=1;
while(BTN_Start==0){
//wait
}
}
if((BTN_Start==0)&&(b==1)){
b=0;
while(BTN_Start==0){
//wait
}
}
}
void Write_Mem(){ //ibland korrupt skrivning blir då alltid 55. Därav extra koll
EEPROM_Write(0x00,nMin);
memTest=EEPROM_Read(0x00);
if(memTest==55)
EEPROM_Write(0x00,nMin);
EEPROM_Write(0x01,nHour);
memTest=EEPROM_Read(0x01);
if(memTest==55)
EEPROM_Write(0x01,nHour);
EEPROM_Write(0x02,nMin2);
memTest=EEPROM_Read(0x02);
if(memTest==55)
EEPROM_Write(0x02,nMin2);
EEPROM_Write(0x03,nHour2);
memTest=EEPROM_Read(0x03);
if(memTest==55)
EEPROM_Write(0x03,nHour2);
EEPROM_Write(0x04,a);
memTest=EEPROM_Read(0x04);
if(memTest>2)
EEPROM_Write(0x04,a);
}
void main() {
InitMain();
while(1){
Button_check();
if(b==1){
if(a==1)
Timer1();
else if(a==0)
Timer2();
}
Write_Mem();
if(b==0){
Lcd_Out(1,11," ");
Lcd_Out(2,11," ");
}
}
}