So, wieder @home gibts jetzt die Codeschnippsel:
Ich habe momentan einen String zur Übertragung benutzt (Testphase), da man es besser mit mitlesen kann finde ich. Dass da noch mehr als der eigentliche String übertragen wird (CR/LF) ist mir klar - wird aber dezent vom Programm erstmal überlesen. Umstieg auf Bytes wird folgen, da die Uhr ne Funktion bekommen soll, mit der man sich die Codes einer RC5-FB anzeigen lassen kann, um dann enstprechend zu Programmieren.
Der IR-Empfänger:
Code:
Do
Getrc5(address , Command)
Getrc5(address_validation , Command_validation)
If Command = Command_validation Then
If Address = Address_validation Then
If Ischarwaiting() = 1 Then
Received = Inkey()
If Received = "A" Then
If Address = 30 Then
Select Case Command
Case 189
Print "A"
Case 61
Print "A"
Case 16
Print "B"
Case 144
Print "B"
Case 32
Print "E"
Case 160
Print "E"
End Select
Else
Print "D"
End If
End If
End If
End If
End If
Loop
End
Uhren-µC:
Hier fehlt jetzt natürlich einiges an Code - die Grundfunktion dürfte aber klar sein.
Code:
Open "Comb.0:9600,8,N,1" For Input As #1 ' RXD Receive Data
Open "Comb.1:9600,8,N,1" For Output As #2 'TXD Transceive Data
Do
Received = Inkey(#1)
If Received = "D" Then
nop
Else
If Received = "B" Then
Incr Digit3
If Digit3 = 10 Then
Digit3 = 0
Digit4 = Digit4 + 1
End If
If Digit4 = 6 Then
Digit4 = 0
End If
Waitms 300
End If
If Received = "E" Then
Incr Digit5
If Digit5 = 10 Then
Digit5 = 0
Digit6 = Digit6 + 1
End If
If Digit6 = 2 Then
If Digit5 = 4 Then
Digit6 = 0
Digit5 = 0
End If
End If
Waitms 300
End If
END IF
Loop
Sekundentick:
Print #2 , "A"
Incr Digit1
Return
Folgendes Problem ergibt sich halt hier: Ich arbeite mit 9600 Baud. Immer wenn der Empfang von einem Interrupt gestört wird lässt sich Müll nachweisen, ist ja auch logisch - in den meisten Fällen wirds halt einfach ignoriert, weil es nicht durch die Schleifen geht.
Noch ein Nachteil: Die Anfrage an den IR-µC wird im Sectic gestellt. Also einmal pro Sekunde, was zum Stellen der Uhr einfach zu K***** ist
.
Setze ich das in die Main-Loop, stürzt der IR-Controller einfach ab. Der andere mögliche Interrupt vom Multiplexing ist da nciht viel anders.
Daher die Idee einfach senden, und wenn was da ist soll ers in der Main-Loop merken und eine Subroutine starten. Problem: Ich kann (könnte schon, möchte aber nciht) die Mainloop nicht anhalten und auf ein Zeichen warten, weil sie u.A. die Berechnung der einzelnen Ziffern übernimmt - aber nur wegen eines optischen Details (Verzögerung). Das wiederum geht also nur mit einem Buffer.
Der Buffer geht aber seinerseits wieder nicht - weil er ja in Software geschrieben werden müsste und da müsste dann schon wieder ein Interrupt mindestens her - der HW-Buffer ist ja physikalisch vorhanden.
Also gibt es für mein Problem 2 Lösungsmöglichkeiten:
Entweder die Anfrage/Antwort-Möglichkeit extrem beschleunigen - nur wie? - oder aber wie beschrieben, IR sendet ständig, und Uhr schaut nach, ob was im Buffer liegt...
Auch hier noch mal der Hinweis: Wenn ihr der Meinung seid, mit einer anderen Übertragungsart ginge das evt. besser, immer her damit...
Gruß Rainer