mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik kleines Timerproblem


Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,
ich habe ein kleines Timerproblem.

Zur Steuerung eines Motors über eine Fernbedienung verwende ich für die 
Fernbedienung die RC5 Bibliothek von Peter.

Damit der Motor ohne ruckeln läuft, möchte ich einen zweiten Timer 
verwenden, der nach einer einstellbaren Zeit den Motor abschaltet, falls 
die gleiche Taste  nicht wiederholt gesendet wird.

Leider schaffe ich es nicht, den Overflow des zweiten Timers zu 
produzieren.

Alle Routinen laufen einzeln ohne Probleme, lediglich der Overflow für 
den zweiten Timer wird nicht ausgelöst.

Hier mein Codeausschnitt:

void restartTimer() {
  timerHighByte = 0;                        
  TCNT1 = 0;                                
  TCCR1B |= 1<<CS12;                   
}

void stopTimer() {
  TCCR1B  &= ~(1 << CS12);
}


void MotorOff(void)
{
}

void motor_left_on( void )
{
  stopTimer();            
  if ( MotorRightIsOn == MOTOR_ON )   
  {
    MotorOff();
  }
  if ( MotorLeftIsOn != MOTOR_ON )
  {
    MotorLeftOn();
  }
  restartTimer();
}

SIGNAL (SIG_OVERFLOW1) 
{
  timerHighByte++;
  if ( timerHighByte >= MOTOR_ON_TIME )
  {
    MotorOff();
  }
}

void main(void)
{
  // von Peter für RC5 funktioniert!!!
  TCCR0 = 1<<CS02;               //divide by 256
  // Meiner, funktioniert nicht!!!
  TCCR1B = 1<<CS12;              //divide by 256
  TIMSK = 1<<TOIE0^1<<TOIE1;           //enable timer interrupt
  
  sei();
  motor_left_on();
}

Gruss und Danke für jede Hilfe

Frank

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

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du einen Interrupt freigibst, für den kein Handler existiert, kann 
alles Mögliche passieren.

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Johannes,
eigentlich dachte ich, dass mit SIGNAL (SIG_OVERFLOW1) genau das getan 
habe.

Gruss
Frank

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

Bewertung
0 lesenswert
nicht lesenswert
Du hast ZWEI Overflow-Interrupts freigegeben (Timer 0 und Timer 1), 
hast aber nur EINEN Interrupt Handler geschrieben, nämlich den für 
Timer 1... Abgesehen davon ist SIGNAL mittlerweile veraltet. Schau mal 
ins AVR-GCC-Tutorial und/oder die libc-Dokumentation. Da steht wie's 
geht.

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt habe ich verstanden was Du meinst, aber der zweite hier fehlende 
Interrupt ist in der RC5 Unit von Peter definiert.

Gruss
Frank

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe meine Fehler gefunden. Mein Verständnis wann der Timer-Overflow 
ausgelöst wird war falsch.

Gruss
Frank

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.