PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastatur einbinden und Werte hochzählen



Reeper
08.10.2005, 16:09
Hallo,

habe jetzt schon die ganze Zeit gesucht, aber nichts gescheites gefunden.

1. Frage:
Wie kann ich Buchstaben, Zahlen und Zeichen in den Atmel einlesen (werden best. als ascii Zeichen erkannt)?
Unter Hilfe in Bascom steht noch was von Pins für die Tastatur, ich meine aber die Tastatur vom Computer [Serieller Anschluss (RXD und TXD) sind mit PC verbunden]


$regfile = "m32def.dat"
' $framesize = 32
'$swstack = 32
'$hwstack = 32
$crystal = 16000000
$baud = 9600


'----------LED------------------
Config Porta = Output


Enable Interrupts


Dim Key As Byte

Do

Print "Test"
Wait 3

Key = Getatkbd()
If Key = 49 Then
Print "1.Led "
Porta.0 = 1
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
End If
If Key = 50 Then
Print "2.Led "
Porta.0 = 0
Porta.1 = 1
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
End If
If Key = 51 Then
Print "3.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 1
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
End If
If Key = 52 Then
Print "4.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 1
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
End If
If Key = 53 Then
Print "5.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 1
Porta.5 = 0
Porta.6 = 0
End If
If Key = 54 Then
Print "6.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 1
Porta.6 = 0
End If
If Key = 55 Then
Print "7.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 1
End If

Loop
End

Keydata:
'normal keys lower case
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

'shifted keys UPPER case
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

2.Frage:

Wie kann ich ein Eingangssignal hochzählen (ähnlich C = i+1).
Will zB. ein Taster einmal drücken und etwas ausführen und beim 2.mal drücken den nächsten Befehl abarbeiten lassen.

Marco78
08.10.2005, 18:04
Im Code fehlt eine entscheidene Zeile! CONFIG KEYBOARD = PINX.y , DATA = PINX.y , KEYDATA = table

In der Hilfe findest du auch weitere Angaben zu Config Keyboard. Wenn die nicht reichen, kannst du ja nach Config Keyboard im Forum suchen oder fragen.

Zu 2.:
Mit INCR wir eine Variable um 1 erhöt. Ist es das was du gesucht hast?
INCR C z.B. Dann kannst du ja abfragen, welchen Wert C hat und das Programm dementsprechend verzweigen.

If C = 100 Then C = 0
Select Case C
Case 0 : Gosub 0
Case 1 : Gosub 1
Case 2 : Gosub 2
...
End Select

Reeper
08.10.2005, 18:21
Hallo Marco78,

dass mit der Zeile meinte ich mit den Pins, aber ich habe den Controller doch nur über die RXD und TXD Pins indirekt mit der Tastatur verbunden, sollte ich diese dann als Input bzw. Output setzen?

Marco78
08.10.2005, 18:37
Was meinst du mit indirekt? Die Pins für Rx und Tx haben ja auch ihre Funktionen als Ein- und Ausgänge.
Du kannst die Tastatur im Prinzip anklemmen wo du willst. Du musst nur in der Configzeile die richtigen Pins angeben. Den Rest erledigt Bascom für dich.

In der Hilfe zu Config Keyboard siehst du ja auch den Schaltplan. Und da steht ja auch, das es jeder Pin sein kann und das selbst für Clock kein externen INT gebraucht wird.

Das Anschluß am INT bezieht sich auf die AppNote von Atmel. Ich denke mal das es in Assembler mit einem Interrupt leichter zu programmieren geht und deshalb dort so gezeigt wird.

Reeper
08.10.2005, 18:40
Irgendwie stehe ich auf dem Schlauch, die Tastatur ist eine PS2 Tastatur an dem Rechner, mit dem ich programmiere.

Marco78
08.10.2005, 18:44
***Doppelpost***

Marco78
08.10.2005, 18:45
Ne, das geht nicht. Dann musst du die Zeichen über RS232 zum AVR schicken. Da brauchst du dann wirklich Rx und Tx.
Aber am PC brauchst du ne Software die die Zeichen sendet. Dann brauchst du die Data-Tabelle auch nicht mehr.
Als Software gibt es Terminalprogramme. Aber ich weiss ja auch nicht, wann ein Zeichen gesendet werden soll/muss.

Im Code brauchst du dann Befehle wie BAUD, INPUT oder ähnliche. Je nach Anwendungsfall.

Reeper
08.10.2005, 18:54
Ah ,danke.
Dann werde ich mich erstmal ans Zählen machen :-)

pebisoft
08.10.2005, 20:00
so wie ich gelesen habe, kannst du nur an den pc die scancode senden und mit dem avr eine tastatur simulieren aber nicht umgedreht (eine tastatur an den avr schliessen). und die mouse kannst du auch nur zum pc simulieren und nicht zum avr.
mfg pebisoft

