merkwürdiges Verhalten GCC Code

Gast #4356958
Lesenswert?
• ▲
▼
Auf einem tiny2313a will ich einen Timer laufen lassen. Bei Tastendruck 
(IRQ) soll der Timer starten und dann Minuten zählen. Ist eine bestimmte 
Zeit verstrichen, soll ein Pin geschaltet werden. Läuft der Timer nicht, 
soll eine andere Routine ggf. ebenfalls den Pin schalten.

Hier ein Auszug aus dem Code (ich hoffe, ich habe nicht zu viel gekürzt 
- damit es übersichtlich bleibt):
1
ISR (INT0_vect)
2
{
3
minutes = 0;          
4
half_seconds = 0;  
5
TCCR1B |= (1 << CS11);     
6
PORTD |= (1 << PD0);    
7
}
8

9
ISR (TIMER1_CAPT_vect)
10
{
11
half_seconds++;
12
if (half_seconds == 120)    
13
{
14
  minutes++;
15
  half_seconds = 0;
16
}
17
}
18

19
main()
20
{
21
 while (1)  
22
 {
23
  if (TCCR1B & (1 << CS11))    
24
  {
25
   if (minutes >= 2)    
26
   {
27
  TCCR1B &= ~(1 << CS11);          
28
  PORTD &= ~(1 << PD0);          
29
   }
30
  }
31
  else     
32
  {  
33
    _delay_ms(5000);                // *1*
34
     PORTD &= ~(1 << PD0);           // *2*
35
   }
36
 }
37
}

Wenn ich die Zeile 1 auskommentiere, klappt es. Andernfalls wird 2 
ausgeführt, selbst wenn gar nicht in diesen else-Zweig gewechselt werden 
dürfte, weil der Timer noch läuft (CS11 gesetzt). Auch wenn ich die 
Befehle in 1 und 2 vertausche funktioniert es.

Das raubt mir schon seit Stunden den Verstand - so blind kann ich doch 
gar nicht sein!?
Moderator (Firma: Titel) Persönliche Seite #4356971
Lesenswert?
• ▲
▼
Max schrieb:
> Bei Tastendruck (IRQ)
Das ist der Anfang aller Probleme. Eine Taste braucht keinen Interrupt. 
Auf jeden Fall nicht bei einem Anfänger...

> ISR (TIMER1_CAPT_vect)
Du weißt, wofür der Capture-Interrupt ist?

> (ich hoffe, ich habe nicht zu viel gekürzt
Hast du diesen Fehler mit diesem Code? Wenn nein, dann kürze deinen 
Code soweit, bis die fehlerhaften Zeilen übrigbleiben. Warum? Zu oft hat 
man hier schon Fehler gefunden, die nicht im geposteten Code waren...

ZweiSchere schrieb:
> wo sind die Zeilennummern?
Nach kurzer Suche... im Kommentar der Zeile 42... ähm 32... :-o
Gast #4357146
Lesenswert?
• ▲
▼
Lothar M. schrieb:
> Das ist der Anfang aller Probleme. Eine Taste braucht keinen Interrupt.

Wieso nicht?

> Auf jeden Fall nicht bei einem Anfänger...

Wieso Anfänger???

Lothar M. schrieb:
>> ISR (TIMER1_CAPT_vect)
> Du weißt, wofür der Capture-Interrupt ist?

Und?

Lothar M. schrieb:
> Hast du diesen Fehler mit diesem Code? Wenn nein, dann kürze deinen
> Code soweit, bis die fehlerhaften Zeilen übrigbleiben. Warum? Zu oft hat
> man hier schon Fehler gefunden, die nicht im geposteten Code waren...

Natürlich nicht.
Aber ich kann das Problem ja auf den einen Befehl eingrenzen.

Lothar M. schrieb:
>> wo sind die Zeilennummern?
> Nach kurzer Suche... im Kommentar der Zeile 42... ähm 32... :-o

Ich kann nichts dafür, wenn [_c_] keine Zeilennummern einfügt. Deshalb 
habe ich ja zwei Zeilen mit einem Kommentar versehen. Dumm, daß hier mal 
à la HTML-Tags und mal mit Sternchen etc. formatiert wird und  nicht 
alles angezeigt wird, sondern fett gemacht wird.
#4357170
Lesenswert?
• ▲
▼
> Lothar M. schrieb:
>> Hast du diesen Fehler mit diesem Code? Wenn nein, dann kürze deinen
>> Code soweit, bis die fehlerhaften Zeilen übrigbleiben. Warum? Zu oft hat
>> man hier schon Fehler gefunden, die nicht im geposteten Code waren...
>
> Natürlich nicht.
> Aber ich kann das Problem ja auf den einen Befehl eingrenzen.

Kannst du? Woran erkennst du denn, daß der ausgeführt wird? Ich verstehe 
die Programmlogik auch nicht ganz. Folgendes lese ich da raus: Wenn der 
Timer läuft, wird der Pin nach 2 Minuten auf 0 gesetzt. Wenn nicht, wird 
er dagegen schon nach 5 Sekunden auf 0 gesetzt. Allerdings ist in diesem 
Fall der Pin schon vorher 0. Wo ist also der Unterschied, ob der Pin 
sofort nicht verändert wird oder erst nach 5 Sekunden?
Gast #4357171
Lesenswert?
• ▲
▼
Max schrieb:
> Wieso Anfänger???

Deshalb:

Max schrieb:
> Natürlich nicht.
> Aber ich kann das Problem ja auf den einen Befehl eingrenzen.

Wenn das Problem an dieser einen Zeile liegt, dann ist es doch total 
einfach hier ein lauffähiges Minimalprogramm, welches dieses Problem 
zeigt, einzustellen. Dann hättest du dir die ganzen Rückfragen schon 
erspart.
Falls es doch nicht so einfach sein sollte, ein solches Minimalbeispiel 
zu erzeugen, dann wird das Problem wohl nicht an diesem einen Befehl 
liegen.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.