Tasten Entprellen

Phantomias2006

Mitglied
10. Jan. 2010
56
0
6
Sprachen
Hallo,

Mein Name ist Florian und wie Ihr sehen könnt bin ich neu hier im Forum
und auch im bereich Microcontroller.

Meine Berufliche Ausbildung ist KFZ-Technikermeister. Ich habe zwar ein
wenig ahnung von der Elektronik aber bitte habt etwas nachsicht mit mir:flowers:

Gut dann fang ich mal mit meinen Problem an.
Da mich Microcontroller schon immer fasziniert haben habe ich mich entschlossen
mir eine EVA. Board von Pollin zu besorgen.(Dürften ja einige kennen)
Desweiteren habe ich mir auch das Buch von Claus Kühnel gekauft.
Da ich über die Seriell-ISP den Controller nicht programmieren konnte
(keine Verbindung?!) habe ich kurzerhand ein mk2 bestellt.
So heute ist das mk2 eingetroffen und so hab ich mich auch gleich ans Programmieren gemacht.

Etwas herumexperimentiert mit den Tastern den Piepser (der funkt aber nicht besonders) Ein Blinklicht programmiert etc.
Aber das Problem beginnt schon beim Testcode der dem Pollinboard beiliegt.

Taster1
Taster2
Led1
Led2

Wird Taste 1 gedrückt leuchtet LED 1
Wird Taste 2 gedrückt leuchtet LED 2
Wenn eine Taste nochmal gedrückt wird geht die dazugehörige LED wieder aus.

Das Problem ist wenn ich ein paar mal z.B Taste1 drücke kann es vorkommen
das LED2 leuchtet obwohl LED1 leuchten sollte.
Desweiteren kann es passieren das er auf den Tastendruck nicht reagiert. usw.

Hier der Code: (Bascom)
Code:
$regfile = "m16def.dat"                                     'definieren des verwendeten Chips

$crystal = 16000000                                         'definieren des verwendeten externen Quarz (8MHz)

Dim A As Byte                                               'dimensionieren der verwendeten Variablen
Dim B As Byte

Ddrd = &B11100000                                           'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
Portd = &B00000000                                          'definieren der einzelnen Pins an einem Port ( 0= low level; 1= high level)


Main:                                                       'Hauptprogramm
Do                                                          'Anfang der Schleife

  If Pind.2 = 1 Then                                        'Wenn an Pin 2 von Port D ein high level anliegt, dann...

  Toggle Portd.5                                            '...setze Pin 5 von Port D von high auf low oder umgekehrt
  Bitwait Pind.2 , Reset                                    'warte bis an Pin 2 von Port D wieder ein low level anliegt

  End If                                                    'Ende der Bedingung
  If Pind.3 = 1 Then                                        'Wenn an Pin 3 von Port D ein high level anliegt, dann...

  Toggle Portd.6                                            '...setze Pin 6 von Port D von high auf low oder umgekehrt
  Bitwait Pind.3 , Reset                                    'warte bis an Pin 3 von Port D wieder ein low level anliegt

  End If                                                    'Ende der Bedingung
  If Pind.4 = 1 Then                                        'Wenn an Pin 2 von Port D ein high level anliegt, dann...

  Gosub Beep                                                '...gehe zum Untermenü "Beep"                                        '...gehe zum Untermenü "Textausgabe"
  Bitwait Pind.4 , Reset                                    'warte bis an Pin 4 von Port D wieder ein low level anliegt

  End If                                                    'Ende der Bendingung

Loop                                                        'zum Anfang der Schleife

Beep:                                                       'Untermenü "Beep"

  Portd.7 = 1                                               'setzte den Pin 7 von Port D auf high
  Waitms 500                                                'Warte 500 ms
  Portd.7 = 0                                               'setzt den Pin 7 von Port D auf low

Return                                                      'zurück zum Hauptmenü

Wenn ich mir das Pollinboard so ansehe hat er bei den Tastern jeweils einen Kondensator und einen Widerstand.Müsste er das Entprellen dann nicht Hardwaremäßig machen? Oder muss ich im Code was ändern?

Vielen Dank schon mal für eure mühe.
mfg
Florian
 
