www.mikrocontroller.net

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


Autor: Ralf Bulle (rabu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 );

Autor: Ralf Bulle (rabu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf Bulle (rabu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf Bulle (rabu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

es funktioniert!! Vielen Dank!!

Gruß Ralf

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.