Problem mit Wechseltaster

HolgerBri

Neues Mitglied
08. Mai 2009
17
0
0
Sprachen
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.

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
 
Zeiten von Kontaktprellen

Hi Holger,

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.
also nach meinem Verständnis ein Taster mit Mittelstellung der je nachdem
ob du ihn nach links oder rechts drückst PA1 oder PA2 nach GND schaltet.
Unf für den INT1 hast du ne Shottky (BAT41) mit der Anode an PA2(INT1)
und der Kathode an PA1 liegen um den PA2 auch nach GND zu ziehen wenn
PA1 durch den Taster nach GND geschaltet wird.

PA1---|<---PA2(INT)

PA1-----o Taster mit Mittelstellung
. . . . . . -----o-----|GND
PA2-----o

Also die Port-Initialisierungen sehen schon mal richtig aus (Pullups und so).
... und da hört es mit BASCOM bei mir auch schon ziemlich auf ...

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...
Ich hab (weil ich es selbst brauchte) mal vor 2..3 Tagen Prellzeiten von
Kontakten rausgesucht. Die liegen so zwischen 2..10ms . Je nach Qualität
des Schalters. Aber mit 5ms sollte man sicherheitshalber immer rechnen.

Gruß
Dino
 
Hi dino,

Du hast die Schaltung eindeutig besser beschrieben als ich :).

Die Prellzeit wollte ich durch das Warten von 50ms und das Setzen von GIFR.7 (INTF1) in den Griff bekommen...

Viele Grüße
Holger
 
Hi Holger,

Du hast die Schaltung eindeutig besser beschrieben als ich :).
danke für die Blumen :) Kommt hier im Forum aber schon aus Routine ;)

Die Prellzeit wollte ich durch das Warten von 50ms und das Setzen von GIFR.7 (INTF1) in den Griff bekommen...
und da muß wohl mal ein anderer über den BASCOM-Code rüberschauen.
(oder es ist für mein Gehirn schon etwas spät :eek: ;) )

Gruß
Dino
 
Hallo Holger!

Es ist in der Tat schon etwas spät und ich bekomme nun auch nicht mehr alles auf die Reihe, aber.....

Was soll das Thema mit der BAT für den PA1? :hmmmm:

Ich bin der Meinung, da unterliegst du einem Fehler.
Um das genauer zu beschreiben müsste ich mir das Datenblatt ziehen....
Tatsache ist, dass die Interrupts eine bestimmte "Rangfolge" haben und nicht alle die selben Prioritäten besitzen.
Aus dem Grunde verstehe ich deinen Hardwareaufbau nun nicht.... letztlich kannst du das doch alles per Software erledigen. ;)

Dann noch zum Thema entprellen....
Die Sache mit den 50ms Wartezeit wird dir beim INT wohl nicht viel nützen, denn wenn der INT ausgelöst wird dann reagiert der µC auch sofort. :eek:
Wo soll denn da die Wartezeit greifen? :hmmmm:

Leider ist es schon etwas spät, um dir meine einzelnen Gedanken näher zu erklären.... aber vielleicht helfen sie dir ja auch so schon etwas weiter. :)

Schau einfach noch mal ins Datenblatt wegen der Interrupts und entprell deinen Schalter hardwareseitig.
Danach ändere dein Programm so, dass du die BAT entfernen kannst!

Schöne Grüße,
Cassio
 
Hallo,

ja mit dem Interrupt war ich natürlich wirklich auf dem Holzweg :fie:

Ich habe das nun ganz einfach mit Debounce gelöst und den Debounce-Delay gleich auf 100ms gesetzt...

Vielen Dank an Euch

Viele Grüße
Holger
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)