Révision | b8bd0508955703a4fba163e25601346b80f22e9f (tree) |
---|---|
l'heure | 2013-06-11 05:25:53 |
Auteur | K.Ohta <whatisthis.sowhat@gmai...> |
Commiter | K.Ohta |
[Initial] Add idle-routine, using interrupt.
@@ -0,0 +1,44 @@ | ||
1 | +/* | |
2 | + * OpenI2CRADIO | |
3 | + * Idle routine. | |
4 | + * Using timer0. | |
5 | + * (C) 2013-06-10 K.Ohta <whatisthis.sowhat ai gmail.com> | |
6 | + * License: GPL2 | |
7 | + */ | |
8 | +#include <sdcc-lib.h> | |
9 | +#include <pic18fregs.h> /* ONLY FOR PIC18x */ | |
10 | +#include <signal.h> | |
11 | +#include "iodef.h" | |
12 | + | |
13 | + | |
14 | +void idle_init(void) | |
15 | +{ | |
16 | + INTCON = _TMR0IE & ~(_TMR0IF | _INT0IF | _RBIF); // Enable tmr0 as interrupt and clear interrupt flags. | |
17 | + INTCON2 = ~_TMR0IP & _TMR0IP; // Interrupt is lower. | |
18 | + WDTCON = 0; // OK? WDT=Disabled. | |
19 | +} | |
20 | + | |
21 | + | |
22 | +void stop_idle(void) | |
23 | +{ | |
24 | + T0CONbits.TMR0ON = 0; | |
25 | +} | |
26 | + | |
27 | + | |
28 | +void idle(unsigned int initial) | |
29 | +{ | |
30 | + unsigned char osccon; | |
31 | + unsigned char contword; | |
32 | + | |
33 | + /* Set TMR0 for interrupt*/ | |
34 | + /* Pre-scaler: 1/16, PSA=0(ON), TOSE=0, T0CS=0(INTERNAL), T08BIT=1(8bit), TMR0ON=1(START) */ | |
35 | + contword = _T0PS0 | _T0PS1 | _T08BIT | _TMR0ON; // _T0PS2 | |
36 | + TMR0H = initial >> 8; | |
37 | + TMR0L = initial & 0xff; | |
38 | + T0CON = contword; | |
39 | + | |
40 | + osccon = OSCCON; | |
41 | + osccon = osccon | _IDLEN | _SCS1 | _SCS0; | |
42 | + OSCCON = osccon; | |
43 | + Sleep(); | |
44 | +} |
@@ -0,0 +1,23 @@ | ||
1 | +/* | |
2 | + * File: idle.h | |
3 | + * Author: whatisthis | |
4 | + * | |
5 | + * Created on 2013/06/11, 5:06 | |
6 | + */ | |
7 | + | |
8 | +#ifndef IDLE_H | |
9 | +#define IDLE_H | |
10 | + | |
11 | +#ifdef __cplusplus | |
12 | +extern "C" { | |
13 | +#endif | |
14 | +extern void idle(unsigned int initial); | |
15 | +extern void idle_init(void); | |
16 | +extern void idle_stop(void); // Stop TMR0. | |
17 | + | |
18 | +#ifdef __cplusplus | |
19 | +} | |
20 | +#endif | |
21 | + | |
22 | +#endif /* IDLE_H */ | |
23 | + |
@@ -97,10 +97,10 @@ enum { | ||
97 | 97 | charcode_e, |
98 | 98 | charcode_f, |
99 | 99 | charcode_0, |
100 | - charcode_s0, | |
101 | - charcode_s1, | |
102 | - charcode_s2, | |
103 | - charcode_s3, | |
100 | + charcode_s0, // RB1 | |
101 | + charcode_s1, // RB2 | |
102 | + charcode_s2, // RB3 | |
103 | + charcode_s3, // Reserve | |
104 | 104 | }; |
105 | 105 | |
106 | 106 | extern keyin_defs keyin_old[2]; |
@@ -9,8 +9,10 @@ | ||
9 | 9 | #include <stdlib.h> |
10 | 10 | #include <sdcc-lib.h> |
11 | 11 | #include <pic18fregs.h> /* ONLY FOR PIC18x */ |
12 | +#include <signal.h> | |
12 | 13 | |
13 | 14 | #include "iodef.h" |
15 | +#include "idle.h" | |
14 | 16 | |
15 | 17 | /* |
16 | 18 | * Config words. |
@@ -28,14 +30,74 @@ __at(__CONFIG7L) _config7l = _EBTR0_OFF_7L & _EBTR1_OFF_7L; | ||
28 | 30 | __at(__CONFIG7H) _config7h = _EBTRB_OFF_7H; |
29 | 31 | |
30 | 32 | |
33 | + | |
34 | +SIGHANDLER(TMR0_handler) | |
35 | +{ | |
36 | + unsigned char tmr0f; | |
37 | + | |
38 | + readkey_io(); | |
39 | + tmr0f = INTCON; | |
40 | + tmr0f &= ~(_TMR0IF); | |
41 | + INTCON = tmr0f; | |
42 | + | |
43 | + return; | |
44 | +} | |
45 | + | |
46 | + | |
47 | +DEF_INTLOW(intlow_handler) | |
48 | + DEF_HANDLER(SIG_TMR0, TMR0_handler) | |
49 | +END_DEF | |
50 | + | |
51 | + | |
31 | 52 | /* |
32 | 53 | * |
33 | 54 | */ |
34 | -int main(void) { | |
55 | +int main(void) | |
56 | +{ | |
57 | + char readchar; | |
58 | + unsigned char input_flag; | |
35 | 59 | |
36 | 60 | keyin_init(); |
37 | 61 | keyin_ioinit(); |
38 | - | |
62 | + idle_init(); | |
63 | + | |
64 | + /* Init I2C*/ | |
65 | + /* Init LCD */ | |
66 | + /* Check EEPROM */ | |
67 | + /* Push default parameters to AKC6955*/ | |
68 | + /* Power on AKC6955 */ | |
69 | + do { | |
70 | + /* Main routine*/ | |
71 | + input_flag = readkey_compare(); | |
72 | + if(input_flag != 0){ | |
73 | + readchar = pop_keyinfifo(); | |
74 | + switch(readchar) { | |
75 | + // Top of input-tree. | |
76 | + case charcode_s0: | |
77 | + // Change band | |
78 | + break; | |
79 | + case charcode_s1: | |
80 | + // MODE | |
81 | + break; | |
82 | + case charcode_s2: | |
83 | + // ENTER | |
84 | + break; | |
85 | + case charcode_s3: | |
86 | + // Reserve | |
87 | + break; | |
88 | + case charcode_null: // None | |
89 | + break; | |
90 | + default: | |
91 | + // Numeric 0to9, or a to f. | |
92 | + break; | |
93 | + } | |
94 | + } | |
95 | + // Check battery (include idle?) | |
96 | + // Read AKJC6955's status | |
97 | + // Putstring to LCD. | |
98 | + idle(0xff00); | |
99 | + } while(1); | |
100 | + | |
39 | 101 | |
40 | 102 | } |
41 | 103 |