Hallo zusammen,
um es vorweg zu nehmen, ich bin relativ neu auf dem Gebiet
Mikrocontroller und C... Momentan schreibe ich an einer Uhr, das hat
auch alles bisher wunderbar geklappt.
Die Ausgabe hat auch schon geklappt, jetzt habe ich allerdings noch
versucht einen Teil einzubauen, seither wird aber nichts mehr
dargestellt auf den Ausgängen auch nich wenn ich auf den alten Zustand
zurückgeh. Ich habe extra noch ein anders Programm zum Ausgänge testen
gemacht, un die funktionieren noch alle.
Den Code häng ich jetzt mal an.
1 | #include <avr/io.h>
|
2 | #include <stdint.h>
|
3 | #include <avr/iom16.h>
|
4 | #include <avr/interrupt.h>
|
5 |
|
6 |
|
7 | // CTC Funktionalität herstellen Clear on Compare/Match
|
8 |
|
9 | #define t1ctc 0x04
|
10 | #define t0ctc 0x01
|
11 |
|
12 | // Maskierung das nur der TIMSK Teil von Timer 1 geändert wird
|
13 |
|
14 | #define t1mask 0b00111100
|
15 |
|
16 |
|
17 | //Maskierung für TIMSK von Timer0
|
18 |
|
19 | #define t0mask 0b00000011
|
20 |
|
21 |
|
22 | //Vorladewert da Timer 1ms darstellen soll
|
23 |
|
24 | #define t0vor 124 // -1 weil bei 0 angefangen wird zu zählen
|
25 |
|
26 | //CTC Vektor von Timer 0
|
27 |
|
28 | #define ctc_vek_t0 TIMER0_COMP_vect
|
29 |
|
30 |
|
31 | //Variablendefinition
|
32 |
|
33 | volatile uint16_t millisek;
|
34 | volatile uint8_t sek;
|
35 | volatile uint8_t min,std;
|
36 |
|
37 | //Funktionsdefinition
|
38 |
|
39 | void timer0_config(void)
|
40 | {
|
41 |
|
42 | TCCR0 = (0b00000011 & 0b00000111); // Prescaler von 64 daraus ergibt sich 8000000/64=125000
|
43 |
|
44 | OCR0 = t0vor; // t0 vor = 124 d.h. bei jedem erreichen von t0vor wird das Interrupt flag des ISR Vectors gesetzt (8000000/64)/f(1000Hz) =125
|
45 |
|
46 |
|
47 | TIMSK = (t0ctc & t0mask); // CTC Funktionen herstellen
|
48 |
|
49 |
|
50 |
|
51 | }
|
52 |
|
53 |
|
54 | void main(void)
|
55 | {
|
56 | //Datenrichtungsregister
|
57 |
|
58 | DDRA=0xFF;
|
59 | DDRB=0xFF;
|
60 | DDRC=0xFF;
|
61 | DDRD=0xF8; //Port D 0-2 als Eingang alle anderen Ausgang für Darstellung der Uhrzeit mit LED's
|
62 |
|
63 |
|
64 | //Interruptroutine
|
65 |
|
66 | timer0_config();
|
67 |
|
68 | sei();
|
69 |
|
70 | while(1)
|
71 | {
|
72 | /* uint8_t set; //auskommentiert da Funktion momentan nicht gegeben, und ohne Switch war Funktion vorhanden, jetzt nicht mehr.
|
73 |
|
74 | set=PORTD;
|
75 |
|
76 | switch(set)
|
77 | {
|
78 | case 3:
|
79 | {
|
80 | min++;
|
81 | PORTB=min;
|
82 | }
|
83 |
|
84 | case 5:
|
85 | {
|
86 | std++;
|
87 | PORTA=std;
|
88 | }
|
89 |
|
90 | default:
|
91 | {
|
92 | */
|
93 | PORTA=std;
|
94 | PORTB=min;
|
95 | PORTC=sek;
|
96 | //}
|
97 |
|
98 | //}
|
99 | }
|
100 |
|
101 | }
|
102 |
|
103 |
|
104 | ISR(TIMER0_COMP_vect)
|
105 | {
|
106 | millisek=millisek+1; //Alternativ millisek++
|
107 |
|
108 | if(millisek==1000)
|
109 | {
|
110 | sek++;
|
111 | millisek=0;
|
112 | }
|
113 | if(sek==60)
|
114 | {
|
115 | min++;
|
116 | sek=0;
|
117 | }
|
118 |
|
119 | if(min==60)
|
120 | {
|
121 | std++;
|
122 | min=0;
|
123 | if(std==24)
|
124 | {
|
125 | std=0;
|
126 | }
|
127 | }
|
128 | }
|