Forum: Mikrocontroller und Digitale Elektronik Problem mit einem Tiny13 und einem Servo Signal


von MartinNPN (Gast)


Angehängte Dateien:

Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von Marcus (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von MartinNPN (Gast)


Lesenswert?

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

von MartinNPN (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.