1 | /*
|
2 | * Project name:
|
3 | Funkuhr
|
4 | * Copyright:
|
5 | (c) Peter Schumacher 2013.
|
6 | * Description:
|
7 | Funkuhr
|
8 | * Test configuration:
|
9 | MCU: PIC18F1320-I/P
|
10 | http://ww1.microchip.com/downloads/en/devicedoc/39605f.pdf
|
11 | dev.board: EasyPIC v7
|
12 | http://www.mikroe.com/eng/products/view/757/easypic-v7-development-system/
|
13 | internal Oscillator: 125 kHz
|
14 | external Oscillator: 32,768 kHz external Crystal
|
15 | Ext. Modules: DCF-77-Receiver
|
16 | http://ele.pgbesa.net/DCF77.pdf
|
17 | SW: mikroC PRO for PIC
|
18 | http://www.mikroe.com/eng/products/view/7/mikroc-pro-for-pic/
|
19 | */
|
20 |
|
21 |
|
22 | // LCD module connections
|
23 | sbit LCD_RS at LATA0_bit;
|
24 | sbit LCD_EN at LATA1_bit;
|
25 | sbit LCD_D4 at LATA2_bit;
|
26 | sbit LCD_D5 at LATA3_bit;
|
27 | sbit LCD_D6 at LATA4_bit;
|
28 | sbit LCD_D7 at LATB5_bit;
|
29 |
|
30 | sbit LCD_RS_Direction at TRISA0_bit;
|
31 | sbit LCD_EN_Direction at TRISA1_bit;
|
32 | sbit LCD_D4_Direction at TRISA2_bit;
|
33 | sbit LCD_D5_Direction at TRISA3_bit;
|
34 | sbit LCD_D6_Direction at TRISA4_bit;
|
35 | sbit LCD_D7_Direction at TRISB5_bit;
|
36 |
|
37 | #define Empfaenger LATA.F6
|
38 | #define Signal LATA.F7
|
39 |
|
40 | char s = 0; //Sekunde
|
41 | char m = 0; //Minute
|
42 | char h = 0; //Stunde
|
43 | char d = 0; //Tag
|
44 | char wd = 1; //Wochentag (Mo.-So.)
|
45 | char mt = 0; //Monat
|
46 | //Einzelne Ziffern für Ausgabestring
|
47 | char h1 = 0;
|
48 | char h2 = 0;
|
49 | char m1 = 0;
|
50 | char m2 = 0;
|
51 | char s1 = 0;
|
52 | char s2 = 0;
|
53 |
|
54 | char txt[9]; //Uhrzeit-String
|
55 |
|
56 | //oder:
|
57 | //char *txt = "00:00:00";
|
58 |
|
59 | char Freigabe = 0; //Funksignal wird empfangen
|
60 |
|
61 | void interrupt() {
|
62 | if(Freigabe == 0){
|
63 | Empfaenger = 1;
|
64 |
|
65 | if(Signal){
|
66 | LATB.F1 = 1; //Pin 9
|
67 | }
|
68 | else{
|
69 | LATB.F1 = 0; //Pin 9
|
70 | }
|
71 |
|
72 | Freigabe = 0;
|
73 | }
|
74 |
|
75 | s++;
|
76 | if(s == 60){
|
77 | s = 0;
|
78 | m++;
|
79 | }
|
80 | if(m == 60){
|
81 | m = 0;
|
82 | h++;
|
83 | }
|
84 | if(h == 24){
|
85 | h = 0;
|
86 | wd++;
|
87 | }
|
88 | TMR1IF_bit = 0;
|
89 | INT0IF_bit = 0; //Reset von: INT0 External Interrupt Flag bit
|
90 | }
|
91 |
|
92 | void main() {
|
93 |
|
94 | //OSCCON REGISTER
|
95 | IDLEN_bit = 0; //Run Mode enabled
|
96 | IRCF2_bit = 0; //internen Oszillator im OSCCON-Register auf 125 kHz setzen
|
97 | IRCF1_bit = 0;
|
98 | IRCF0_bit = 1;
|
99 |
|
100 | //Port A konfigurieren
|
101 | TRISA = 0; //Port A als Ausgänge definieren
|
102 | TRISA.F7 = 1; //Pin 4 von Port A als Eingang definieren
|
103 | PORTA = 0; //Anfangswert von Port A festlegen
|
104 |
|
105 | //Port B konfigurieren
|
106 | TRISB = 0; //Port B als Ausgänge definieren
|
107 | TRISB.F0 = 1; // Pin 0 von Port B als Eingang definieren
|
108 | PORTB = 0; //Anfangswert von Port B festlegen
|
109 |
|
110 | //LCD einrichten
|
111 | Lcd_Init();
|
112 | Lcd_Cmd(_LCD_CLEAR);
|
113 | Lcd_Cmd(_LCD_CURSOR_OFF);
|
114 |
|
115 | //INTCON REGISTER
|
116 | GIE_bit = 1; //Enables all unmasked interrupts
|
117 | PEIE_bit = 1; //Enables all unmasked peripheral interrupts
|
118 | INT0IE_bit = 1; //INT0 External Interrupt Enable bit (S1-Button at RB0)
|
119 | INT0IF_bit = 0; //Reset von: INT0 External Interrupt Flag bit
|
120 |
|
121 | //T1CON REGISTER
|
122 | TMR1ON_bit = 1; //Enables Timer1
|
123 | TMR1CS_bit = 1; //External clock from pin RB6/PGC/T1OSO/T13CKI/P1C/KBI2 (on the rising edge)
|
124 | T1SYNC_bit = 1; //Do not synchronize external clock input
|
125 | T1OSCEN_bit = 1; //Timer1 Oscillator Enable bit
|
126 | TMR1H = 0x80; //Timer1 ist ein 16bit Timer. Hier wrird das höhere Byte "vorgeladen" ("preload"), damit ein Interrupt genau nach jeder Sekunde kommt.
|
127 |
|
128 |
|
129 | do{
|
130 |
|
131 | LATB.F4 = 1;
|
132 |
|
133 | //Uhrzeit wird in String umgewandelt
|
134 | h1 = (h / 10) % 10;
|
135 | h2 = (h ) % 10;
|
136 | m1 = (m / 10) % 10;
|
137 | m2 = (m ) % 10;
|
138 | s1 = (s / 10) % 10;
|
139 | s2 = (s ) % 10;
|
140 | txt[0] = '0' + h1;
|
141 | txt[1] = '0' + h2;
|
142 | txt[2] = ':';
|
143 | txt[3] = '0' + m1;
|
144 | txt[4] = '0' + m2;
|
145 | txt[5] = ':';
|
146 | txt[6] = '0' + s1;
|
147 | txt[7] = '0' + s2;
|
148 | txt[8] = '\0'; //Strings: http://www.mikrocontroller.net/articles/String-Verarbeitung_in_C
|
149 |
|
150 | Lcd_Out(1, 1, txt);
|
151 |
|
152 | switch(wd){
|
153 | case(1): {Lcd_Out(1,15,"Mo"); break;}
|
154 | case(2): {Lcd_Out(1,15,"Di"); break;}
|
155 | case(3): {Lcd_Out(1,15,"Mi"); break;}
|
156 | case(4): {Lcd_Out(1,15,"Do"); break;}
|
157 | case(5): {Lcd_Out(1,15,"Fr"); break;}
|
158 | case(6): {Lcd_Out(1,15,"Sa"); break;}
|
159 | case(7): {Lcd_Out(1,15,"So"); break;}
|
160 | default: break;
|
161 | }
|
162 | Lcd_Cmd(_LCD_RETURN_HOME);
|
163 | }while(1);
|
164 | }
|