Hallo, ich habe seit kurzem ein STK500 und arbeite mich durchs AVR-GCC-Tutorial durch und bis dato gings auch ganz gut. Am 16-bit Timer bin ich nun allerdings hängen geblieben und deshalb wollte ich hier mal fragen ob ihr mal kurz über meinen Code schauen könnt (Im Anhang). Im Prinzip wollte ich nur den Timer setzen und ihn mit meinen vorgegebenen Werten die ich ins Output Compare Register geschrieben habe vergleichen. Im Falle eines "Matches" sollte dann die ISR aufgerufen werden und abwechselnd alle ports von C high und low schalten. kompilieren tut er ohne probleme, aber sehen tu ich nichts (an port C hängen die LEDs vom STK500) Ich wär sehr dankbar wenn da jemand mal rüberschauen könnte, bin noch nicht lang dabei. MfG, Tobi
Hallo, die soll dafür sorgen das beim Aufruf der ISR einmal die LED´s an und beim nächsten mal wieder ausgeschaltet werden. Je nachdem ob status=0 oder 1 ist wird das if oder das else aufgerufen. So jedenfalls der Grundgedanke.
Hi
> TCCR1B=(1<<CS12)|(1<<CS11)|(1<<CS10); // (CS12=1 CS11=0 CS10=1)=>1024
Du solltest dich an deinen Kommentar halten. Du hast einen externen Takt
eingestellt.
MfG spess
"status" wird IMMER 0 sein, da du die Variable jedes mal neu initialisierst. Also einfach vor der main das hier einfügen: volatile uint8_t status = 0;
Ouh, jaa das sehe ich ein. Habe ich auch schon geändert. bewirkt hat es leider nichts, die LED´s sind immer noch duster. MfG
Tschuldige, deinen Beitrag habe ich im Eifer des Gefechts wohl übersehen. das (1<<CS11) ist mir wohl "rausgerutsch", habe ich gerade mal geändert. Ist aber immernoch alles duster... Wenn ich mal den "Compare"-Kram weglasse und die Ausgänge per Overflow-ISR hin und her-schalten lasse funktioniert das ganze komischerweise...
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | volatile uint8_t toggle = 0; |
5 | |
6 | int main(void) |
7 | {
|
8 | DDRC = 0xFF; //äquivalent zu deiner Schreibweise |
9 | OCRIA = 3599; //ebenfalls |
10 | |
11 | TCCR1B = (1<<CS12)|(1<<CS10); //Prescaler 1024 |
12 | TIMSK = (1<<OCIE1A); //Compare Interrupt Enable |
13 | sei(); //Globale Interrupt Enable |
14 | |
15 | for(;;) |
16 | {
|
17 | }
|
18 | }
|
19 | |
20 | ISR(TIMER1_COMPA_vect) |
21 | {
|
22 | if(toggle) |
23 | {
|
24 | PORTC = 0xFF; |
25 | toggle = 0; |
26 | }
|
27 | else
|
28 | {
|
29 | PORTC = 0x00; |
30 | toggle = 1; |
31 | }
|
32 | }
|
Funktioniert bei mir einwandfrei. PORTC Toggelt mit 1/(Taktfrequenz/1024/3599) Sekunden. Gruss
Habs gerade mal compiliert und rauf-geflasht, gleiches Bild. Alles duster...
Hi > Habs gerade mal compiliert und rauf-geflasht, gleiches Bild. Alles >duster... Dann überprüfe mal oder richtige Controller eingestellt ist, un ob du überhaupt das richtige Programm flashst. MfG Spess
Ooh man ich glaubs nicht...Im voraus schonmal danke für eure Geduld mit mir! Es lag daran das AVRStudio tatsächlich nicht automatisch das Programm flasht was ich zuvor programmiert habe, sondern das was ich anfangs mal ausgewählt habe... Liegt nahe, wusste ich aber nicht. Naja, jetzt funktioniert es, danke euch allen! MfG
Hi
>Ooh man ich glaubs nicht...
Du bist nicht der Erste, mich eingeschlossen, und wirst auch nicht der
Letzte sein, dem das passiert.
MfG Spess
Naja, eventuell merke ichs mir ja jetzt besser :) Eine Frage habe ich noch, ich wollte nicht unbedingt einen neuen Thread deshalb aufmachen: Ich wollte nun mal die Input Capture Funktion des Timers benutzen, jetzt steht im Datenblatt das PE0 als alternative Funktion auch als ICP dient. Da steht auch etwas von Override-Signals aber da steig ich nicht durch und das Tutorial hilft da irgendwie nicht. Was genau muss ich denn anstellen um PE0 als ICP verwenden zu können? MfG
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.