1. FroceMaster

    Thread Starter Member

    Jan 28, 2012
    400
    4
    Hi
    Have this setup and more.
    But for easy sake i just do this.
    When pressed on the button the MCU normal Counts ( TMR0 ) input,
    But if i hold the switch just a half second or more the MCU reboots.
    Why ?
     
  2. joeyd999

    AAC Fanatic!

    Jun 6, 2011
    2,672
    2,706
    Crystal ball is still broken. Need code.
     
  3. FroceMaster

    Thread Starter Member

    Jan 28, 2012
    400
    4
    He he, good one ;)

    Ok, here it is.
    Code (C):
    1.  
    2. #include <htc.h>
    3. #include <stdio.h>
    4. #include <stdlib.h>
    5. #include "lcd.h"
    6. #include <string.h>
    7.  
    8. #pragma config FOSC = INTOSC      // Oscillator Selection Bits (XT Oscillator, Crystal/resonator connected between OSC1 and OSC2 pins)
    9. #pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
    10. #pragma config PWRTE = ON       // Power-up Timer Enable (PWRT disabled)
    11. #pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
    12. #pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
    13. #pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset enabled)
    14. #pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
    15. #pragma config IESO = OFF       // Internal/External Switchover Mode (Internal/External Switchover Mode is enabled)
    16. #pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
    17.  
    18. // CONFIG2
    19. #pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
    20. #pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
    21. #pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
    22. #pragma config LPBOR = OFF      // Low-Power Brown Out Reset (Low-Power BOR is disabled)
    23. #pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)
    24.  
    25. #define _XTAL_FREQ 8000000
    26. #define FOSC 2000000L
    27.  
    28. #define set_hour RB4 //Buttons
    29. #define set_minut RC2
    30. #define set_week RC1
    31. #define set_time RC3
    32.  
    33. #define SCS_BIT                0x01
    34. #define INT_OSC_8MHZ         (0b01110000 | SCS_BIT)
    35.  
    36. #define Skip_ROM             0xCC
    37. #define Convert_T             0x44
    38. #define Read_scratchpad     0xBE
    39.  
    40. #define Port_18B20             RB5
    41. #define Tx_18B20             TRISB5 = 0
    42. #define Rx_18B20             TRISB5 = 1
    43.  
    44. #define WAIT1                1000
    45. #define WAIT2                500
    46.  
    47. #define DS18B20_CONV_TIME    750
    48. #define DS18B20_RESET_PULSE 480
    49. #define DS18B20_WAIT_TIME     60
    50. #define DS18B20_PULLUP_TIME 2
    51.  
    52. #define ONEWIRE_PRESENT     0
    53. #define ONEWIRE_ABSENT         1
    54.  
    55. unsigned char lsb;
    56.     unsigned char msb;
    57.     unsigned char decimal;
    58.     unsigned char buffer[11];
    59.     unsigned int sign_flag =0;
    60.     unsigned int integer =0;
    61.     unsigned int integer1 =0;
    62.     unsigned int integer2 =0;
    63.     unsigned int integer3 =0;
    64.     unsigned int integer4 =0;
    65.     signed int min,max,minold,minhele,minfraction,maxhele,maxfraction,total,fraction,now;
    66.     int tempmax,minnegativ,maxnegativ;
    67.     char hele[10],deci[10];
    68. bit sec,vis;
    69. int xpulse,secund,minut,hour,x,today_rain,r_regn,rainTMR0,visning,f_gennemlob,negativ;
    70. char test[10];
    71. unsigned char raindays[31];
    72. volatile unsigned char week_day;
    73. unsigned char mintime[3],maxx[3];
    74. unsigned char maxtime[3],minx[3];
    75. char mintemp[3],maxtemp[3];
    76.  
    77. const char * const day_of_week_names[] = {"Mandag ",
    78.                                           "Tirsdag",
    79.                                           "Onsdag ",
    80.                                           "Torsdag",
    81.                                           "Fredag ",
    82.                                           "Lordag ",
    83.                                           "Sondag "
    84.                                          };
    85.  
    86. static void interrupt isr(void)   // Here is interrupt function - the name is unimportant.
    87. {
    88. if(TMR2IF)
    89. {
    90. TMR2IF=0;
    91. xpulse++;
    92. if (xpulse==25)
    93. { xpulse=0;
    94. sec=1;
    95. //RA0=!RA0;
    96. }
    97. }
    98. }
    99. void setup (void)
    100. {
    101.  
    102. IRCF0=0; //8 mhz
    103. IRCF1=1;
    104. IRCF2=1;
    105. IRCF3=1;
    106. TRISA=0; //set all port out
    107. TRISA2=1; // set port 2 in
    108. TRISA4=1; // set port 4 ind.
    109. TRISA5=1; // set port 5 ind.
    110. TRISB4=1; // port B 4 in
    111. TRISB5=1; // port b 5 in // temp
    112. TRISB6=0; // b6 ud
    113. TRISB7=1; // port b7 in
    114. TRISC0=0;
    115. TRISC1=1;
    116. TRISC2=1;
    117. TRISC3=1;
    118. TRISC4=0;
    119. TRISC5=0;
    120. TRISC6=0;
    121. TRISC7=0;
    122. OSCCON = INT_OSC_8MHZ;
    123.  
    124. CM1CON0 = 0;
    125.     CM2CON0 = 0;
    126. //Timer 0 is counter to rain. input RA2
    127. TMR0CS=1; //use t0cki.
    128. PSA=1; // no prescaller
    129. TMR0SE=1; // high to low transiton
    130.  
    131. // TIMER 2.....
    132. T2CKPS0=1;//Prescale 64
    133. T2CKPS1=1;
    134. T2OUTPS0=1; // postscale 10
    135. T2OUTPS1=0;
    136. T2OUTPS2=0;
    137. T2OUTPS3=1;
    138. PR2=0x7F; // 126
    139.  
    140. GIE = 0;  // Global interrupt disable just in case
    141. //ANSELA = 0b00000001;  // Set PORT AN0 to analog input AN1 to AN7 digital I/O
    142. ANSELA=0; // set alle digital.
    143. ANSELB=0;
    144. ANSELC=0;//turn off all analog functions
    145. lcd_init();
    146. //T1CKPS1=1;
    147. //T1CKPS0=1;
    148. //nT1SYNC=1;
    149. }
    150. void vis_maxmin(void) // viser max og min
    151. {        
    152.                 lcd_clear();
    153.                 lcd_goto(0x00);
    154.                 lcd_puts(day_of_week_names[mintime[2]]);
    155.                 if (mintime[2]!=1 || mintime[2]!=3)
    156.                 {
    157.                 lcd_puts(" ");
    158.                     }  
    159.                 if (mintime[0]<10)lcd_puts("0");
    160.                 utoa(minx, mintime[0], 10);
    161.                 lcd_puts(minx);
    162.                 lcd_puts(":");
    163.                 if (mintime[1]<10)lcd_puts("0");
    164.                 utoa(minx, mintime[1], 10);
    165.                 lcd_puts(minx);
    166.                 lcd_puts(" ");
    167.                 if (minnegativ!=0)
    168.                 {
    169.                     minhele=(500-min)/10;
    170.                     minfraction= (500-min)-(minhele*10);
    171.                 }
    172.                 if (minnegativ==0)
    173.                 {
    174.                  minhele=(min-500)/10;
    175.                 minfraction= (min-500)-(minhele*10);
    176.                 }
    177.                 utoa(mintemp,minhele,10);
    178.                 if (minhele<10)lcd_puts(" ");
    179.                 lcd_puts(mintemp);
    180.                 lcd_puts(".");
    181.                 utoa(mintemp,minfraction,10);
    182.                 lcd_puts(mintemp);
    183.                 lcd_puts("ß");
    184.  
    185.                 // max temp kl bob bob
    186.                 lcd_goto(0x40);
    187.                 lcd_puts(day_of_week_names[maxtime[2]]);
    188.                 if (maxtime[2]!=1 || maxtime[2]!=3)
    189.                 {
    190.                 lcd_puts(" ");
    191.                     }  
    192.                 if (maxtime[0]<10)lcd_puts("0");
    193.                 utoa(minx, maxtime[0], 10);
    194.                 lcd_puts(minx);
    195.                 lcd_puts(":");
    196.                 if (maxtime[1]<10)lcd_puts("0");
    197.                 utoa(minx, maxtime[1], 10);
    198.                 lcd_puts(minx);
    199.              
    200.                 lcd_puts(" ");
    201.                 if (maxnegativ!=0)
    202.                 {
    203.                 maxhele=(500-max)/10;
    204.                 maxfraction= (500-max)-(maxhele*10);
    205.                 }
    206.                if (maxnegativ==0)
    207.                {
    208.                 maxhele=(max-500)/10;
    209.                 maxfraction= (max-500)-(maxhele*10);
    210.                }
    211.              
    212.                 utoa(maxtemp,maxhele,10);
    213.                 if (maxhele<10)lcd_puts(" ");
    214.                 lcd_puts(maxtemp);
    215.                 lcd_puts(".");
    216.                 utoa(maxtemp,maxfraction,10);
    217.                 lcd_puts(maxtemp);
    218.                 lcd_puts("ß");
    219.              
    220.              
    221.  
    222.                          
    223.                  
    224. }
    225.  
    226.  
    227. void vaelg_dage (void) // Vælger dagene
    228.     {
    229. int sel,y;
    230.     sel=1;
    231.         x=0;
    232.         __delay_ms(100);
    233.         while (x<40)
    234.     {
    235.     if (!set_hour)  // Ved hver tryk inden for 4 sec vælges næste dag
    236.     {char regn[4];
    237.             lcd_goto(0x40);
    238.         lcd_puts("Regn dag -");
    239.         lcd_goto(0x4a);
    240.         if (sel<10)lcd_puts(" ");
    241.         utoa(regn, sel, 10);
    242.         lcd_puts(regn);
    243.         lcd_goto(0x4c);
    244.         lcd_puts(" :");
    245.      
    246.         y=raindays[sel];
    247.         if (y<100)lcd_puts(" ");
    248.         if (y<10)lcd_puts(" ");
    249.         utoa(regn, y, 10);
    250.      
    251.         lcd_puts(regn);
    252.         lcd_puts(" MM");
    253.         sel++;
    254.         x=0;
    255.         if (sel==30)sel=1;
    256.     __delay_ms(255);
    257.     }
    258.     __delay_ms(100);
    259.         x++;
    260.  
    261.     }
    262. }
    263.  
    264.  
    265.  
    266. void reset_temp (void) //sletter temp.
    267. {
    268.      lcd_clear();                            // sletter skærm
    269.      lcd_goto(0x00);                        // linje 1
    270.      lcd_puts("Nulstil Max-Min temp ?");    // skriver
    271.      lcd_goto(0x45);                        // linje 2
    272.      lcd_puts("JA / NEJ ");                    // spørger
    273.      lcd_goto(0x00);                        // linje 1
    274.     x=0;                                    // tæller 0
    275.     while (x<100)                            // løkke til 100*100 = 10 sec
    276.     {
    277.      if (!set_time)                            // hvis tryk på nulstil
    278.      {
    279.        
    280.          min=0;
    281.          max=0;
    282.          lcd_clear();                        // sletter skærm
    283.          lcd_goto(0x04);                    // linje 1
    284.          lcd_puts("Nulstillet !");            // skriver
    285.          lcd_goto(0x00);                    // linje 1
    286.          __delay_ms(1000);                    // pause 1 sec
    287.         x=99;                                // afslutter løkken
    288.         }
    289.         if(!set_week)x=0;                    // hvis tryk igen, omstart løkke
    290.      
    291.         x++;                                 // lægger til løkken
    292.         __delay_ms(100);                    // pause
    293. }                // end while løkken
    294. }    // SLUT RESET TEMP
    295. void reset_regn (void) //sletter total regn.
    296. {
    297. lcd_clear();                        // sletter skærm
    298. lcd_goto(0x00);                    // går til linje1
    299. lcd_puts(" Nulstil total regn ?");    // skriver
    300. lcd_goto(0x45);                    // går til linje 2
    301. lcd_puts("JA / NEJ ");                // skriver
    302. lcd_goto(0x00);                    // går til linje 1
    303.     x=0;                            // tæller 0
    304. while (x<100)                        // løkke 100 gange *100 = 10 sec.
    305.     {
    306.      if (!set_time)                    // hvis man trykker JA knappen
    307.      {TMR0=0;
    308.          r_regn=0;
    309.          today_rain=0;
    310.          lcd_clear();                // sletter skærm
    311.          lcd_goto(0x04);            // går linje 1
    312.          lcd_puts("Nulstillet !");    // skriver
    313.          lcd_goto(0x00);            // linje 1
    314.          __delay_ms(1000);            // Pause 1 sec
    315.         x=99;                        // slutter løkken
    316.         }
    317.         if(!set_week)x=0;            // hvis der trykkes igen, starter løkken forfra
    318.      
    319.         x++;                         // tæller løkken op
    320.         __delay_ms(100);            // 100 ms pause
    321. }
    322.     }         // SLUT NULSTIL REGN
    323.  
    324. unsigned char reset()
    325. {
    326.     Tx_18B20;
    327.     Port_18B20 = 0;
    328.     __delay_us(DS18B20_RESET_PULSE);
    329.     Rx_18B20;
    330.     __delay_us(DS18B20_WAIT_TIME);
    331.  
    332.     if (Port_18B20 == 1)
    333.     {
    334.         __delay_us(DS18B20_RESET_PULSE);
    335.         return ONEWIRE_PRESENT;
    336.     }
    337.  
    338.     __delay_us(DS18B20_RESET_PULSE);
    339.     return ONEWIRE_ABSENT;
    340. }
    341.  
    342. void write(char WRT)
    343. {
    344.     char i,Cmd;
    345.     Cmd = WRT;
    346.     Rx_18B20;
    347.     for(i = 0; i < 8; i++)
    348.     {
    349.         if((Cmd & (1<<i))!= 0)
    350.         {
    351.  
    352.             Tx_18B20;
    353.             Port_18B20 = 0;
    354.             __delay_us(DS18B20_PULLUP_TIME);
    355.             Rx_18B20;
    356.             __delay_us(DS18B20_WAIT_TIME);
    357.         }
    358.         else
    359.         {
    360.  
    361.             Tx_18B20;
    362.             Port_18B20 = 0;
    363.             __delay_us(DS18B20_WAIT_TIME);
    364.             Rx_18B20;
    365.         }
    366.     }
    367. }
    368.  
    369.  
    370. unsigned char read()
    371. {
    372.     char i,result = 0;
    373.     Rx_18B20;
    374.     for(i = 0; i < 8; i++)
    375.     {
    376.         Tx_18B20;
    377.         Port_18B20 = 0;
    378.         __delay_us(DS18B20_PULLUP_TIME);
    379.         Rx_18B20;
    380.         if(Port_18B20 != 0)
    381.         {
    382.             result |= 1<<i;//i
    383.         }
    384.         __delay_us(DS18B20_WAIT_TIME);
    385.     }
    386.     return result;
    387. }
    388.  
    389. void laestemp (void)
    390. {
    391.  
    392.                 write(Skip_ROM);
    393.                 write(Convert_T);
    394.                 __delay_ms(DS18B20_CONV_TIME);
    395.  
    396.                 reset();
    397.                 write(Skip_ROM);
    398.                 write(Read_scratchpad);
    399.                 lsb = read();
    400.                 msb = read();
    401.                 if (f_gennemlob==0) lcd_clear();
    402.                 unsigned int sign = 248 & msb;
    403.                 if(sign==0)
    404.                     decimal = lsb & 15;
    405.  
    406.                 if(sign!=0)
    407.                 {
    408.                     decimal = lsb ^ 15;
    409.                     decimal = decimal^255;
    410.  
    411.                 }
    412.  
    413.                 unsigned char places[4]= {0};
    414.                 if((decimal&8) == 8)
    415.                 {
    416.  
    417.                     places[0] =  places[0] + 5;
    418.  
    419.                 }
    420.  
    421.                 if((decimal&4)==4)
    422.                 {
    423.                     places[0] = places[0] + 2;
    424.                     places[1] = places[1] + 5;
    425.                 }
    426.  
    427.                 if((decimal&2)==2)
    428.                 {
    429.                     places[0] = places[0] + 1;
    430.                     places[1] = places[1] + 2;
    431.                     places[2] = places[2] + 5;
    432.                 }
    433.  
    434.                 if((decimal&1)==1)
    435.                 {
    436.                     places[1] = places[1] + 6;
    437.                     if(places[1]>9)
    438.                     {
    439.                         places[1]= places[1]-10;
    440.                         places[0]= places[0]+1;
    441.                     }
    442.  
    443.                     places[2] = places[2] + 2;
    444.                     places[3] = places[3] + 5;
    445.  
    446.                 }
    447.  
    448.  
    449.                 if(sign!=0)
    450.                 {
    451.                     integer1 =(places[0]*1000);
    452.                     integer2 = (places[1]*100);
    453.                     integer3 = (places[2]*10);
    454.                     integer4 = (places[3]);
    455.                     integer = integer1+integer2+integer3+integer4;
    456.                     if(integer==0)
    457.                     {
    458.                         sign_flag=1;
    459.                     }
    460.                     integer = 10000-integer;
    461.  
    462.                     integer1 = integer/1000;
    463.                     integer2 = (integer/100)-(10*integer1);
    464.                     integer3 = (integer/10)-(100*integer1)-(10*integer2);
    465.                     places[0]= integer1;
    466.                     places[1]= integer2;
    467.                     places[2]= integer3;
    468.                     places[3]= integer4;
    469.  
    470.                 }
    471.                 lsb = lsb >> 3;
    472.                 msb = msb << 5;
    473.                 lsb = msb | lsb;
    474.                 if(sign !=0)
    475.                 {
    476.                     lsb =(lsb)^255;
    477.                     buffer[0]='-';
    478.                 }
    479.                 else
    480.                     buffer[0] = '+';
    481.  
    482.                 lsb = lsb >>1;
    483.                 printf("sign %d\n", sign_flag);
    484.  
    485.                 buffer[1] = ((lsb / 100)%10) + 48;
    486.                 buffer[2] = (((lsb / 10)%10) + 48);
    487.                 buffer[3] = (((lsb)%10))+ 48 + sign_flag;
    488.                 buffer[4] = '.';
    489.                 buffer[5] = ((places[0]%10)+48);
    490.                 buffer[6] = ((places[1]%10)+48);
    491.                 buffer[7] = ((places[2]%10)+48);
    492.                 buffer[8] = ((places[3]%10)+48);
    493.                 buffer[9] = ' ' ;//0xF8;
    494.                 buffer[10]= 'C';
    495.                 total=0;
    496.                 total=((lsb / 100)%10)* 100;
    497.                 total=total+(((lsb / 10)%10) * 10);
    498.                 total=total+(((lsb)% 10))+  sign_flag;
    499.                 fraction=0;
    500.                 fraction=((places[0]%10)+48)-48;
    501.         ////////////// TEST TEST /////////////////
    502.              /*  total=2;
    503.                 fraction=2;
    504.                 sign==1;*/
    505.         ///////////// TEST TEST ////////////      
    506.              
    507.  
    508.                 lcd_goto(0x00);    
    509.                 lcd_puts("Ude temp : ");    // writing temp.              
    510.                 itoa(hele,total,10);
    511.                 if (total<10) lcd_puts(" ");
    512.              
    513.                 if(sign !=0)
    514.                 {
    515.                 lcd_puts("-");
    516.                                 }
    517.                 else
    518.                 {
    519.                     lcd_puts(" ");}
    520.              
    521.                 //if (total<10) lcd_puts(" ");
    522.                 lcd_puts(hele);
    523.                 lcd_goto(0x0E);
    524.                 lcd_puts(".");
    525.                 itoa(deci,fraction,10);
    526.                 lcd_puts(deci);
    527.                 lcd_puts("ß C");
    528.                 if (sign!=0)
    529.                 {now=500-((total*10)+fraction); // add 50 grader pga intet negativ result
    530.                 negativ=1;
    531.                 }
    532.                 if (sign==0)
    533.                 {now=500+((total*10)+fraction); // add 50 grader
    534.                 negativ=0;
    535.                 }
    536.                              
    537.                 // set min and max temperatur.
    538.                 if (min==0)
    539.                 {min=now;
    540.                 minnegativ=0;
    541.                 if (sign!=0)minnegativ=1;
    542.                 }        // just to get it to work
    543.                 if (max==0)
    544.                 {max=now;        // after reset of max-min .
    545.                 maxnegativ=0;
    546.                 if (sign!=0)maxnegativ=1;
    547.                 }
    548.              
    549.              
    550.              
    551.              
    552.    if (now<=min)            // if degree is under last reading
    553.             {              
    554.              
    555.                             // set new "min" temp.
    556.                 lcd_goto(0x40);
    557.                 if (sign !=0)
    558.                 {lcd_puts("-");
    559.                 minhele=(500-now)/10;
    560.                 minfraction= (500-now)-(minhele*10);//fraction;
    561.                 utoa(mintemp,minhele,10);
    562.                 lcd_puts(mintemp);
    563.                 lcd_puts(".");
    564.                 utoa(mintemp,minfraction,10);
    565.                 lcd_puts(mintemp);
    566.                 lcd_puts("ß");
    567.                 minnegativ=1;
    568.                 min=500-((minhele*10)+minfraction);
    569.                 }
    570.                 else
    571.                 {lcd_puts(" ");
    572.              
    573.                 minhele=(now-500)/10;
    574.                 minfraction= (now-500)-(minhele*10);
    575.                 utoa(mintemp,minhele,10);
    576.                 lcd_puts(mintemp);
    577.                 lcd_puts(".");
    578.                 utoa(mintemp,minfraction,10);
    579.                 lcd_puts(mintemp);
    580.                 lcd_puts("ß");
    581.                 minnegativ=0;
    582.                 min=(minhele*10)+minfraction+500;
    583.                 }
    584.              
    585.                 mintime[0]=hour;
    586.                 mintime[1]=minut;
    587.                 mintime[2]=week_day;
    588.                 }
    589.            
    590.              
    591.     if (now>min)                // if degree bigger than "min"
    592.             {    lcd_goto(0x40);
    593.                 if (minnegativ==1)
    594.                 {lcd_puts("-");
    595.                 minhele=(500-min)/10;
    596.                 minfraction= (500-min)-(minhele*10);
    597.                      
    598.                 utoa(mintemp,minhele,10);
    599.                 lcd_puts(mintemp);
    600.                 lcd_puts(".");
    601.                 utoa(mintemp,minfraction,10);
    602.                 lcd_puts(mintemp);
    603.                 lcd_puts("ß");
    604.                 }
    605.                 else
    606.                 {lcd_puts(" ");
    607.                 minhele=(min-500)/10;
    608.                 minfraction= (min-500)-(minhele*10);
    609.                 utoa(mintemp,minhele,10);
    610.                 lcd_puts(mintemp);
    611.                 lcd_puts(".");
    612.                 utoa(mintemp,minfraction,10);
    613.                 lcd_puts(mintemp);
    614.                 lcd_puts("ß");
    615.                 }
    616.     }
    617.  
    618.     lcd_goto(0x46);
    619.     lcd_puts(":MinMax:");    // just text
    620.  
    621.          
    622.  
    623.     if (now>=max)            // if degree is bigger than "Max"
    624. {  
    625.      
    626.                 lcd_goto(0x4E);
    627.                 if (sign !=0)
    628.                 {
    629.                 lcd_puts("-");
    630.                 maxhele=(500-now)/10;
    631.                 maxfraction= (500-now)-(maxhele*10);
    632.                 utoa(maxtemp,maxhele,10);
    633.                 lcd_puts(maxtemp);
    634.                 lcd_puts(".");
    635.                 utoa(maxtemp,minfraction,10);
    636.                 lcd_puts(maxtemp);
    637.                 lcd_puts("ß C");
    638.                 maxnegativ=1;
    639.                 max=500-((maxhele*10)+maxfraction);
    640.                 }
    641.                 else
    642.                 {lcd_puts(" ");
    643.              
    644.                 maxhele=(now-500)/10;
    645.                 maxfraction= (now-500)-(maxhele*10);
    646.                 utoa(maxtemp,maxhele,10);
    647.                 lcd_puts(maxtemp);
    648.                 lcd_puts(".");
    649.                 utoa(maxtemp,maxfraction,10);
    650.                 lcd_puts(maxtemp);
    651.                 lcd_puts("ß C");
    652.                 maxnegativ=0;
    653.                 max=(maxhele*10)+maxfraction+500;
    654.                 }
    655.                 maxtime[0]=hour;
    656.                 maxtime[1]=minut;
    657.                 maxtime[2]=week_day;
    658.                 }
    659.     // make time date function
    660.     if (now<max)                // if degree bigger than "min"
    661.             {    lcd_goto(0x4E);
    662.                 if (maxnegativ==1)
    663.                 {lcd_puts("-");
    664.                  maxhele=(500-max)/10;
    665.                 maxfraction= (500-max)-(maxhele*10);
    666.                 utoa(maxtemp,maxhele,10);
    667.                 lcd_puts(maxtemp);
    668.                 lcd_puts(".");
    669.                 utoa(maxtemp,maxfraction,10);
    670.                 lcd_puts(maxtemp);
    671.                 lcd_puts("ß C");
    672.                 }
    673.                 else
    674.                 {lcd_puts(" ");
    675.                 maxhele=(max-500)/10;
    676.                 maxfraction= (max-500)-(maxhele*10);
    677.                 utoa(maxtemp,maxhele,10);
    678.                 lcd_puts(maxtemp);
    679.                 lcd_puts(".");
    680.                 utoa(maxtemp,maxfraction,10);
    681.                 lcd_puts(maxtemp);
    682.                 lcd_puts("ß C");
    683.                 }
    684.  
    685.             }
    686. }
    687.  
    688. void vis_klokken(void)
    689. {
    690. char timestr[3];
    691.     lcd_goto(0x00);                    // går til første linje
    692.     lcd_puts("Klokken er: ");        // skriver
    693.     utoa(timestr, hour, 10);        // laver om til streng
    694.     if (hour<10)lcd_puts("0");        // hvis timer er under 10 skriv 0
    695.         lcd_puts(timestr);            // skriver timer
    696.         lcd_puts(":");                // skriver
    697.         utoa(timestr, minut, 10);    // laver om til streng
    698.     if (minut<10)lcd_puts("0");     // hvis minut er under 10 skriv 0
    699.         lcd_puts(timestr);            // skriver minut
    700.         lcd_puts(":");                // skriver
    701.         utoa(timestr, secund, 10);        // laver til streng
    702.     if (secund<10)lcd_puts("0");        // hvis sec er under 10 skriv 0
    703.         lcd_puts(timestr);            // skriver
    704.         lcd_goto(0x40);                // går til anden linje
    705.     lcd_puts("Dagen er  : ");        // skriver
    706.      for (unsigned char i=0;i<7;i++) lcd_putch(day_of_week_names[week_day][i]);
    707. lcd_goto(0x00);                        // går til første linje
    708. }    // slut "sub vis klokken"
    709.  
    710. void start_ur (void) // Starter uret.
    711. {
    712.     RA0=0;
    713. GIE = 1;      // Global interrupt enable
    714. TMR2ON=1;     // timer1 on
    715. }     // slut "sub "start ur"
    716.  
    717. void sluk_ur (void) // Slukker uret
    718. {
    719. GIE = 0;         // Global interrupt disable as we are setting the time
    720. TMR2ON=0;       // slukker timer til uret.
    721. secund=0;            // sætter sec = 0
    722. RA0=1;         // tænder lys
    723.  
    724. }// slut "sub sluk ur "
    725.  
    726. void stil_ur (void) //Indstiller uret
    727. {
    728.     sluk_ur();         // Stopper tiden
    729.     lcd_clear();
    730.     vis_klokken();     // Viser uret
    731.     secund=0;
    732.    do                  // Læser på knapperne
    733.    {
    734.     if (!set_hour)     // Stiller timer fremad
    735.    {
    736.        hour++;                    // Lægger en time til
    737.         if (hour==24) hour=0;     // hvis timer = 24 så 0.
    738.         vis_klokken();            // viser vi har tælt en op
    739.         __delay_ms(255);         // venter lidt.
    740.         __delay_ms(255);
    741.                }
    742.     if (!set_minut) // Stiller minutter frem
    743.    {
    744.         minut++;                // lægger 1 minut til.
    745.          if (minut==60) minut=0;// hvis minut = 60 så 0.
    746.            vis_klokken();            // viser vi har talt op.
    747.          __delay_ms(255);         // venter lidt.
    748.          __delay_ms(255);
    749.                }  
    750.     if (!set_week)  // Stiller ugedagen
    751.    {
    752.           week_day++;             // lægger 1 dag til.
    753.          if (week_day==7) week_day=0; // hvis dag 7 så dag 0.
    754.          vis_klokken();            // viser vi har talt op.
    755.          __delay_ms(255);         // venter lidt.
    756.                }  
    757.        
    758.     } while (!set_time); // Når knappen slippes igen
    759.  
    760. start_ur();  //Starter uret
    761. //     vis_regn();
    762. }// end stil uret
    763.  
    764. void midnat(void)    //thing to do at midnight. shift of date.
    765. {int d;
    766. week_day++;
    767. if (week_day==7) week_day=0;
    768. r_regn=r_regn+today_rain;
    769. for(d=30;d>1;d--)
    770. {
    771. raindays[d]=raindays[d-1];
    772. }
    773.  
    774. raindays[1]=today_rain;
    775. today_rain=0;
    776.  
    777. }        // slut midnat
    778.  
    779.  
    780. void uret(void)
    781.       {
    782.  
    783.            minut++;      // og plusser et minut
    784.     if (minut>=60)  // hvis minut = 60
    785.     {    minut=0;    // minut = 0
    786.         hour++;        // og plusser en time.
    787.     if (hour>=24)    // hvis time er 24
    788.     {    hour=0;        // time = 0
    789.         midnat();    // kører sub midnat.
    790.     }    // slut "if hour"
    791.     }    // slut "if minut"
    792.     }    // slut "sub uret"  
    793.  
    794. void fyldarray (void)
    795. {int d;
    796.      for(d=0;d<30;d++)
    797.      {
    798.          raindays[d]=0;
    799.         }
    800.     }     // fyld data
    801.  
    802. void vis_regn(void)
    803.     {
    804.         //lcd_clear();
    805.     char regn[4], idag[4];     // defines
    806. //lcd_clear();                // slet skærm
    807. lcd_goto(0x00);                // går til 0
    808. lcd_puts("Regn Total  : ");    // skriver
    809. if (TMR0<100)lcd_puts(" ");    // højrestiller korrekt
    810. if (TMR0<10)lcd_puts(" ");    // højrestiller igen
    811. utoa(regn, TMR0, 10);        // laver tekststreng
    812. lcd_puts(regn);                // skriver regnen
    813. lcd_puts(" MM");            // i MM
    814. lcd_goto(0x40);                // går til linje 2
    815. lcd_puts("Regn ");            // skriver
    816. for (unsigned char i=0;i<7;i++) lcd_putch(day_of_week_names[week_day][i]);
    817. lcd_puts(": ");            // skriver :
    818.  
    819. today_rain=TMR0-r_regn;        // r_regn er resttal som skal bruges.
    820.  
    821. if (today_rain<100)lcd_puts(" ");    // Højrestiller
    822. if (today_rain<10)lcd_puts(" ");    // højrestiller
    823. utoa(idag, today_rain, 10);            // til tekststreng
    824. lcd_puts(idag);            // skriver
    825. lcd_puts(" MM");            // husker MM
    826.  
    827. }    //slut vis regn
    828. void main (void)
    829. {setup();         //kører setup
    830.    lcd_clear();
    831.        lcd_goto(0x00);
    832.        lcd_puts("1234567890abcdefghij");
    833.        lcd_goto(0x40);
    834.        lcd_puts("abcdefghij1234567890");
    835.        fyldarray();
    836.       __delay_ms(1000);
    837.       lcd_clear();
    838.  
    839.    sec=0;
    840.    PEIE=1;
    841.    GIE=1;
    842.    TMR0=0;        // timer 0 til 0
    843.    xpulse=0;
    844.    TMR2IE=1; // tænder interrupt timer2
    845.    TMR2ON=1; // timer 2 on.
    846.    secund=-1;
    847.    min=0;
    848.    max=0;
    849. lcd_goto(0x00);
    850.  
    851.    while (1)
    852.    {
    853.        if (sec==1)
    854.        {
    855.            secund++;   // add 1 sec.
    856.            visning++;  // add til visning
    857.          
    858.            if (secund==60) // hvis det er talt til 60
    859.                {secund =0; // sætter sekund 0
    860.            uret();  // kører sub uret.
    861.          
    862.            }
    863.            if (visning==5)  // hvis talt til 5,
    864.            {
    865.                visning=0;   // sætter tæller til 0
    866.            
    867.                if (vis==0)  // hvis visning = regn
    868.                {vis=1;   // visning = temp
    869.                f_gennemlob=0;
    870.                }
    871.                else
    872.                {vis=0;      // sæt vis = regn
    873.                 lcd_clear();  // sletter skærmm
    874.                }
    875.              
    876.              
    877.            }
    878.        sec=0;
    879.            }
    880.      
    881.        if (vis==0)
    882.        {
    883.            vis_regn();  // viser regnen
    884.        }
    885.        else
    886.        {
    887.            if (!reset() == ONEWIRE_PRESENT)
    888.             {
    889.            laestemp();  // viser temperatur
    890.             f_gennemlob=1;
    891.             }
    892.        }
    893.      
    894. if (!set_time) // indstiller uret.
    895.        {
    896.            stil_ur();
    897.      
    898.        }
    899. if(!set_week)            // hvis tryk på set week  viser max min,
    900.                 {  vis_maxmin();
    901.                 int x;
    902.                 x=0;                // tæller til 0          
    903.                     while (x<100)    // løkke indtil 100*100=10 SEC
    904.                         {
    905.                     if (!set_week) x=0;        // hvis der trykkes igen, nulstiller vi tæller
    906.                         __delay_ms(100);    // i 10 sec.
    907.                         x++;                // tæller op
    908.                         }    //END WHILE tryk på vis max min
    909.                 }        // END IF set_week
    910.      
    911.  
    912. //SET MINUT  NULSTILLER DIVERSE.      
    913. if (!set_minut)        // hvis tryk på set minut  KLAR TIL NULSTILLING AF DIVERSE.
    914.         {
    915.             sluk_ur();        // slukker uret.
    916.             RA0=1;            // tænder led for at vise vi sletter
    917.               //vis_regn();        // vis regn sub.
    918.                x=0;            // tæller til 0          
    919. while (x<50)                // løkke indtil 50*100=5 SEC
    920. {
    921. if (!set_minut) x=0;        // hvis der trykkes igen, nulstiller vi tæller
    922. __delay_ms(100);            // pause
    923. x++;                        // tæller op
    924. if (!set_week)                // hvis der trykkes på nulstil.
    925. {
    926. reset_regn();                // viser reset sub
    927. }
    928. }
    929. vis_maxmin();                    // viser temperatur sub
    930. x=0;                        // tæller på 0
    931. while (x<50)                // løkke indtil 50*100
    932. {
    933. if (!set_minut) x=0;        // hvis der trykkes nulstiller vi temp.
    934. __delay_ms(100);            // pauser
    935. x++;                        // tæller op
    936. if (!set_week)                // hvis der trykkes på nulstil
    937. {
    938. reset_temp();                // viser rest temp sub
    939. }
    940. }
    941.  
    942.  
    943.  
    944. start_ur();                    // starter ur igen
    945. RA0=0;                        // slukker LED igen.
    946.         }                    // end set minut
    947.      
    948.      
    949. // SET HOUR  SKIFTER MELLLEM DAGE.
    950. if (!set_hour)
    951. {vis_regn();
    952.     vaelg_dage();
    953.  
    954. }
    955.        // more if.
    956.  
    957.    }
    958. }
    959.  
    960.  
    961.  
     
    Last edited by a moderator: Oct 11, 2015
Loading...