Forum: Mikrocontroller und Digitale Elektronik kleines Timerproblem


von Frank L. (franklink)


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:
1
void restartTimer() {
2
  timerHighByte = 0;                        
3
  TCNT1 = 0;                                
4
  TCCR1B |= 1<<CS12;                   
5
}
6
7
void stopTimer() {
8
  TCCR1B  &= ~(1 << CS12);
9
}
10
11
12
void MotorOff(void)
13
{
14
}
15
16
void motor_left_on( void )
17
{
18
  stopTimer();            
19
  if ( MotorRightIsOn == MOTOR_ON )   
20
  {
21
    MotorOff();
22
  }
23
  if ( MotorLeftIsOn != MOTOR_ON )
24
  {
25
    MotorLeftOn();
26
  }
27
  restartTimer();
28
}
29
30
SIGNAL (SIG_OVERFLOW1) 
31
{
32
  timerHighByte++;
33
  if ( timerHighByte >= MOTOR_ON_TIME )
34
  {
35
    MotorOff();
36
  }
37
}
38
39
void main(void)
40
{
41
  // von Peter für RC5 funktioniert!!!
42
  TCCR0 = 1<<CS02;               //divide by 256
43
  // Meiner, funktioniert nicht!!!
44
  TCCR1B = 1<<CS12;              //divide by 256
45
  TIMSK = 1<<TOIE0^1<<TOIE1;           //enable timer interrupt
46
  
47
  sei();
48
  motor_left_on();
49
}

Gruss und Danke für jede Hilfe

Frank

von Johannes M. (johnny-m)


Lesenswert?

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

von Frank L. (franklink)


Lesenswert?

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

Gruss
Frank

von Johannes M. (johnny-m)


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.

von Frank L. (franklink)


Lesenswert?

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

Gruss
Frank

von Frank L. (franklink)


Lesenswert?

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

Gruss
Frank

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.