Forum: Mikrocontroller und Digitale Elektronik Tmer0 Probleme beim ATTiny2313 C-Code


von Ralf B. (rabu)


Angehängte Dateien:

Lesenswert?

Hallo.

Ich habe ein Problem mit dem Timer0 im ATTiny2313.

Folgendes möchte ich erreichen. Das Programm soll auf eine externe 
Information (HI Eingang auf PINB6) warten. Kommt dieser in einem 
Zeitfenster von ca. 2 Sekunden nicht, wird die Unterfunktion verlassen 
und spring wieder in main() zurück.
Meine Lösung: Timer Interrupt ändert den Wert einer globalen Variablen 
und die While Schleife pollt auf dieser Varaiblen oder abereben auf den 
zu erwartenden ext. Input.

Nur leider funktioniert das so nicht. Durch eine gelbe LED überprüfe ich 
den ISR. Somit müsste auch die globale Variable geändert werden. Aber 
die entprechende While Schleife wird nicht verlassen.

Habe ich da irgendeinen Denkfehler?

Schon mal vorab... Vielen Dank für Eure Beiträge.

Gruß
RaBu

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Da ist ein Logikfehler drin

>  while ( !( PINB&(1<<PB6)) || time_over_01 != 0x01 );
Warten so lange wie LOW an PB6 UND kein 2s Timeout aufgetreten ist.
  while ( PINB & (1<<PB6) == 0 && time_over_01 != 0x01 );

von Ralf B. (rabu)


Lesenswert?

Stefan B. schrieb:
> Da ist ein Logikfehler drin
>
>>  while ( !( PINB&(1<<PB6)) || time_over_01 != 0x01 );
> Warten so lange wie LOW an PB6 UND kein 2s Timeout aufgetreten ist.
>   while ( PINB & (1<<PB6) == 0 && time_over_01 != 0x01 );

Hi.
Die Logik muss ein ODER sein.
Solage an PB6 kein HI anliegt ODER
kein timeout aufgetreten ist verbleibt der uc in der Schleife.

Kommt der HI Pegel vor ablauf des timeouts gehts weiter, ansonsten gehts 
weiter, wenn ca 2s abgelaufen sind.

Grundsätzlich möchte ich verhindern, dass der uc in der while() 
verbleibt.

von Ralf B. (rabu)


Lesenswert?

Stefan B. schrieb:
> Da ist ein Logikfehler drin
>
>>  while ( !( PINB&(1<<PB6)) || time_over_01 != 0x01 );
> Warten so lange wie LOW an PB6 UND kein 2s Timeout aufgetreten ist.
>   while ( PINB & (1<<PB6) == 0 && time_over_01 != 0x01 );

Hi,
so ist das schon mal mit der Logik... hätte vorher mal überlegen sollen 
:-)

while ( PINB & (1<<PB6) == 0 && time_over_01 != 0x01 );

sollte auch funktionieren! Werde es nachher mal testen.

Gruß
Ralf

von Ralf B. (rabu)


Lesenswert?

Hi,

es funktioniert!! Vielen Dank!!

Gruß Ralf

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.