1 | #include <avr/io.h>
|
2 | #include<avr\interrupt.h>
|
3 |
|
4 | uint16_t Array[11]; //Global;
|
5 |
|
6 | int main(void)
|
7 | {
|
8 | Array[10]=0;
|
9 | Array[9]=0;
|
10 | Array[8]=0;
|
11 | Array[7]=0;
|
12 | Array[6]=0;
|
13 | Array[5]=0;
|
14 | Array[4]=0;
|
15 | Array[3]=0;
|
16 | Array[2]=0;
|
17 | Array[1]=0;
|
18 | Array[0]=0;
|
19 | Startup();
|
20 | while(1)
|
21 | {
|
22 | ;
|
23 | }
|
24 | }
|
25 |
|
26 | void Startup()
|
27 | {
|
28 | //---------Externer Oszillator------------------------
|
29 | CLK.PSCTRL = 0x00;
|
30 | OSC.CTRL=0x08;
|
31 | while(!(OSC.STATUS & 0x08));
|
32 | CCP = 0xD8;
|
33 | CLK.CTRL = 0x03;
|
34 | //---------Timer0 für 1ms zuer Ausgabe--------------
|
35 | TCC0.CTRLB=0x00;
|
36 | TCC0.CTRLC=0x00;
|
37 | TCC0.CTRLD=0x00;
|
38 | TCC0.CTRLE=0x00;
|
39 | TCC0.CNTH=0x83;
|
40 | TCC0.CNTL=0x00;
|
41 | TCC0.INTCTRLA=0x03; //Hoch priorer Interrupt
|
42 | sei(); //Global IRQ enable
|
43 | PMIC.CTRL=0x07;
|
44 | TCC0.CTRLA=0x01; // Timer Starten Prescaler = 1
|
45 | //----------Timer1 1Sec Uhr-Interrupt---------------------
|
46 | TCC1.CTRLB=0x00;
|
47 | TCC1.CTRLC=0x00;
|
48 | TCC1.CTRLD=0x00;
|
49 | TCC1.CTRLE=0x00;
|
50 | TCC1.CNTH=0x85;
|
51 | TCC1.CNTL=0xEE;
|
52 | TCC1.INTCTRLA=0x02; //Mittel priorer Interrupt
|
53 | PMIC.CTRL=0x07;
|
54 | TCC1.CTRLA=0x07; // Timer Starten Prescaler = 1024
|
55 | //---------Ein/Ausgänge richtig setzten---------------
|
56 | PORTA.DIRSET=0xc0;
|
57 | PORTB.DIRSET=0xf3;
|
58 | PORTC.DIRSET=0xff;
|
59 | PORTD.DIRSET=0xff;
|
60 | PORTE.DIRSET=0xf4;
|
61 |
|
62 | PORTA.OUTSET=0x00;
|
63 | PORTB.OUTSET=0x00;
|
64 | PORTC.OUTSET=0x00;
|
65 | PORTD.OUTSET=0x02;
|
66 | PORTE.OUTSET=0x00;
|
67 | }
|
68 |
|
69 | ISR(TCC1_OVF_vect)
|
70 | {
|
71 | Uhr(0);
|
72 | TCC1.CTRLA=0x00; // Timer Stoppen
|
73 | TCC1.CNTH=0x85;
|
74 | TCC1.CNTL=0xEE;
|
75 | TCC1.CTRLA=0x07; // Timer Starten Prescaler = 1024
|
76 | }
|
77 |
|
78 | ISR(TCC0_OVF_vect) //Wird jede ms zuer Snazeigeaktualisierung ausgelöst
|
79 | {
|
80 | TCC0.CTRLA=0x00; // Timer Stoppen
|
81 | TCC0.CNTH=0x83;
|
82 | TCC0.CNTL=0x00;
|
83 | TCC0.CTRLA=0x01; // Timer Starten Prescaler = 1
|
84 | Ausgabe(Array);
|
85 | }
|
86 |
|
87 | void Uhr(uint8_t mode)
|
88 | {
|
89 | if(mode==0) //Komplette Zeit
|
90 | {
|
91 | static uint8_t sek1 = '0' , sek10 = '0' , min1 = '0' , min10 = '0' , std1 = '0' , std10 = '0';
|
92 | sek1++;
|
93 | if(sek1==('9'+1))
|
94 | {
|
95 | sek1='0';
|
96 | sek10++;
|
97 | if(sek10=='6')
|
98 | {
|
99 | sek10='0';
|
100 | min1++;
|
101 | if(min1==('9'+1))
|
102 | {
|
103 | min1='0';/*
|
104 | min10++; --> Fehler
|
105 |
|
106 | if(min10=='6')
|
107 | {
|
108 | min10='0';
|
109 | std1++;
|
110 | if(std1==('9'+1))
|
111 | {
|
112 | std1='0';
|
113 | std10++;
|
114 | if(std10==('9'+1))
|
115 | {
|
116 | std10='0';
|
117 | }
|
118 | }
|
119 | if(std10=='2' && std1=='4')
|
120 | {
|
121 | std10='0';
|
122 | std1='0';
|
123 | }
|
124 | }*/
|
125 |
|
126 | }
|
127 | }
|
128 | }/*
|
129 | Array[9]=sek1;
|
130 | Array[8]=sek10;
|
131 | Array[6]=min1;
|
132 | Array[5]=min10;
|
133 | Array[4]=std1;
|
134 | Array[3]=std10;*/
|
135 | }
|
136 | }
|
137 |
|
138 | void Ausgabe(uint16_t Array[]) //Rolliert das Display durch
|
139 | {
|
140 | static uint8_t stelle = 0;
|
141 | stelle++;
|
142 | PORTC.OUTCLR=0x7f;
|
143 | PORTB.OUTCLR=0xf3;
|
144 | PORTA.OUTCLR=0x80;
|
145 | switch (stelle-1)
|
146 | {
|
147 | case 0: PORTE.OUTTGL = 0x80;
|
148 | PORTD.OUTTGL = 0x02; break;
|
149 | //Port E.7 = Ein = 1000 0000
|
150 | //Port G.1 = Aus = 0000 0010
|
151 | case 1: PORTE.OUTTGL = 0xC0; break;
|
152 | //Port E.6 = Ein = 0100 0000
|
153 | //Port E.7 = Aus = 1000 0000
|
154 | case 2: PORTE.OUTTGL = 0x60; break;
|
155 | //Port E.5 = Ein = 0010 0000
|
156 | //Port E.6 = Aus = 0100 0000
|
157 | case 3: PORTE.OUTTGL = 0x30;break;
|
158 |
|
159 | //Port E.4 = Ein = 0001 0000
|
160 | //Port E.5 = Aus = 0010 0000
|
161 | case 4: PORTE.OUTTGL = 0x10;
|
162 | PORTD.OUTTGL = 0x80; break;
|
163 | //Port D.7 = Ein = 1000 0000
|
164 | //Port E.4 = Aus = 0001 0000
|
165 | case 5: PORTD.OUTTGL = 0xC0; break;
|
166 | //Port D.6 = Ein = 0100 0000
|
167 | //Port D.7 = Aus = 1000 0000
|
168 | case 6: PORTD.OUTTGL = 0x60; break;
|
169 | //Port D.5 = Ein = 0010 0000
|
170 | //Port D.6 = Aus = 0100 0000
|
171 | case 7: PORTD.OUTTGL = 0x30; break;
|
172 | //Port D.4 = Ein = 0001 0000
|
173 | //Port D.5 = Aus = 0010 0000
|
174 | case 8: PORTD.OUTTGL = 0x18; break;
|
175 | //Port D.3 = Ein = 0000 1000
|
176 | //Port D.4 = Aus = 0001 0000
|
177 | case 9: PORTD.OUTTGL = 0x0C; break;
|
178 | //Port D.2 = Ein = 0000 0100
|
179 | //Port D.3 = Aus = 0000 1000
|
180 | case 10: PORTD.OUTTGL = 0x06;
|
181 | stelle = 0; break;
|
182 | //Port D.1 = Ein = 0100 0010
|
183 | //Port D.2 = Aus = 1000 0100
|
184 | }
|
185 | switch(Array[stelle-1])
|
186 | {
|
187 | case 0x30: PORTC.OUTSET=0x70;
|
188 | PORTB.OUTSET=0x03;
|
189 | PORTA.OUTSET=0x80;
|
190 | break;
|
191 | case 0x31: PORTC.OUTSET=0x28;
|
192 | PORTB.OUTSET=0x02;
|
193 | break;
|
194 | case 0x32: PORTC.OUTSET=0x61;
|
195 | PORTB.OUTSET=0x81;
|
196 | PORTA.OUTSET=0x80;
|
197 | break;
|
198 | case 0x33: PORTC.OUTSET=0x61;
|
199 | PORTB.OUTSET=0x02;
|
200 | PORTA.OUTSET=0x80;
|
201 | break;
|
202 | case 0x34: PORTC.OUTSET=0x15;
|
203 | PORTB.OUTSET=0xA0;
|
204 | break;
|
205 | case 0x35: PORTC.OUTSET=0x51;
|
206 | PORTB.OUTSET=0x82;
|
207 | PORTA.OUTSET=0x80;
|
208 | break;
|
209 | case 0x36: PORTC.OUTSET=0x51;
|
210 | PORTB.OUTSET=0x83;
|
211 | PORTA.OUTSET=0x80;
|
212 | break;
|
213 | case 0x37: PORTC.OUTSET=0x49;
|
214 | PORTB.OUTSET=0x90;
|
215 | break;
|
216 | case 0x38: PORTC.OUTSET=0x71;
|
217 | PORTB.OUTSET=0x83;
|
218 | PORTA.OUTSET=0x80;
|
219 | break;
|
220 | case 0x39: PORTC.OUTSET=0x71;
|
221 | PORTB.OUTSET=0x82;
|
222 | PORTA.OUTSET=0x80;
|
223 | break;
|
224 | }
|
225 | }
|