• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Beim At Tiny mit 3 Pins 7 Taster auswerten. Möglich?

peter51d

Geocacher
Hallo

Mal ein kleines Gedankenspiel.
Ich möchte eine "Zwölfertastatur" für eine Code eingabe nutzen.
Ist es möglich bei einem ATTiny13 mit nur 3 Pins 7 Taster auszuwerten?

5 Tasten für den Code, eine Taste zum bestätigen und wenn eine der restliche 6 Tasten betätigt wird wird der Code als falsch erkannt.

Ich hatte mit es so gedacht, das die ersten 3 Taster direkt auf die Pins gehen. Taster 3-6 durch Dioden gesperrt jeweils auf 2Pins und Taster 7 über Dioden gesperrt auf alle drei Pins.

Beim betätigen der Tasten 1-3 wird der jeweilige Pin auf low gezoge.
Beim Betätigen der Taste 4 die Pins 1 und 2, bei Taste 5 die Pins 2 und 3, bei Taste 6 die Pins 1 und 3 und bei Taste 7 alle Pins.

Ich hatte mir das so gedacht, das beim betätige der richtigen Taste eine "richtig"Variabele hoch gezählt werden. Wird eine falsche Taste betätigt, wird die eine "falsch" Variabel hoch gezählt.
Nach betätigen der Eingabe Taste wird die geschaut, ob die "falsch" Variabe =0 und die "richtig" Variabe eine vordefinierten Wert hat.
Je nah dem, soll dann einer der beiden noch vorhanden Ports geschaltet werden.

Ist so etwas in Bascon Programmtechnisch und mit dem ATTiny 13 machbar?
 

Anhänge

  • ATTiny 7Tasten auf 3 Pins.JPG
    ATTiny 7Tasten auf 3 Pins.JPG
    25,3 KB · Aufrufe: 787

rainmuel

Geocacher
Hallo Peter,

imho ist das so möglich. Softwareseitig würde ich die Taster noch entprellen, damit ein sicheres Erkennen der Tastendrücke gewährleistet ist (nach 20ms den gleichen Pinstand noch einemal abfragen und nur, wenn er gleich ist den Wert weiter bearbeiten).

Was ich in Therorie mal überlegt hatte, (fast) beliebig viele Tasten über einen PIN des Attiny abzufragen:
Taster T1 bis Tn legen dann über einen Spannungsteiler eine relative Spannung zum Vcc auf den Pin. Damit ergibt sich ein digitaler Wert, der das Verhältnis des Widerstands Rt zu Rges von 0-1023 wider gibt. Dann ist der Messwert M = Ri / (Ri + Rfix) * 1023
Eine Schaltung könnte für einen Taster Ti so aussehen:
Vcc ---- Ri ---- Ti -----Y ---- Rfix ---- GND, für i von 1-n, wobei
Vcc Spannungsversorgung
Ri der Widerstand typisch für Ti (Exceltabelle hilft beim Ausrechnen)
Ti Taster i
Y ist der Punkt, an dem der Messwert auf einen ADC Pin beim Attiny abgegriffen wird
Rfix ist ein gemeinsamer fixer Widerstand Richtung Masse GND

Somit dürften sich ohne Probleme 10-12 Tasten abfragen lassen und durch die relative Spannungsmessung ist ein Entladen der Batterie aufgefangen.
Im Code in Bascom könnten sich durch select-case-Anweisung die Intervalle bequem abfragen lassen.

So weit meine Theorie, die auch falsch sein kann.

Happy Caching
 
OP
peter51d

peter51d

Geocacher
Hallo rainmuel

Danke für die Antwort.
Entprellen der Taster ist Pflicht. Hatte da zuerst an ein einfachen debounce gedacht, wobei ich nicht weiss, ob das bei drei Pins gleichzeitig geht. Mit dem 20ms delay ist das dann vielleicht einfacher.
Wobei ich da dann vielleicht keine neue Abfrage nehmen nehmen würde, sonder einfach ein Wait.

Das ganze soll mal in ein Telefon, wo dann nach richtiger Eingabe der "Telefonnummer" die Nächste Stage angesagt wird. Wenn man sich "verwählt", kommt dann ein "kein Anschluss unter dieser Nummer".
Die Spannungsversorgung wird dann über den Gabelkontakt komplett getrennt, so sollte es dann auch keine Probleme mit dem Stromverbrauch geben.

Habe noch nicht viel mit den mc's gemacht. Mal sehn, ob ich das Programm in bekomme.

Die Idee mit dem Spanungsteiler ist aber auch interresant. Da konnte man dann z.B. verschieden Nummern mit verschiedenen Ansagen belegen, da dann vier statt zwei Ausgänge zur verfügen stehen würden.

Muss ich mir mal anschauen.
 

rainmuel

