Hallo zusammen,
ich habe ein ziemliches Problem mit einem recht profanen Teil meiner Schaltung. Ich habe an meinem Attiny461 einen Wechseltaster angeschlossen, der Ground durchschaltet. Eine Seite des Wechseltasters geht an PA1, die andere an PA2 (INT1).
Damit beide Signale einen Interrupt auslösen, habe ich zwischen PA1 und PA2 eine BAT41 mit Sperrrichtung gegen PA1 vorgesehen.
Im Folgenden ein kleines Testprogramm - dort kommt in den meisten Fällen auf der Anzeige nach der 0 eine 1.
Was läuft da schief? Das kann doch nicht einfaches Prellen sein, oder? Ich hatte auch schon mal testweise direkt hinter Isr_int1: ein DISABLE INT1 eingefügt. Der Interrupt wurde nach Wait 2 wieder eingeschaltet - ohne Ergebnis...
Viele Grüße
Holger
ich habe ein ziemliches Problem mit einem recht profanen Teil meiner Schaltung. Ich habe an meinem Attiny461 einen Wechseltaster angeschlossen, der Ground durchschaltet. Eine Seite des Wechseltasters geht an PA1, die andere an PA2 (INT1).
Damit beide Signale einen Interrupt auslösen, habe ich zwischen PA1 und PA2 eine BAT41 mit Sperrrichtung gegen PA1 vorgesehen.
Im Folgenden ein kleines Testprogramm - dort kommt in den meisten Fällen auf der Anzeige nach der 0 eine 1.
Code:
$regfile = "ATtiny861.dat"
$crystal = 8000000
' Port A konfigurieren
Ddra = &B1111_1000
Porta = &B1111_1111
' PinA.0 = Input Regen-Led
' PinA.1 = Input Schalter Up
' PinA.2 = Input Schalter Down
' PinA.3 = Output Glättewarnung
' PinA.4-7 = Output BCD-Ausgabe
Regen Alias Pina.0
Sw_up Alias Pina.1
Led Alias Porta.3
Anz2 Alias Porta.4
Anz4 Alias Porta.5
Anz8 Alias Porta.6
Anz1 Alias Porta.7
' Port B konfigurieren
Ddrb = &B0000_1000
Portb = &B1111_1011
' Pinb.3 = Output PWM-Ausgang zu Heizgriffen
' Pinb.4 = I/O 1Wire
' Pinb.5 = Input Zündung
' Pinb.6 = Input Tachosignal
Config 1wire = Portb.4 ' DS1820
Ignition Alias Pinb.5
Declare Sub Zeige7seg(byval Wert As Byte)
Dim Change As Bit
Dim St_up As Bit
Enable Int1
On Int1 Isr_int1
Mcucr.1 = 1 ' Interrupts auf
Mcucr.0 = 0 ' fallende Flanke
Change = 0
Enable Interrupts
Do
Zeige7seg 15
If Change = 1 Then
Change = 0
If St_up = 1 Then
Zeige7seg 1
Else
Zeige7seg 0
End If
Wait 2
End If
Loop
End
' Interrupt bei bei Schalterwechsel
Isr_int1:
St_up = Sw_up
Change = 1
Waitms 50
Return
' Ausgabe von Wert in BCD-Form
Sub Zeige7seg(byval Wert As Byte)
Anz1 = Wert.0
Anz2 = Wert.1
Anz4 = Wert.2
Anz8 = Wert.3
End Sub
Was läuft da schief? Das kann doch nicht einfaches Prellen sein, oder? Ich hatte auch schon mal testweise direkt hinter Isr_int1: ein DISABLE INT1 eingefügt. Der Interrupt wurde nach Wait 2 wieder eingeschaltet - ohne Ergebnis...
Viele Grüße
Holger