Servus,
irgendwie steh ich grad auf dem Schlauch. ich willmit nem Attiny den PCINT an B.0 nutzen,das klappt soweit auch schon. Nur ist es ja per Design das der Attiny für jede Flanke des impulses das Interupt Flag setzt. D.h. während meine interruptroutine noch läuft wird schon der nächste Einsprung gesetzt, die Daten werden 2x ausgeworfen. Leider ist der impuls äusserst kurz, selbst wenn ich in der Routine nur nen Flag setzte ist der zweite Einsprung schon da.
Alles anzeigen
Ich kann das natürlich mit der (jetzt auskommentierten) Abfrage der Variable "Intflanke" in zeile 67+85+87 rausbasteln. Wenn da aber irgendwann mal ne Störung eingefangen wird läuft rein technisch gesehen die Ausgabe mit der fallenden Flanke. An sich kein Problem, ich finds halt unschön .
Jetzt steh ich halt aufm Schlauch, man kann doch das Flag im Interruptregister wieder löschen das den Interrupt auslöst während mein Routine noch läuft. Nur wie heists??
Tobias
irgendwie steh ich grad auf dem Schlauch. ich willmit nem Attiny den PCINT an B.0 nutzen,das klappt soweit auch schon. Nur ist es ja per Design das der Attiny für jede Flanke des impulses das Interupt Flag setzt. D.h. während meine interruptroutine noch läuft wird schon der nächste Einsprung gesetzt, die Daten werden 2x ausgeworfen. Leider ist der impuls äusserst kurz, selbst wenn ich in der Routine nur nen Flag setzte ist der zweite Einsprung schon da.
Quellcode
- $regfile = "attiny4313.dat"
- $crystal = 8000000
- $hwstack = 40
- $swstack = 16
- $framesize = 40
- 'Alias
- Din Alias Portd.5 'Mit DIN an der Max-Platine verbinden
- Clk Alias Portd.4 'Mit Clk an der Max-Platine verbinden
- Cs Alias Portd.3 'Mit Cs an der Max-Platine verbinden
- 'ports
- Config Din = Output
- Config Clk = Output
- Config Cs = Output
- Config Pinb.0 = Input
- Dim Ausgabestring As Double
- Dim Ausgabe(8) As Byte At Ausgabestring Overlay
- Dim Befehl As Byte
- Dim Disp_daten As Byte
- Dim Faden As Double
- Dim Fadenteil(8) As Byte At Faden Overlay
- Dim Intflanke As Bit
- Enable Pcint0
- On Pcint0 Int0_isr
- Pcmsk = &B00000001
- Enable Interrupts
- ' Initialisieren des MAX7219
- Befehl = &H09 : Disp_daten = &H00 ' kein decode "B" für alle Digits weil 8x8 Matrix
- Gosub Led_write_command
- Befehl = &H0A : Disp_daten = &H04 ' Helligkeit 0-F
- Gosub Led_write_command
- Befehl = &H0B : Disp_daten = 7 ' Anzahl Digits 8 weil 8x8 Matrix
- Gosub Led_write_command
- Befehl = &H0F : Disp_daten = 0 ' Test Off
- Gosub Led_write_command
- Befehl = &H0C : Disp_daten = 1 ' Shutdown Off
- Gosub Led_write_command
- Do
- Print "nothing"
- Wait 1
- Loop
- End
- End
- Led_write_command:
- Cs = 0
- Shiftout Din , Clk , Befehl , 1
- Shiftout Din , Clk , Disp_daten , 1
- Cs = 1 'Flanke von 0 zu 1 überträgt den Befehl
- Return
- Int0_isr:
- 'If Intflanke = 0 Then
- Befehl = &H01 : Disp_daten = Fadenteil(1)
- Gosub Led_write_command
- Befehl = &H02 : Disp_daten = Fadenteil(2)
- Gosub Led_write_command
- Befehl = &H03 : Disp_daten = Fadenteil(3)
- Gosub Led_write_command
- Befehl = &H04 : Disp_daten = Fadenteil(4)
- Gosub Led_write_command
- Befehl = &H05 : Disp_daten = Fadenteil(5)
- Gosub Led_write_command
- Befehl = &H06 : Disp_daten = Fadenteil(6)
- Gosub Led_write_command
- Befehl = &H07 : Disp_daten = Fadenteil(7)
- Gosub Led_write_command
- Befehl = &H08 : Disp_daten = Fadenteil(8)
- Gosub Led_write_command
- 'End If
- 'Toggle Intflanke
- Return
Jetzt steh ich halt aufm Schlauch, man kann doch das Flag im Interruptregister wieder löschen das den Interrupt auslöst während mein Routine noch läuft. Nur wie heists??
Tobias