Für eine gute Idee fehlen mir immer noch Details. Die Subs sind mir noch zu geheimnisvoll. Wenn diese umfangreich sind, ist die Wahrscheinlichkeit hoch, dass da mindestens eine Schleife vorhanden ist, wo das Flag abgefragt werden kann.
Für eine gute Idee fehlen mir immer noch Details. Die Subs sind mir noch zu geheimnisvoll. Wenn diese umfangreich sind, ist die Wahrscheinlichkeit hoch, dass da mindestens eine Schleife vorhanden ist, wo das Flag abgefragt werden kann.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Die eine Sub sieht so aus:
Ich kann hier einfach so 3-4 Mal die Abfrage des Flags streuen, aber gibt es nicht eine efizientere Methode als das polling des Flags?Code:Sub1: For I = 0 To 7 Lread1: Enable Interrupts Config Powermode = Idle 'PCINT0 ist aktiv, bei Flanke wird er geweckt und je nach auf-/absteigender Flanke Edge gesetzt Disable Interrupts If Edge = 1 Then Goto Lread1 End If Timer0 = 256 - 60 Start Timer0 Rotate Inputbyte, Right Waitus 15 Inputbyte.7 = PINB.0 Next I Stop Timer0 Return
Das, was bereits geschrieben wurde, ist doch effizient. Die Abfrage auf das Flag zu "streuen" ist nicht hilfreich.
Was macht wohl der Protokollautomat in dem OneWire-Chip? Der kann auch nur Zeitabstände zwischen zwei Flanken messen (oder vergleichen mit analogem Zeitglied) und bewerten, ob das ein gültiges Bit bzw. Signal war oder nicht; im letzteren Fall ist das ein Grund zum Reset der Kommunikation.
Ebenso solltest du die Kommunikation aufbauen: Bit für Bit senden und empfangen und immer parallel dazu auf Zeitüberschreitung überwachen. Also nicht irgendwie einstreuen sondern genau jede erwartete Zustandsänderung gegen unerwartete Verzögerungen etc. absichern.
Wenn OneWire was ähliches wie das Clock Stretching durch den Empfänger bei I2C kennen sollte, muss auch der Sendevorgang entsprechend überwacht werden.
Wobei auch ich den Empfang komplett in einer Timer_ISR erledigen würde. Ähnlich dem DCF Empfang.Code:Sub1: For I = 0 To 7 Lread1: Enable Interrupts Config Powermode = Idle 'PCINT0 ist aktiv, bei Flanke wird er geweckt und je nach auf-/absteigender Flanke Edge gesetzt Disable Interrupts If Flagbyte <> 1 Then '1 für Sub1, 2 für Sub2, ... 255 für Reset Return End If If Edge = 1 Then Goto Lread1 End If Timer0 = 196 Start Timer0 Rotate Inputbyte, Right Waitus 15 Inputbyte.7 = PINB.0 Next I Stop Timer0 Return
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Danke für alle eure Antworten. Bis jetzt siehts erfolgversprechend aus, morgen wird systematisch durchgetestet. Aber ich bin optimistisch![]()
Lesezeichen