Zitat von
modtronic
Hoffe ich habe das verständlich erklären können ?
Ja, ich glaube wenigstens, daß ich das jetzt verstanden habe. Ich habe auch mal ein Programm in Bascom mit den wichtigsten Bestandteilen und hoffentlich verständlich kommentiert eingefügt. Leider kann ich C nicht wirklich und kann nicht beurteilen, ob ich das gleiche mache wie Peter. Auf jeden Fall habe ich auch den Millisekundentimer, der "Timer" für die Portpins runterzählt. Programm ist auch nicht getestet.
Code:
'
' ab Hochkomma (') beginnt in Bascom ein Kommentar
'
' mit PIND.Bit_no, also Variable bzw Register Punkt Ziffer kann man einzelne Bits Adressieren.
'
'####################################################################
'1. Programm liest PIND Register ein und speichert für spätere Vergleiche.
'2. Stellt Änderungen von Portpins zum vorherigen Einlesen fest
'3.a Wird ein Wechsel von "1" auf "0" festgestellt, wird ein Timerregister für den entsprechenden Eingang auf 200ms gesetzt
'3.b Wird ein Wechsel von "0" auf "1" festgestellt, wird das entsprechende Timerregister auf 0 gesetzt.
'0 Ein Interrupt decrementiert jede Millisekunde alle Timerregister größer 0 um eins.
'4.a Bei einem gesetzten Timerregister fand ein Eingangswechsel von 1 nach 0 statt und der Eingang muß noch auf 1 bleiben
'4.b Bei einem Timerregister = 0 gab es einen Wechsel von 0 nach 1 oder die Zeit lief ab ->
' Die eingelesene "0" kann durchgreifen und zur Ausgabe übernommen bzw. eine eingelesene "1" wird übernommen.
'5. Ausgabe über I2C
'####################################################################
Config Timer0 = Timer , Prescale = ... 'für 1ms Interrupts
'time_counter ist ein array für Zeitmessung für einzelne Bits im PIND
Dim Time_counter(8) As Byte
'Initialisierung von Pind_save und output_save
Output_byte = Pind 'erstes Einlesen von PIND
Pind_save = Output_byte
'Erste Ausgabe über I2C
I2c_write(output_byte)
Do 'Hauptschleife
Pind_get = Pind 'Einlesen PIND Register
'Feststellen, welche Eingänge sich geändert haben (entsprechende Pind_change Bits werden zu "1")
Pind_change = Pind_get Xor Pind_save
'Scannen nach geänderten Eingängen
For Bit_no = 0 To 7
'Nur veränderte PIND Eingänge bearbeiten
If Pind_change.bit_no = 1 Then
'Falls Eingang = "0" gab es Wechsel nach 0 -> Timer zum runterzählen setzen, sonst Wechsel nach "1" und Timer auf "0" setzen
If Pind_get.bit_no = 0 Then Time_counter(bit_no) = 200 Else Time_counter(bit_no) = 0
'Wenn Timer läuft, output noch auf "1" lassen sonst gegenwärtigen Zustand "0" oder "1" nach output übernehmen.
If Time_counter(bit_no) > 0 Then Output_byte.bit_no = 1 Else Output_byte.bit_no = Pind_get.bit_no
End If
Next I
Pind_save = Pind_get
I2c_write(output_byte) 'Ausgabe
Loop 'Ende Hauptschleife
Isr_timer: 'soll jede ms aufgerufen werden
For I = 0 To 7
If Time_counter(i) > 0 Then Time_counter(i) = Time_counter(i) - 1 'zählt Zeit für den "1" auf "0" Wechsel runter
Next I
Return
Lesezeichen