Marco78
08.10.2005, 20:46
Das stimmt. Man kann mit einem AVR am PC Maus und Keyboard simulieren. Aber der AVR kann auch eine AT- oder PS/2-Tastatur auslesen.

Reeper
09.10.2005, 15:31
Hallo,

ich habe da mal ein kleines Programm mit LED's geschrieben und dabei incr benutzt.
Nur arbeitet das Programm nicht alles nacheinander ab, sondern abwechselnd, bin mir sicher, dass es an den < und > liegt

Hier mein Programm:


$regfile = "m32def.dat"
' $framesize = 32
'$swstack = 32
'$hwstack = 32
$crystal = 16000000
$baud = 9600

'--------LED-----------
Config Porta = Output

'--------Taster--------
Config Pinb.0 = Input
Portb.0 = 1


Declare Sub Lauflicht
Declare Sub Allean
Declare Sub Nacheinander
Declare Sub Startrek

Dim Anzahl As Byte

Do

If Pinb.0 = 1 Then

Incr Anzahl
If Anzahl < 25 Then Gosub Lauflicht
If Anzahl > 25 Then Gosub Allean
If Anzahl > 50 Then Gosub Nacheinander
If Anzahl < 50 Then Gosub Startrek
If Anzahl = 75 Then Anzahl = 0

End If

Loop


Sub Startrek
Print "Star Trek"
Porta.0 = 1
Porta.6 = 1
Waitms 150
Porta.0 = 0
Porta.6 = 0
Porta.1 = 1
Porta.5 = 1
Waitms 150
Porta.1 = 0
Porta.5 = 0
Porta.2 = 1
Porta.4 = 1
Waitms 150
Porta.4 = 0
Porta.2 = 0
Porta.3 = 1
Waitms 150
Porta.3 = 0
Waitms 150
End Sub
Return

Sub Lauflicht
Print "Lauflicht"
Porta.0 = 1
Waitms 40
Porta.0 = 0
Porta.1 = 1
Waitms 40
Porta.1 = 0
Porta.2 = 1
Waitms 40
Porta.2 = 0
Porta.3 = 1
Waitms 40
Porta.3 = 0
Porta.4 = 1
Waitms 40
Porta.4 = 0
Porta.5 = 1
Waitms 40
Porta.5 = 0
Porta.6 = 1
Waitms 40
Porta.6 = 0
Porta.5 = 1
Waitms 40
Porta.5 = 0
Porta.4 = 1
Waitms 40
Porta.4 = 0
Porta.3 = 1
Waitms 40
Porta.3 = 0
Porta.2 = 1
Waitms 40
Porta.2 = 0
Porta.1 = 1
Waitms 40
Porta.1 = 0
End Sub
Return

Sub Allean
Print "alle an"
Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Porta.3 = 1
Porta.4 = 1
Porta.5 = 1
Porta.6 = 1
Waitms 250
End Sub
Return

Sub Nacheinander
Print "1.Led "
Porta.0 = 1
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Waitms 100

Print "2.Led "
Porta.0 = 0
Porta.1 = 1
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Waitms 100

Print "3.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 1
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Waitms 100

Print "4.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 1
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Waitms 100

Print "5.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 1
Porta.5 = 0
Porta.6 = 0
Waitms 100

Print "6.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 1
Porta.6 = 0
Waitms 100

Print "7.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 1
Waitms 100
End Sub
Return


End

Ich habe es auch mit versch. incr versucht, aber das gleiche Problem erhalten:


Declare Sub Lauflicht
Declare Sub Allean
Declare Sub Nacheinander
Declare Sub Startrek

Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte

Do

If Pinb.0 = 1 Then

Incr A
If A < 10 Then Gosub Lauflicht

Incr B
If B < 10 Then Gosub Allean

Incr C
If C < 10 Then Gosub Nacheinander

Incr D
If D < 10 Then Gosub Startrek

Habt ihr Lösungsvorschläge oder Tipps, was ich falsch gemacht habe, bin echt dankbar.
Ich bekomme es nicht hin, dass das Unterprogramm "Nacheinander" hinter dem "Allean" und dahinter "Startrek" wirklich abgeschlossen für sich läuft.

Das einzigste gute daran: unkontrolliertes Software Multitasking, aber Multitasking :-k

PicNick
09.10.2005, 15:56
Zu meinem Verständnis:
1) Am Anfang tut sich mal nix.
2)Du drückst auf die Taste-->Jetzt läuft ständig "Lauflicht"
3)nochmal drücken --> "alle an"
4)nochmal drücken --> "Nacheinander"
5)nochmal drücken --> "Startrek"
6)nochmal drücken --> --> 1)

Ist das so gemeint ?

