abend..
vorweg frequenzen/prescaler usw. sind total bescheuert gewählt aber egal
mir geht es ums prinzip..
das ganze soll letztlich ein binärzähler sein der im sekundentakt
hochzählt....dummerweise tut er das nicht er ist einfach dauer an :P
unabhängig davon ob ich den uC mit 16MHZ oder 1MHZ laufen lasse...
die leds hängen an PORTC 0-3
das original beispiel kommt aus dem gcc tutorial. allerdings
funktionierte das nicht da einige bezeichnungen und register scheinbar
falsch waren.
erste frage: wenn der zähler 255 erreicht hat und umspringt, wird dann
ein interrupt ausgelöst?
im original beispiel war extra eine zahl definiert an der der interrupt
ausgelöst wird.
das register gibt es nur leider nicht welches dort verwendet wird:
beim lesen der atmega dokumentation hörte es sich aber so an als würde
beim 255 -> 0 ein overflow produziert....daher habe ihc mir gedacht
nehme ich den und rechne es mir passend...
die hier genutzten zahlen sind für ein 16MHZ quarz ausgelegt.
seht ihr auf anhieb fehler?
gute nacht
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <avr/delay.h>
|
4 |
|
5 |
|
6 | volatile int zahler, sek;
|
7 | main()
|
8 | {
|
9 | //Timer 0 konfigurieren
|
10 | DDRC = 0x0F; //definiert portC ping 0-3 als ausgang
|
11 | PORTC = 0x0F; //setzt die ausgänge 0-3 vom port C auf logisch 0
|
12 | TCCR0 = (1<<CS00) | (1<<CS02); //1024er prescaler
|
13 |
|
14 |
|
15 |
|
16 | TIMSK|=(1<<TOIE0); //timer overflow interrupt
|
17 | sei(); //Globale Interrupts aktivieren
|
18 | while(1)
|
19 | {
|
20 | PORTC=sek;
|
21 | _delay_ms(200);
|
22 | }
|
23 |
|
24 | }
|
25 |
|
26 |
|
27 | ISR(TIMER0_COMP_vect)
|
28 | {
|
29 | zahler +=159;
|
30 |
|
31 | if(zahler >=10000) {sek++; zahler -= 10000;}
|
32 |
|
33 | }
|