Forum: Mikrocontroller und Digitale Elektronik merkwürdiges Verhalten GCC Code


von Max (Gast)


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!?

von ZweiSchere (Gast)


Lesenswert?

Das Problem ist in Zeile 42.

Falls das wirklich ernst gemeint sein sollte - wo sind die 
Zeilennummern?

Falls nicht - was ich annehme - bis Freitag hat sind es noch 1 Std. 40 
Min.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

: Bearbeitet durch Moderator
von Max (Gast)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Max schrieb:
> main()
> {
>    ...
> }

Ohne sei() kein Interrupt. Wofür sind also die ISRs gut?

> Wenn ich die Zeile 1 auskommentiere, klappt es.

Was klappt dann?

Bist Du Dir sicher, dass obiges genau der Code ist, dessen Verhalten Du 
versuchst zu beschreiben?

: Bearbeitet durch Moderator
von Rolf M. (rmagnus)


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?

von progger (Gast)


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.

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.