Reeper
09.10.2005, 16:06
Ne, wäre aber schön, wenn es so wäre, läuft aber alles ab, obwohl der Taster nicht gedrückt worden ist (=1) und nicht wieder gedrückt wird.

Zum Ablauf:

If Anzahl < 25 Then Gosub Lauflicht

'---------Lauflicht läuft--------------

If Anzahl > 25 Then Gosub Allean

'--------Lauflicht ist aus, doch jetzt läuft alles durcheinander bzw. abwechselnd, denn ich kann nicht eindeutig im Programm schreiben: until = 50 zum Beispiel

If Anzahl > 50 Then Gosub Nacheinander
If Anzahl < 50 Then Gosub Startrek
If Anzahl = 75 Then Anzahl = 0

PicNick
09.10.2005, 16:46
Hab mich schlecht ausgedrückt. Ich meinte, ob es so sein SOLL ?
Ich weiß nicht, wie du das meinst, mit dem Hochzählen von Anzahl bis 75 ?
Du hast doch nur 5 Zustände (=anzahl Tastendruck)

Dann muß deine Schleife aus zwei Teilen bestehen:
1) Soll sich der Zustand ändern ? (Tastenabfrage)
2) das tun, was gerade anliegt.

bei 1) kanst du nicht reagieren, WÄHREND die Taste gedrückt ist, sondern nur, wenn sich was ÄNDERT.
(sonst ratterst du durch alle sub's, solange du den Finger auf der Taste
hast. )


'du brauchst noch ein Feld
DIM tastealt as byte
' Abfrage in der schleife (Das debouncing ignorier' ich mal)
if pinb.0 = 1 and tastealt.0 = 0 then
incr zustand
' also nur, wenn die Taste von "NICHT GEDRÜCKT" auf "GEDRÜCKT" wechselt
end if
tastealt = pinb ' so oder so merken

2)


select case zustand
case 0: ' nix
case 1: gosub lauflicht
case 2: gosub allean
case 3: gosub nacheinander
case 4: gosub startrek
case else:
zustand = 0 ' wieder von vorn
end select


Deine Subs dürfen natürlich keine Dauerschleifen sein, sie müssen immer wieder zurückkommen

Reeper
09.10.2005, 17:01
Danke dir vielmals,
es funktioniert \:D/


Declare Sub Lauflicht
Declare Sub Allean
Declare Sub Nacheinander
Declare Sub Startrek

Dim Zustand As Byte
DIM tastealt as byte


Do


if pinb.0 = 1 and tastealt.0 = 0 then
Incr Zustand


end if
Tastealt = Pinb


select case zustand
case 0: ' nix
Case 1 : Gosub Lauflicht
case 2: gosub allean
case 3: gosub nacheinander
case 4: gosub startrek
case else:
zustand = 0 ' wieder von vorn
end select

Nur werde ich daraus:


if pinb.0 = 1 and tastealt.0 = 0 then
Incr Zustand


end if
Tastealt = Pinb

nicht richtig schlau.

Reeper
09.10.2005, 17:05
Danke dir vielmals,
es funktioniert \:D/


Declare Sub Lauflicht
Declare Sub Allean
Declare Sub Nacheinander
Declare Sub Startrek

Dim Zustand As Byte
DIM tastealt as byte


Do


if pinb.0 = 1 and tastealt.0 = 0 then
Incr Zustand


end if
Tastealt = Pinb


select case zustand
case 0: ' nix
Case 1 : Gosub Lauflicht
case 2: gosub allean
case 3: gosub nacheinander
case 4: gosub startrek
case else:
zustand = 0 ' wieder von vorn
end select

Nur werde ich daraus:


if pinb.0 = 1 and tastealt.0 = 0 then
Incr Zustand


end if
Tastealt = Pinb

nicht richtig schlau.

PicNick
09.10.2005, 17:27
Einmal hätt's auch genügt. :mrgreen:

Schau: tastealt ist immer der Tastenzustand vorher, nach der Prüfung wird der aktuelle Zustand dort reingestellt. beim nächsten mal wird dann damit verglichen
reagiert wird nur in dem Moment, wo die Taste VORHER noch offen war, und JETZT aber gedrückt ist. (=steigende Flanke=rising, =Low-High Übergang)
Alle anderen Zustände
ALT.........................NEU
gedrückt --> gedrückt
gedrückt ---> losgelassen
nicht gedrückt ---> nicht gedrückt

interessieren uns nicht.

Reeper
09.10.2005, 20:57
Danke vielmals O:)

Der Doppelpost ist ungewollt, wenn ich einen Post reinsetze, bekomme ich immer eine Fehlerseite (aber im hintergrund ist immernoch die Option für reinsetzen aktiv), also wenn ich da 2 mal auf return komme.... Ich weiß nicht, ob es an der Seite liegt oder aber am Browser (glaub eher letzteres).