Guten Abend,
ich baue momentan eine kleine Binäruhr mit einem Atmega8. Die Idee war
eine Einfache Binäruhr (Minuten 0-59, Stunde 0-11,, 2LEDs für Sekunden)
und diese über 2 Taster( Stunde+1, Minute+1) einzustellen. Die Binäruhr
fängt auch schon an zu zählen das Problem liegt daran dass ich die
Uhrzeit nicht Einstellen kann. Die Taster sind PD5 und PD2 mit dem µC
verbunden, PullDown Wiederstände gehen von dort auf Ground.
1 | #define F_CPU 8000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <avr/sleep.h>
|
6 | #include <inttypes.h>
|
7 | #include <util/delay.h>
|
8 | #include <stdlib.h>
|
9 |
|
10 | unsigned char sekunden = 0;
|
11 | unsigned char minuten = 0;
|
12 | unsigned char stunden = 0;
|
13 |
|
14 | ISR(TIMER1_COMPA_vect){
|
15 | sekunden++;
|
16 |
|
17 | if(sekunden==60){
|
18 | sekunden = 0;
|
19 | minuten++;
|
20 | }
|
21 | if(minuten == 60){
|
22 | minuten = 0;
|
23 | stunden++;
|
24 | }
|
25 | if(stunden == 12){
|
26 | stunden = 0;
|
27 | }
|
28 | PORTC = minuten;
|
29 | PORTB = stunden;
|
30 | if(sekunden==0 || sekunden == 30){ PORTD ^= (1<<PD6); }
|
31 | PORTD ^= (1<<PD7);
|
32 | }
|
33 |
|
34 | int timer (void)
|
35 | {
|
36 | if(sekunden == 60)
|
37 | {
|
38 | minuten++;
|
39 | sekunden = 0;
|
40 | }
|
41 | if(minuten == 60)
|
42 | {
|
43 | stunden++;
|
44 | minuten = 0;
|
45 | }
|
46 | return 0;
|
47 | }
|
48 |
|
49 | int main (void)
|
50 | {
|
51 | DDRC = 0b00111111; // LED minute
|
52 | DDRB = 0b00001111; // LED stunde
|
53 | DDRD = 0b11000000; // LED sekunde
|
54 | PORTD &= ~(1<<PD2);
|
55 | PORTD &= ~(1<<PD5);
|
56 |
|
57 |
|
58 | //16Bit-Timer für Zeitzählung
|
59 | TCCR1B |= (1 << WGM12); //CTC Modus
|
60 | TCCR1B |= (1 << CS12) | (0 << CS11) | (1 << CS10); //Prescaler 1024
|
61 | OCR1A = 7812; //Compare Wert setzen
|
62 | TIMSK = (1<<OCIE1A); //Interrupt bei Compare Match
|
63 | sei(); //Interrputs aktivieren
|
64 |
|
65 | while(1){
|
66 |
|
67 | if( PIND & (1<<PD2)){
|
68 | minuten++;
|
69 | }
|
70 | if( PIND & (1<<PD5)){
|
71 | stunden++;
|
72 | }
|
73 | if(minuten>=60){
|
74 | stunden++;
|
75 | }
|
76 | if(stunden>=12){
|
77 | stunden = 0;
|
78 | }
|
79 | PORTC = minuten;
|
80 | PORTB = stunden;
|
81 | _delay_ms(100);
|
82 |
|
83 | }
|
84 | return 0;
|
85 |
|
86 | }
|
Hardwaremäßig funktioniert alles (nachgemessen mit Multimeter etc.). Es
kann gut sein dass die Uhr nicht genau Zählt, dies ist bekannt und wird
später behoben.(Externer Quarz etc.)
Lg Sebastian