Geocacher
Klingt interessant mit dem Telefon.
Die Spannungsversorgung über die Gabel zu trennen halte ich für nicht ausreichend. Zusätzlich würde ich den kleinen Attiny noch in dem Tiefschlaf versetzen und so Strom sparen lassen.
Es ist nur eine Frage der Zeit, bis einer beim Wiederverstecken den Hörer nicht mehr auflegt. Ganz sicher ist es, die Batterien selber mitbringen zu lassen.

Wenn ich eins gelernt habe bei Stages: Die müssen Deppensicher sein. Am besten noch komplett in Acryl gegossen gegen die Grobmotoriker und Leatherman-Aufschrauber.

Vielleicht legst du gleich ein laminiertes Kärtchen mit Bild von Innen rein, da ersparen sich manche dann das Aufschrauben...

Leider wird die Arbeit nicht entsprechend im Feld gewürdigt und wenn es Regnet dann regnet es eben auch auf die Elektronik :-(
 
OP
peter51d

peter51d

Geocacher
Ist alles noch eine Idee. Jetzt muss erst mal der Code stehn, dann muss noch das passende Telefon gefunden werden ect.
Interessant währe ja auch ein Wählscheiben Telefon. Da muss ich aber erst mal eins in die Finger bekommen um zu sehen, was das für impulse bringt.

Und gegen Grobmotoriger ist leider kaum ein Kraut gewachsen.
 

stonewood

Geowizard
Moin,

Du kennst 'Charlieplexing'? Das schließt an wenige Portpins LEDs an. Das gleiche geht auch mit Schalter&Diode. http://en.wikipedia.org/wiki/Charlieplexing
 
OP
peter51d

peter51d

Geocacher
@ stonewood

Das war der Ursprung meiner Idee. Ich denke ich habe es entsprechend auf Taster umgesetzt.

@ all

Hier mal ein erster Entwurf des Programms.

$regfile = "attiny13.dat"
$crystal = 9600000

Config Portb = &B00011000 ''port 3 und 4 auf ausgang, der rest auf eingang'
Portb = &B11100111 'interne pullup einschalten'



Dim F As Byte 'falsch Zähler'

Dim R As Byte 'Richtig Zähler'

F = 0 'setze Zähler auf null beim Start'
R = 0





Do

If Pinb.0 = 1 And R = 0 Then 'abfrage erste richtige Zahl'
R = R + 1 'wenn richtig erhöhe den richtig Zähler'
Else
F = F + 1 'sonst erhöhe den falsch Zähler'
Waitms 20 'taster Entprellen ""

If Pinb.1 = 1 And R = 1 Then 'abfrage zweite richtige Zahl'
R = R + 1 'wenn richtig erhöhe den richtig Zähler'
Else
F = F + 1 'sonst erhöhe den falsch Zähler'
Waitms 20

If Pinb.2 = 1 And R = 2 Then 'abfrage dritte richtige Zahl'
R = R + 1 'wenn richtig erhöhe den richtig Zähler'
Else
F = F + 1 'sonst erhöhe den falsch Zähler'
Waitms 20

If Pinb.0 = 1 And Pinb.1 = 1 And R = 3 Then 'abfrage vierte richtige Zahl'
R = R + 1 'wenn richtig erhöhe den richtig Zähler'
Else
F = F + 1 'sonst erhöhe den falsch Zähler'
Waitms 20

If Pinb.1 = 1 And Pinb.2 = 1 Then 'abfrage falsche Zahl'
F = F + 1 'erhöhe falsch Zähler'
End If
Waitms 20


If Pinb.0 = 1 And Pinb.1 = 1 And Pinb.2 = 1 And R = 4 And F = 0 Then 'enter abfrage und auswerung code richtig''

Portb.3 = 1
Wait 1
Portb.3 = 0
End If

If Pinb.0 = 1 And Pinb.1 = 1 And Pinb.2 = 1 And R <> 4 And F <> 0 Then 'enter abfrage und auswertung falscher code
Portb.4 = 1
Wait 1
Portb.4 = 0
End If
Loop


End

Was haltet ihr davon?

Allerdings bekomme ich noch eine Fehlermeldung für line 0 :???:

Error : 7 Line : 0 IF THEN expected [ 67] , in File :
Error : 123 Line : 0 END IF expected , in File :

da habe ich jetzt gar keinen Plan was das heissen soll, wenn man nur alle Jubeljahre was in der Richtung macht.
 

rainmuel

Geocacher
Also dem code fehlt es an einigen end ifs. Jedes if muss durch ein end if geschlossen werden.
Das Entprellen durch einfaches wait funktioniert nicht ganz: vielleicht sind die 20ms auch etwas kurz. Nehme mal lieber 100ms und prüfe dann, ob der Taster immer noch der gleiche ist. Dann würde ich noch eine while-Schleife einbauen, die darauf wartet, dass alle Taster wieder losgelassen werden, sonst passiert es, dann wenn du einmal kurz die 1 drückst, fünf mal die 1 als Tastendruck interpretiert wird und du somit nie die richtige Nummer eingeben kannst.

Also Taster prüfen
warten 100ms
Taster immer noch der gleiche?
Wenn ja, auswerten, wenn nein dann error oder ignorieren
prüfen, ob alle Taster wieder losgelassen wurden, erst dann weiter auswerten
 
OP
peter51d

peter51d

Geocacher
OK

Ich dachte, end if brauche ich nur wenn kein else kommt.
Jetzt habe ich alle if's beendet und es gibt auch keine Fehlermeldung mehr.
Soweit so gut.

Deinen Vorschlag zum entprellen der Taster hab ich zwar soweit verstanden, muss mir aber noch mal Gedanken machen, wie ich das umsetzt.
 

stonewood

Geowizard
Ach ja: Man kann die Taster auch per A/D-Wandler abfragen. Also ein kleines Widerstandsnetzwerk davor und dann den Spannungspegel messen. Wäre sogar mit einem Pin möglich, wenn auch mit einem Haufen rechnerei verbunden.
 
OP
peter51d

peter51d

Geocacher
Das mit den Wiederständen hatte rainmuel ja anfangs auch schon erwähnt.
Im moment bastel ich aber doch an der direkten Variante.
Die Wiederstandsvariante ist aber vielleicht für eine andere Station noch interessant.
Werde ich mir später auf jeden Fall noch mal genauer anschauen.

Irgendwo im Netz habe ich dazu sogar mal ne Tabelle mit Werten gefunden.

Hier
 

stonewood

Geowizard
peter51d schrieb:
Irgendwo im Netz habe ich dazu sogar mal ne Tabelle mit Werten gefunden.
Hier
Genau sowas. Macht sogar 12 Taster an einem Pin. Wobei mir da noch nicht so recht klar ist wie das auf mehrere Tasten gleichzeitig gedrückt reagieren würde - das ist doch gar nicht abgefangen, oder?
 
OP
peter51d

peter51d

Geocacher
Die Sache mit den Dioden ist doch schwieriger als gedacht.
Die drei Taster werden sauer erkannt. Sobalt ich aber einen vierten Taster mit den Dioden dazu nehme, kommt nur noch müll raus.

Bevor ich mir da noch weiter die Karten lege, wird es wohl ein andere MC werden, der die Tastatur direkt auswerten kann.
 

rainmuel

Geocacher
@Peter
Sorry für diese Frage aber sind die Dioden richtig herum eingelötet? Manchmal sieht man selbst ja den Wald vor Bäumen nicht...
Je nach dem welche Dioden verwendet worden sind ziehen sie den Pin nicht auf genau 0V hinunter sondern nur auf 0,7V. Dies sollte vom Attiny jedoch als logisch 0 interpretiert werden.
Kannst ja mit dem Multimeter mal nachmessen, welcher Pegel da am Pin mit mehreren Dioden und dem Taster gedrückt anliegt.
Vielleicht hilft auch der eine oder andere Kondensator nahe der Spannungsversorgung für dem uC. Ich würde auch mal hoch auf 5V gehen in der Spannung um Störeffekte zu minimieren.

Einer hier aus dem Forum hat mal sinngemäß geschrieben: Die Attinys sind Biester, die einen ziemlichen Dreck auf die Pins rotzen...
 

stonewood

Geowizard
Mein Charlieplexing mit 2 7-Segment und vier Tastern an einem Tiny24 tut wie gewollt. Einziges 'Problem' ist die vielen Signale alle richtig rum zu setzen. Für die Taster sollte man 'active-low' nehmen, ansonsten braucht man noch einen Pulldown. Also einen Pin auf Ausgang/Low, alle anderen auf Eingang, und sehen ob der entsprechende Pin noch high (nicht gedrückt) oder low (gedrückt) ist. Selbes Spiel mit den 7-Segment: Gemeinsame Anode auf Ausgang/High, alle zu beleuchtenden Segmente auf Ausgang/Low, alles andere auf Eingang.

Und ja, man sollte das vielleicht vorher mit ein paar Teilen auf dem Steckbrett ausprobieren, sonst sind die Dioden falschrum gelötet ...

Hier der (quick&dirty)-Schaltplan dazu. Hab kurzerhand die 8 Leitungen zum 7-Segment bzw. zu den Tastern mit 0..7 durchnummeriert:
Code:
'    Vcc: 3xAA (3x1,5v)    |
'          +------------- +|- +
'          | ----------    |  |
'          +-|Vcc* GND|- -----+
'         4 -|PB0  PA0|- 0
'         5 -|PB1  PA1|- 1
'           -|RES  PA2|- 2
' --220-- 6 -|PB2  PA3|- 3
' --220-- 7 -|PA7  PA4|-
'           -|PA6  PA5|-
'            ----------

'   60510475
'   gafbBFAG
'   ||||||||
'  ----------
'  |1      9|
'  |6       |
'  |        |
'  |1      8|
'  ----------
'   ||||||||
'   ced12DEC
'   243  231
'      76

'  5--220--+-|>|- \--0 (sw)
'          +-|>|- \--1 (rt)
'          +-|>|- \--2 (wh)
'          +-|>|- \--3 (gn)
 
Oben