Hi
Have this setup of 16F18877
When starts up all works like i should.
When i execute the sub "sluk_ur" sub to stop timer1
the time stops at it should, but after setting the time, i will have to execute the sub "start_ur".
the sub ran ok, but when it return to MAIN WHILE LOOP. the execution is stopped.
I have enabled all timers and interrupts i have "stopped" in "sluk_ur" sub.
Cleared all interrupts.,
Just dont know why i will not keeps going.
Only a part of code, but this part fails to "restart" after TIMER1 is stopped ( or just interrupt from it is disabled)
Have this setup of 16F18877
When starts up all works like i should.
When i execute the sub "sluk_ur" sub to stop timer1
the time stops at it should, but after setting the time, i will have to execute the sub "start_ur".
the sub ran ok, but when it return to MAIN WHILE LOOP. the execution is stopped.
I have enabled all timers and interrupts i have "stopped" in "sluk_ur" sub.
Cleared all interrupts.,
Just dont know why i will not keeps going.
Code:
#include "lcd3.c"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma config FEXTOSC=XT
#pragma config RSTOSC=EXT1X
#pragma config CLKOUTEN=OFF
#pragma config CSWEN=ON
#pragma config FCMEN=ON
#pragma config MCLRE=ON
#pragma config PWRTE=OFF
#pragma config LPBOREN=OFF
#pragma config BOREN=ON
#pragma config BORV=LO
#pragma config ZCD=OFF
#pragma config PPS1WAY=ON
#pragma config STVREN=ON
#pragma config WDTCPS=WDTCPS_31
#pragma config WDTE=OFF
#pragma config WDTCWS=WDTCWS_7
#pragma config WDTCCS=SC
#pragma config WRT=OFF
#pragma config SCANE=available
#pragma config LVP=ON
#pragma config CP=OFF
#pragma config CPD=OFF
#define _XTAL_FREQ 4000000
#define FOSC 4000000L
#define back_light RB0
#define led1_on RE0
#define KN1 RC3
#define KN2 RC2
#define KN3 RA2
#define KN4 RA3
#define KN5 RC7
#define KN6 RC6
#define KN7 RC5
#define KN8 RC4
#define Skip_ROM 0xCC
#define Convert_T 0x44
#define Read_scratchpad 0xBE
#define Port_18B20 RB5
#define Tx_18B20 TRISB5 = 0
#define Rx_18B20 TRISB5 = 1
#define WAIT1 1000
#define WAIT2 500
#define DS18B20_CONV_TIME 750
#define DS18B20_RESET_PULSE 480
#define DS18B20_WAIT_TIME 60
#define DS18B20_PULLUP_TIME 2
#define ONEWIRE_PRESENT 0
#define ONEWIRE_ABSENT 1
unsigned int secund,hour,minut,rain,rainmonth,rainyear,shifttick,inaktiv;
unsigned int rainyear_part1,rainyear_part2,calyear,calmonth,caldate,calday;
unsigned char timestr[6],minutstr[6],secstr[6],rainstr[6],datestr[6];
bit sec,rainincome,showrain,knap4,knap1,knap2,knap3,knap5,knap6,knap7,knap8,leapyear;
unsigned char lsb;
unsigned char msb;
unsigned char decimal;
unsigned char buffer[11];
unsigned int sign_flag =0;
unsigned int integer =0;
unsigned int integer1 =0;
unsigned int integer2 =0;
unsigned int integer3 =0;
unsigned int integer4 =0;
signed int min,max,minold,minhele,minfraction,maxhele,maxfraction,total,fraction,now;
int tempmax,minnegativ,maxnegativ;
char hele[10],deci[10];
int xpulse,x,negativ,maxxpulse;
char test[10];
unsigned char raindays[31];
volatile unsigned char week_day;
unsigned char mintime[3],maxx[3];
unsigned char maxtime[3],minx[3];
char mintemp[3],maxtemp[3];
const char * const day_of_week_names[] = {"Mandag ",
"Tirsdag",
"Onsdag ",
"Torsdag",
"Fredag ",
"Lordag ",
"Sondag "
};
static void interrupt isr(void) // Here is interrupt function - the name is unimportant.
{
if(TMR1IF) // Was this a timer overflow?
{
TMR1IF=0; // Clear interrupt flag, ready for next
TMR1L=0x00;
TMR1H=0x80; // If we set TMR1 to start at 0x8000 (32768), the TMR1 will overflow every 1 second
sec=1; // adds a sec.
}
if (IOCAF4) // if pulse on RA4. rain income
{
rainincome=1; // set bit to main loop
IOCAF4=0; // clear interrupt.
}
if (IOCCF2) // button 2 pressed.// set time.
{inaktiv=0; //just to turn off bcklight when nothing happpens
back_light=1; // turns on backlight
knap2=1; // set bit to main loop
IOCCN2=0; // disable intterrupt,.for this button for now
IOCCF2=0; // clear the interrupt
}
if (IOCAF3) // buttom 4 pressed.
{
inaktiv=0; ////just to turn off bcklight when nothing happpens
back_light=1;// turns on backlight
knap4=1; // set bit to main loop
IOCAF3=0; // clear interrupt-
}
}
void setup(void)
{
TRISA0=1; //set all A port in
TRISA1=1;
TRISA2=1;
TRISA3=1;
TRISA4=1;
TRISA5=1;
TRISA6=1;
TRISA7=1;
TRISB0=0; // port b0 = out
TRISB3=0; // PORT B3 = out
TRISB5=1;// CHANGE
TRISB6=1;
TRISB7=1;
TRISC0=1; // ALL C = IN
TRISC1=1;
TRISC2=1;
TRISC3=1;
TRISC4=1;
TRISC5=1;
TRISC6=1;
TRISC7=1;
TRISD0=0; // ALL D = out
TRISD1=0;
TRISD2=0;
TRISD3=0;
TRISD4=0;
TRISD5=0;
TRISD6=0;
TRISD7=0;
TRISE0=0; // E0 = out
TRISE1=1;
TRISE2=1;
WPUE1=1; // PULL UP no neeed have pullups. do it anyway
WPUE2=1;
WPUC2=1;
WPUC3=1;
WPUC4=1;
WPUC5=1;
WPUC6=1;
WPUC7=1;
IOCAN2=1; // negativ interrupt A2
IOCAN3=1; // negativ interrupt A3
IOCAP4=1; // interrupt on pin RA4 positive
IOCCN2=1; // negativ interrupt C2
IOCCN3=1; // negativ interrupt C3
ANSELA=0b00000000; // set alle digital.
ANSELB=0b00000000;
ANSELC=0b00000000;
ANSELD=0b00000000;
ANSELE=0b0000;
//timer 1 setup
T1CS0=0; // 0110 = SOCS
T1CS1=1;
T1CS2=1;
T1CS3=0;
T1CKPS0=0; // no prescale
T1CKPS1=0;
nT1SYNC=1; // no sync
lcd3_init();
lcd3_goto(0);
}
void start_ur (void) // Starter uret.
{
RE0=0; // kill LED.
TMR1IF=0; // clear interrupts timer1
IOCAF4=0; // RA4
IOCAF2=0; //RA2 = knap3
IOCAF3=0; // RA3 = Knap4
IOCCF2=0; // RC2= knap 2
IOCCF3=0; // RC3 = Knap1
IOCIE=1; // enable IOC
PEIE=1; // enable interrupr
IOCCN2=1; // interrupt knap2 again
TMR1IE=1; // enable interrupr for timer1
GIE=1; // enable global interrupr
} // slut "sub "start ur"
void sluk_ur (void) // Slukker uret
{
IOCIE=0; // disable IOC
TMR1IE=0; // disable interrupr for timer1
GIE=0; // disable global interrupr
PEIE=0; // disable interrupt
secund=0; // sets sec = 0
RE0=1; // turn on led
}// slut "sub sluk ur "
void vis_timedate (void)
{
lcd4_goto(0x03);
lcd4_puts("TIME AND DATE");
lcd4_goto(0x40);
lcd4_puts("Time is = : :");
lcd4_goto(0x4b);
if (hour<10)lcd4_puts("0");
utoa(rainstr,hour,10);
lcd4_puts(rainstr);
lcd4_goto(0x4e);
if (minut<10)lcd4_puts("0");
utoa(rainstr,minut, 10);
lcd4_puts(rainstr);
lcd4_goto(0x51);
if (secund<10)lcd4_puts("0");
utoa(rainstr,secund,10);
lcd4_puts(rainstr);
lcd4_goto(0x14);
lcd4_puts("Date is = - -");
lcd4_goto(0x1e);
if (caldate<10)lcd4_puts("0");
utoa(datestr,caldate,10);
lcd4_puts(datestr);
lcd4_goto(0x21);
if (calmonth<10)lcd4_puts("0");
utoa(rainstr,calmonth,10);
lcd4_puts(rainstr);
lcd4_goto(0x24);
utoa(rainstr,calyear,10);
lcd4_puts(rainstr);
lcd4_goto(0x54);
lcd4_puts("Day is ");
for (unsigned char i=0;i<7;i++) lcd4_putch(day_of_week_names[calday][i]);
}
void stil_ur (void) //Indstiller uret
{
sluk_ur(); // Stopper tiden if times stop, then change lcd stops.
lcd4_clear();
vis_timedate(); // Viser uret / time date show
//secund=0;
do // Læser på knapperne
{
if (!RA2) // Stiller timer fremad
{
hour++; // Lægger en time til
if (hour==24) hour=0; // hvis timer = 24 så 0.
vis_timedate(); // viser vi har talt en op
__delay_ms(255); // venter lidt.
__delay_ms(255);
}
if (!RA3) // Stiller minutter frem
{
minut++; // lægger 1 minut til.
if (minut==60) minut=0;// hvis minut = 60 så 0.
vis_timedate(); // viser vi har talt op.
__delay_ms(255); // venter lidt.
__delay_ms(255);
}
if (!RC2) // Stiller ugedagen
{
calday++; // lægger 1 dag til.
if (calday==7) calday=0; // hvis dag 7 så dag 0.
vis_timedate(); // viser vi har talt op.
__delay_ms(255); // venter lidt.
}
if (!RC6) // Stiller date
{
caldate++; // lægger 1 dag til.
if (caldate==32) caldate=1; // hvis dag 7 så dag 0.
vis_timedate(); // viser vi har talt op.
__delay_ms(255); // venter lidt.
}
if (!RC5) // Stiller month
{
calmonth++; // lægger 1 dag til.
if (calmonth==13) calmonth=1; // hvis moned 13 så 1.
vis_timedate(); // viser vi har talt op.
__delay_ms(255); // venter lidt.
}
if (!RC4) // Stiller året
{
calyear++; // lægger 1 dag til.
vis_timedate(); // viser vi har talt op.
__delay_ms(255); // venter lidt.
}
if (!RC7) // Stiller året ned
{
calyear--; // trækker 1 dag fra.
vis_timedate(); // viser vi har talt op.
__delay_ms(255); // venter lidt.
}
} while (RC3); // indtil knappen trykkes igen
start_ur(); //Starter uret
}// end stil uret
void main (void)
{
setup();
IOCAF4=0; // clear the interrupt for RA4.
T1RD16=1; // turn on timer1
TMR1ON=1; // turn on timer1
T1GE=0; // gate allways count
IOCIE=1; // enable IOC
TMR1IE=1; // enable interrupr for timer1
GIE=1; // enable global interrupr
PEIE=1; // enable interrupr
while (1)
{
if (knap2==1) // set time/date
{
int p;
p=0;
while (p<30) // repaet until 100*30=3 SEC
{
__delay_ms(100);
p++;
}
if (RC2==0) // if stilled pressed after 2 sec.
{
knap2=0;
stil_ur(); // go to sub set clock
}
}
if (sec==1) // if secund tick.
{ secund++;
// klokken();
inaktiv++;
sec=0;
}
if (inaktiv==30) // things to do when inactiv
{
back_light=0;
inaktiv=0;
}
}