Hi
Na dann mal herzlich willkommen bei den Schlaflosen.... :)
( wenn ich da mal so auf die Uhrzeit schau... )
Ok, zum Thema. Auch ich arbeite mit dem Board, die Taster benutze ich so gut wie nie. Besser, du besorgst dir ein Steckbrett, gibt's auch bei Pollin und liegt auch so bei 15€. Dann nimmst du ein 40pol. Flachkabel ( altes IDE aus PC) und lötest einseitig eine 40 pol. Fassung dran. Die steckst du dann in das Steckbrett, das andere Ende passt in den 40 pol. Wannenstecker. Schon hast du eine Verbíndung vom Eva_Board zum Steckbrett und ausreichend Fläche für Experimente. Zu den Tastern. Ja, eigentlich sollten die Taster über die C "entprellt" werden. Aber vermutlich hast du die PullUp-Widerstände eingeschaltet. Da die Taster an VCC hängen und über einen externen PullDown beschaltet sind, hast du am Eingang einen Spannungsteiler. Aus diesem Grund hab ich mich sehr schnell von den "Bedienelementen" des Board gelöst und nur noch mit anderen Tastern und Sensoren gearbeitet. Zum Programm lass ich Experten aus der BASIC Welt was sagen, ich bevorzuge Assembler. Vielleicht lass ich auch heut schon mal etwas in Richtung Anleitung los. Einige Tests halten mich etwas auf. Das Flashen uber die serielle Schnittstelle sollte gehen. Ich benutze dafür PonyProg. Das bedeutet, du mußt dein Programm übersetzen und die Hex-Files mit PonyProg übertragen. Natürlich an der ISP und wichtig, du brauchst dafür ein voll beschaltetes serielles Kabel. Ansonsten denk ich liest man sich wieder
Gruß oldmax
 
Hallo Florian!

Willkommen im AVR-Praxis Forum! :ciao:

Wie Oldmax schon geschrieben hat, haben die Entwickler bei Pollin die Taster auf dem Eva-Board etwas untypisch angeschlossen.

Da die AVR`s für die Pins als Input eingebaute PullUp-Widerstände besitzen, bilden diese PullUps mit den externen PullDown-Widerständen auf dem Pollinboard einen Spannungsteiler.
Wenn man das weiß kann man dies beim Programmieren natürlich brücksichtigen, um Fehlfunktionen zu vermeiden. ;)

Dies wurde in dem Programm aber berücksichtigt:
Code:
Ddrd = &B11100000 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang) 
Portd = &B00000000 'definieren der einzelnen Pins an einem Port ( 0= low level; 1= high level)

Wie aber schon geschrieben, ist das etwas untypisch für das Programmieren der AVR`s.
Du wirst überall Programme finden, bei denen die internen PullUP-Widerstände verwendet werden.
Du musst dann nur bedenken, dass dein Signal "invertiert" zum Taster arbeitet.
Wenn also der Taster gedrückt wird, liefert der PIN eine Null.... weil der Taster ja den PIN mit GND verbindet. ;)

Wenn du es dir zu Beginn nicht merken kannst gibt es die Möglichkeit, dir eine feste Konstante zu programmieren.
Zum Beispiel:
Code:
Const Ein = 0
Const Aus = 1

Wie aber schon erwähnt, ist es beim Pollinboard genau andersherum.
Dies ist auch der Grund warum Oldmax dir den Rat gegeben hat, die Taster auf dem Pollinboard nicht zu verwenden und dafür externe Taster zu nutzen. ;)


Der sonstige Programmcode ist soweit OK....
Von daher kann ich deine Fehlerbeschreibung nicht ganz nachvollziehen.
Zumindest kann nicht einfach LED2 leuchten, wenn Taster1 gedrückt wurde. :eek: :hmmmm:

Du kannst die Tasterabfrage ja mal folgendermaßen ändern:
Code:
If Pind.2 = 1 Then 
   Toggle Portd.5
   Bitwait Pind.2 , Reset 
Elseif Pind.3 = 1 Then
   Toggle Portd.6
   Bitwait Pind.3 , Reset 
Elseif Pind.4 = 1 Then 
   Gosub Beep 
   Bitwait Pind.4 , Reset 
Else
End If

Auf diese Weise hast du eine Art "Entweder-Oder"-Funktion programmiert. ;)
Es kann beim durchlaufen der IF-END IF Schleife immer nur EINE Möglichkeit geben!
Selbst wenn du zwei Taster gleichzeitig drücken solltest, wird nur die ERSTE zutreffende Bedingung ausgeführt..... und danach ist die Abarbeitung dieser Schleife sofort erledigt!
Es werden also die nachfolgenden Bereiche "Elseif" nicht mehr berücksichtigt, wenn schon eine zutreffende Bedingung bearbeitet wurde.


Das dein Programm ggf. einen Tastendruck mal "übersieht", kann an den "Waitms 500" in der "Beep"-Sub liegen.
Sobald der Taster3 gedrückt wurde springt das Programm ja in die Subroutine "Beep" und verweilt dort für die Ausgabe des Signals gute 500ms.
Wenn du in der Zeit also einen anderen Taster drückst, bekommt dies das Programm nicht mit. ;)


Das war es erst mal, was mir so spontan dazu einfällt.

Viel Spaß weiterhin,
Cassio


PS:
Ach so....
Dieses "Main:" im Programm solltest besser löschen. ;)
 

Ü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)