Guten Abend :) ich bin schon seit einiger Zeit an einem kleinen Problem dran und komme leider einfach nicht zu einer Lösung, aber vieleicht kann mir ja jemand noch einen Tip geben. Ich benutze den internen Timer, Prescaler 1, und lasse ihn alle 100x einen Interupt generieren, damit sollte ich bei 1 Mhz auf alle 100µs kommen. Dann Zähle ich die Impulslänge und sobal das Signal über der Mittelstellung ist, 1,5ms, soll es einen Port anschalten an dem Leds hängen, und auf einem zweiten blinken. auf PB4 ist das Servo Signal und auf PB1/PB2 die Leds. ich habe den Code mal angehängt, leider finde ich den Fehler nicht, theoretisch müste es so ja funktionieren :/ MfG Martin
ppmsig wird in ISR und Hauptprogramm verwendet, ist aber nicht volatile deklariert. Außerdem solltest Du Dir das Durcheinander aus _BV()- und (1 << n)-Schreibweise abgewöhnen. Entscheide Dich für eine von beiden.
1 | ISR(TIM0_COMPA_vect){ |
2 | static uint16_t ppmwert; // defaultmässig = 0 |
3 | static uint8_t oldport; // defaultmässig = 0 |
4 | static uint16_t timerc3; // defaultmassig = 0 |
5 | uint8_t port; |
6 | |
7 | port = PINB & (1 << PB4); //port = 0|8 |
8 | |
9 | //SIG Pruefen, und zaehlen wenn portpin 1
|
10 | if(port){ |
11 | ppmwert++; //ppmwert = 0|1 |
12 | }
|
13 | |
14 | //negative Flanke
|
15 | if(oldport && !port){ //falls wahr: |
16 | ppmsig = ppmwert; // ppmsig = 1 andernfalls 0 |
17 | ppmwert = 0; // warum? |
18 | }
|
19 | |
20 | oldport = port; //warum?? beim nächste4n Aufruf ist |
21 | //oldport eh wieder Null!
|
22 | |
23 | //ca. 1 s Warten
|
24 | timerc3++; |
25 | if (timerc3 == 1000){ |
26 | timerc3 = 0; |
27 | |
28 | wechsel = 1; |
29 | }
|
30 | }
|
Wie Du vielleicht an den obigen Anmerkungen siehst, kann ppmsig maximal den Wert 1 annehmen. Dein Problem ist, dass der gcc lokal Dir die Variablen bei jedem Interrupt "neu erzeugt" und nicht einmal. Ich nehmen mal an, Dein Programm würde laufen, wenn die Variablen global definiert sind, anstatt lokal in der ISR - Routine. Gruß Marcus
Marcus wrote: > Dein Problem ist, dass der gcc lokal Dir die Variablen bei jedem > Interrupt "neu erzeugt" und nicht einmal. Nö, tut er nicht! Statische Variablen werden genau einmal initialisiert (nämlich beim Programmstart) und können danach in der betreffenden Funktion wie globale Variablen verwendet werden, mit der Einschränkung, dass sie außerhalb der Funktion (ISR) nicht sichtbar sind. Andernfalls wäre das Schlüsselwort static zimelich unsinnig, wenn die Variablen bei jedem Funktionsaufruf neu angelegt würden. Das passiert nämlich mit austomatischen lokalen Variablen.
das mit den static variablen sollte richtig sein, sehe ich auch so, aber das mit der volatile deklaration versuche ich aber mal. Poste das Ergebniss dann gleich
habe grade mal den geänderten Source compiliert und geflasht, aber keine änderung leider :/
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.