Servus zusammen, ein Neuer.
Bislang hatte ich immer nur mitgelesen, um Lösungen für kleine Problemchen oder auch nützliche Anregungen zur Relalisierung bestimmter Dinge zu finden. Nun habe ich ein Problem an dem ich schier verzweifle und bisher keine Lösung gefunden habe.
Ich habe eine Applikation mit ATtiny84 bei der ich über den Timer0 mir ein Rechtecksignal mit 1 kHz erzeuge, das ich über einen Transistor an eine IR-Reflexlichtschranke sende (Sendediode).
Das Ausgangssignal der Lichtschranke (eigentlich sind es zwei Lichtschranken) lese ich über zwei Digitalpins ein und werte über PulseIn-Abfragen (HIGH und LOW) die Periodendauer T1 und T2 der Signale aus, um diese Informationen anschließend weiter zu verwenden. Bei der ersten Übereinstimmung der Periodendauern (konkret 1 ms zu-/abzüglich Toleranz) setze ich je Lichtschranke ein Status-Byte und stelle die Informationen über LED nach außen hin dar. Das funktioniert auch einwandfrei.
Sind bei Lichtschranken gleichzeitig nicht mehr aktiv, PulseIn liefert in dem Falle Timeouts, d. h. T1 = T2 = 0, frage ich diesen Status ab und möchte die Anzeigen sowie die Status-Bytes auch wieder nach einer Wartezeit von beispielsweise 3 s über die Abfrage von millis() wieder zurücksetzen. Die Abfrage funktioniert, die millis() allerdings nicht.
Ich weiß nicht was ich falsch mache.
Hier die Definition des Timers:
// Timer-Definitionen Timer 0 für ATtiny 84
void setupTimer0_ATtiny84()
{
noInterrupts();
// Clear registers
TCCR0A = 0;
TCCR0B = 0;
TCNT0 = 0;
// 1000 Hz (4 MHz/((63+1)*64)) zwei IR/Periode = doppelte IR-Frequenz
// berechneter Wert 61, gewählt 63
// count up to 63 set in Output Compare Register
OCR0A = 61;
// CTC
TCCR0A |= (1 << WGM01);
// Prescaler 64
TCCR0B |= (1 << CS01) | (1 << CS00);
// interrupt when Compare Match with OCR0A
TIMSK0 |= (1 << OCIE0A);
// Pin PB2 an PortB (pin Nr. 5) ist Ausgabe für Sendediode
DDRB |= (1<<PB2);
interrupts();
}
Hier die Abfrage zu den millis():
// globale Variablen
unsigned long T1, T2, Zeit_prev;
unsigned long intervall = 3000;
// Abfrage in der Loop
// Timeout LS1 und LS2, Lichtschranken inaktiv
if (T2 == 0 && T1 == 0)
{
if (millis()-Zeit_prev >= intervall)
{
Zeit_prev = millis();
PORTA &= ~(1<<PA0); // Status-LED LS1 aus
LS2_state = 0; // Status-Byte LS2 zurücksetzen
PORTA &= ~(1<<PA1); // Status-LED LS1 aus
LS1_state = 0; // Status-Byte LS1 zurücksetzen
}
}
Die erste Abfrage nach T1 && T2 funktioniert, auch das zurücksetzen der Bits PA0 und PA1, die Abfrage der millis() allerdings nicht.
Wo ist das Problem zu suchen.
Die IDE-Einstellung zur Funktion millis() ist auf enable sowie alle übrigen Einstellungen für ATtiny84 no Bootloader auf default und 8 Mhz interner Takt. Und ja, den Bootloader habe ich vorher natürlich auch aktualisiert.
Es wäre nett wenn mir jemand weiterhelfen könnte.
Grüße Thomas