hi zu übungszwecken will ich 6 LEDs ansteuern die im sekunden takt hochzählen und bei 60 wieder auf null springen.. funktioniert soweit eigentlich auch ganz gut...nur verliert meine Uhr zeit... meine vermutung: entweder habe ich mich mit der quarzfrequenz und dem hochzählen vertan so das er minimal zulangsam hochzählt oder der code selbst verbraucht irgendwie zeit sodas sie langsamer läuft..wobei das ja eigentlich nicht sein kann da das ganze über interrupt und counter läuft... quarzfrequenz : 16MHZ uC : Atmega8 mein gedanke dahinter: zähler läuft mit 16MHZ/1024(prescaler) = 15625HZ zählt also pro sekunde bis 15625 interrupt wird alle 255 ausgelöst. da der zähler 0,01632 sek braucht um bis 255 zu zählen addiere ich pro interupt 1632 auf meinen zähler der bei 100.000 voll ist und die sekunde inkrementiert. anschließend subtrahiere ich vom zähler wieder 100.000 und es geht von vorne los der überschuss bleibt also drin. achja noch was anderes wenn ich meine 6 leds an die pins pd0 bis pd5 hänge schaltet eine nicht richtig...sie leuchtet zwar aber nur gaaaanz schwach...gleiches hatte ich auch als ich die komplette schaltung auf die PCx ports umgebaut hatte. ich habe es auch an einem weiteren atmega8 probiert > gleiches ergebnis deshalt habe ich die 5te stelle auf den PD6 pin gelegt da gehts :confused: macht dummerweise nur mehr arbeit da man nicht mehr einfach PORTD = sek sagen kann... gruß edit: mit zeitverlieren meine ich so zirka: 1sek/min
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #include <avr/delay.h> |
4 | |
5 | |
6 | volatile int sek, min; |
7 | volatile int32_t zahler; |
8 | main() |
9 | {
|
10 | |
11 | |
12 | |
13 | //Timer 0 konfigurieren
|
14 | DDRD = 0b01101111; //definiert portC ping 0-3 als ausgang |
15 | |
16 | PORTD = 0b01101111; //setzt die ausgänge 0-3 vom port C auf logisch 0 |
17 | TCCR0 = (1<<CS00) | (1<<CS02); //1024er prescaler |
18 | min=0; |
19 | sek=0; |
20 | int test; |
21 | test=0; |
22 | |
23 | |
24 | TIMSK|=(1<<TOIE0); //timer overflow interrupt |
25 | //Globale Interrupts aktivieren
|
26 | sei(); |
27 | |
28 | while(1) |
29 | {
|
30 | |
31 | test=sek; |
32 | if(test & 0b00010000) {test |= 0b01000000;} |
33 | |
34 | PORTD = test; |
35 | |
36 | }
|
37 | |
38 | }
|
39 | |
40 | |
41 | ISR(TIMER0_OVF_vect) |
42 | {
|
43 | zahler +=1632; |
44 | if(sek ==60) {min++; sek=0;} |
45 | if(zahler >=100000) {sek++; zahler -= 100000;} |
46 | |
47 | }
|