mikrocontroller.net

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


Autor: MartinNPN (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISR(TIM0_COMPA_vect){    
  static uint16_t ppmwert; // defaultmässig = 0
  static uint8_t oldport;  // defaultmässig = 0
  static uint16_t timerc3; // defaultmassig = 0
  uint8_t port;
  
        port = PINB & (1 << PB4); //port = 0|8
    
  //SIG Pruefen, und zaehlen wenn portpin 1
  if(port){
    ppmwert++;        //ppmwert = 0|1
  }  
  
  //negative Flanke
  if(oldport && !port){     //falls wahr:
    ppmsig = ppmwert; // ppmsig = 1 andernfalls 0
    ppmwert = 0;      // warum?
  }
  
  oldport = port;           //warum?? beim nächste4n Aufruf ist 
                                  //oldport eh wieder Null!
  
  //ca. 1 s Warten
  timerc3++;
  if (timerc3 == 1000){
    timerc3 = 0;
  
    wechsel = 1;
  }
}

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MartinNPN (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MartinNPN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe grade mal den geänderten Source compiliert und geflasht, aber keine 
änderung leider :/

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.