PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastenabfrage und Text auslesen am RN-Mega8 und LCD



timo1105
05.01.2007, 15:04
Hallo,

Vorweg habe ich an euch eine allgeine Frage bezüglich des Demo-Programms vom RN-Control Mega8.
Ich habe es so abgeändert, dass es bei Tastendruck auf taster 1-5 einen text auf das LCD ausgibt.

Hier erstmal der Code:

Declare Sub Taste1()
Declare Sub Taste2()
Declare Function Tastenabfrage() As Byte
Declare Sub Taste3()
Declare Sub Taste4()
Declare Sub Taste5()
Declare Sub Willkommen()

$regfile = "m8def.dat"



Dim Ws As Word
Dim Adc_ohne_taste As Word


$crystal = 16000000


$baud = 9600


Config Adc = Single , Prescaler = Auto , Reference = Off
Config Pinc.0 = Input
Portc.0 = 1
Start Adc



Dim Taste As Byte



Config Pind.6 = Output
Portd.6 = 0




Dim ___lcdno As Bit
Config Lcdpin = Pin , E = Portc.3 , Rs = Portc.2 , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
Config Lcd = 16 * 4





Adc_ohne_taste = Getadc(0)





Call Willkommen




Do

Taste = Tastenabfrage()


If Taste <> 0 Then

Select Case Taste
Case 1
Call Taste1
Case 2
Call Taste2

Case 3
Call Taste3
Case 4
Call Taste4
Case 5
Call Taste5



End Select

End If


Loop

End




Function Tastenabfrage() As Byte
Tastenabfrage = 0

Ws = Getadc(0)
If Ws < Adc_ohne_taste Then
Select Case Ws
Case 400 To 440
Tastenabfrage = 1

Case 330 To 370
Tastenabfrage = 2

Case 260 To 300
Tastenabfrage = 3

Case 180 To 230
Tastenabfrage = 4

Case 100 To 130
Tastenabfrage = 5
End Select

End If

End Function




Sub Taste1()
___lcdno = 0
Cls
Locate 1 , 1
Lcd "Taste1"

End Sub


Sub Taste2()
___lcdno = 0
Initlcd
Cursor Off
Cls
Home
Lcd "Taste2"
End Sub


Sub Taste3()
Initlcd
Cursor Off
Cls
Lcd "Taste3"

End Sub


Sub Taste4()

___lcdno = 0
Initlcd
Cursor Off
Cls
Home
Lcd "Taste4 "
End Sub


Sub Taste5()
___lcdno = 0
Initlcd
Cursor Off
Cls
Home
Lcd "Taste5"
End Sub

Sub Willkommen()
___lcdno = 0
Initlcd
Cursor Off
Cls
Locate 1 , 1
Lcd " Willkommen!"
End Sub

---------------------------------

Jetzt frage ich euch, wie kommt aus diesem code eine Tastenabfrage des Tasterport portc.0 zu stande?
Was bedeuten die Zahlen in der "function" "case 400 to 440" usw.?
---------------------------------
Mein Ziel ist es 9 taster anzuschließen mit denen ich Zahlen von 1-9 aufs LCD bringen kann. Der Lautsprecher soll dann die eingegebene Zahl in "Beep's" wiedergeben (oder ein Blinken von einer LED).

-----------------------------------

Wenn mir jemand weiterhelfen könnte, wäre ich sehr dankbar.

Vielen Dank


Timo

Jon
05.01.2007, 15:32
Jetzt frage ich euch, wie kommt aus diesem code eine Tastenabfrage des Tasterport portc.0 zu stande?
Was bedeuten die Zahlen in der "function" "case 400 to 440" usw.?
400 to 440 sind die Werte, die der ATMega am ADC misst. Jeder Taster hat einen anderen Widerstand, also kommt am ADC bei einem höheren Widerstand ein kleinerer Wert raus, bei einem niedreigen Widerstand ein größerer.



Mein Ziel ist es 9 taster anzuschließen mit denen ich Zahlen von 1-9 aufs LCD bringen kann. Der Lautsprecher soll dann die eingegebene Zahl in "Beep's" wiedergeben (oder ein Blinken von einer LED).
Dann must du weiter 4(?) Taster über vier, sich deutlich von den anderen Widerstanden unterscheidenden, Widerstände anbringen und im Programm die einzelnen ADC-Werte austesten.

jon

timo1105
05.01.2007, 15:43
hi jon,

bist ja recht aktiv hier, danke für deine antworten! ;)

Sind 400 to 440 beliebige werte und sind das werte um den Widerstand rum? sind dann dann blödgefragt 440ohm oder kiloohm?

Müssen sie schalter einmal an masse und an den anderen pin ein widerstand der dann an den port geht?

was ist die adc?

Mfg
Timo

p.s mit was hast du das alles gelernt?

Jon
05.01.2007, 15:58
Zu analog und digital schau dir mal das (http://de.wikipedia.org/wiki/Analogsignal) und das (http://de.wikipedia.org/wiki/Digitalsignal) an.
Der ADC wandelt das analoge Signal nur in ein digitales um.

Und dann schau dir mal das (http://www.robotikhardware.de/download/rnmega8plus.pdf) an. Auf Seite 26 findest du den Schaltplan zum RN-MEGA8plus. Wie du vielleicht merkst, ist der erste Taster über einen 10kOhm Widerstand an +5Volt gelegt. der zweite ist über insgesammt 11kOhm an +5Volt gelegt usw.
Jetzt kannst du probieren weitere Taster über 1kOhm anzuschließen, aber eventuell musst du auch den 10kOhm Widerstand austauschen gegen einen 6KOhm und AREF auf AVCC stellen (mehr dazu in der Bascom Hilfe).

Ich hoffe, du verstehst, was ich da geschrieben habe :)

jon

P.S.: Wenn du wieder einen Code hier reinstellst, dann schreibe doch bitte an den Anfang des Codes "
" und an das Ende ""
Sieht dann so aus:

Hallo!!

timo1105
05.01.2007, 16:02
Sehr gut, dann habe ich mal etwas zu lesen. Ich danke dir erstmal!

Jetzt checke ich erst was ADC sollte. ;) habe den wald vor lauter bäumen nicht gesehen.
muss jetzt erstmal ne pause machen :) morgen gehts weiter.

Dankeschön!

bis dann

Jon
05.01.2007, 16:05
Also das oben ist etwas missglückt ;) (das mit dem Code) aber wenn du auf Zitat klickst, dann siehst du, was ich geschreiben habe.

jon

timo1105
05.01.2007, 16:08
argh--- ich hätte mir mal den zweiten Teil des Schaltplans anschauen sollen. Den hab ich die ganze Zeit unterschlagen:(

mit dem Zitat habe ich verstanden.

Timo

timo1105
05.01.2007, 21:24
Hi!

Ich habe dazu nochmal eine Frage:

Wie kommen die verschiedenen Werte zu Stande z.B 400 to 440?
woher weis ich was ich beim nächsten Taster nehmen muss?
warum sind bei den ersten drei Werten die Spannen dazwischen 40 und bei den anderen zwei 50?

Was ist in unserem Fall das analoge Signal und welches das digitale?

Wie ist denn in dem obigen Programm die grundsätzliche Reihenfolge?
Was ich verstehe ist, dass man einen Pin als Input definieren muss. In dem Fall Pinc.0 (Tasterport an dem alle Taster "hängen")

Dann steht da etwas von "Prescaler" as single usw. was ist damit gemeint?

wie erkennt er jetzt genau das eine Taste gedrückt wurde?
Vergleicht er die Werte die ganze Zeit oder nur wenn eine Taste gedrückt wurde?
Kannst du Jon oder jemand anders, dass in kurzen Worten erklären? Oder vielleicht einen Link schicken?

Das Prinzip des ADC habe ich ja verstanden. Nur was das in diesem Fall bedeutet kann ich mir schlecht vorstellen.

Tut mir leid wenn ich damit nerve, nur weis ich nicht wo so etwas zu lesen ist.
Vielleicht seit ihr ja so nett und erklärt mir das :-)

Danke schonmal im vorraus. Schönen Abend noch.

Timo

Jon
06.01.2007, 11:12
Wie kommen die verschiedenen Werte zu Stande z.B 400 to 440?
Diese Werte kommten bem Vergleich deiner Referenzspannung zustande. Eine 1 entspricht dabei 0,0048828125Volt.
Wenn du also als Wert 420 hast sind das ca.2Volt, die am Pin anliegen.


woher weis ich was ich beim nächsten Taster nehmen muss?
Experimentieren...


warum sind bei den ersten drei Werten die Spannen dazwischen 40 und bei den anderen zwei 50?
Kam eben bei Experimenen heraus ;)


Was ist in unserem Fall das analoge Signal und welches das digitale?
Die Spannung, die du am Pin nach GND messen kannst ist das analoge Signal. Erst im ATMEGA wird das Signal in ein digitales umgewandelt.


Wie ist denn in dem obigen Programm die grundsätzliche Reihenfolge?
Was ich verstehe ist, dass man einen Pin als Input definieren muss. In dem Fall Pinc.0 (Tasterport an dem alle Taster "hängen")
Die Reihenfolge ist immer, dass du erstmal definierst, welchen µC du hast.
Danach legst du die Quarzfrequenz fest, mit der du arbeites.
Dann die Baud-Rate.
Die Ports, die du verwendest, auch die Initialisierung des LCDs und des ADC.
Dann die Variablen.
Und nun dein Programm.
Die Reihenfolge kann sich auch je nach Programmierer ändern, ich habe mich aber an diese Reihnenfolge gewöhnt.


Dann steht da etwas von "Prescaler" as single usw. was ist damit gemeint?
Das kann ich nocht so wirklich erklären. Wäre schön, wenn das jemand anderes macht.


wie erkennt er jetzt genau das eine Taste gedrückt wurde?
Vergleicht er die Werte die ganze Zeit oder nur wenn eine Taste gedrückt wurde?
Er vergleicht die Spannung, die am Pin anliegt mit deiner Referenzspannung (5Volt)


Tut mir leid wenn ich damit nerve, nur weis ich nicht wo so etwas zu lesen ist.
Vielleicht seit ihr ja so nett und erklärt mir das :-)
Warum nerven. Ich denke mir dabei das:
Anfangs habe ich mit solchen Fragen "genervt". Jetzt kenne ich das alles und kann Fragen beantworten. So wird es bei dir hoffentlich auch mal sein. Und nur duch Fragen kann man lernen...

jon

timo1105
06.01.2007, 17:07
Hallo!

Danke für deine Antwort!

Werde mich jetzt damit mal mehr beschäftigen.
Zum Prescaler habe ich gefunden, dass er den Timer mit einem taktsignal versorgt, welches vom internen Takt abgeleitet wird.

In meinem Fall wurde der Prescaler = Auto gesetzt. Das ist eine Unterstützung von Bascom. Das Programm "sucht" sich die passende Frequenz für den ADC in Abhängigkeit von der angegebenen MHZ-Zahl.


Diese Werte kommten bem Vergleich deiner Referenzspannung zustande. Eine 1 entspricht dabei 0,0048828125Volt.
Wenn du also als Wert 420 hast sind das ca.2Volt, die am Pin anliegen.

Muss ich also vorher wissen wie viel Volt am Pin anliegen und dann erst die Zahl bestimmen?
woher weist du das 1 0,0048V sind?



Werde jetzt ein bissl weiterexperimentieren ;)

Danke!

Timo

timo1105
07.01.2007, 16:42
hallo!

Ich habe zur Zeit dieses Programm auf dem Chip:


Declare Sub Taste1()
Declare Sub Taste2()
Declare Function Tastenabfrage() As Byte
Declare Sub Taste3()
Declare Sub Taste5()
Declare Sub Taste6()
Declare Sub Willkommen()

$regfile = "m8def.dat"



Dim Ws As Word
Dim Adc_ohne_taste As Word


$crystal = 16000000


$baud = 9600


Config Adc = Single , Prescaler = Auto
Config Pinc.0 = Input
Portc.0 = 1


Start Adc



Dim Taste As Byte



Config Pind.6 = Output
Portd.6 = 0




Dim ___lcdno As Bit
Config Lcdpin = Pin , E = Portc.3 , Rs = Portc.2 , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
Config Lcd = 16 * 4





Adc_ohne_taste = Getadc(0)





Call Willkommen




Do

Taste = Tastenabfrage()


If Taste <> 0 Then

Select Case Taste
Case 1
Call Taste1
Case 2
Call Taste2

Case 3
Call Taste3







End Select

End If


Loop

End




Function Tastenabfrage() As Byte
Tastenabfrage = 0

Ws = Getadc(0)
If Ws < Adc_ohne_taste Then
Select Case Ws
Case 330 To 370
Tastenabfrage = 1

Case 260 To 300
Tastenabfrage = 2

Case 100 To 130
Tastenabfrage = 3


End Select

End If

End Function




Sub Taste1()
Sound Portb.0 , 500 , 300


Lcd "1"


End Sub


Sub Taste2()
Sound Portb.0 , 500 , 300

Initlcd
Lcd "2"
End Sub


Sub Taste3()
Sound Portb.0 , 600 , 400

Initlcd
Lcd "3"

End Sub





Sub Taste5()
___lcdno = 0
Initlcd
Cursor Off
Cls
Home
Lcd "Taste5"
End Sub

Sub Willkommen()
___lcdno = 0
Initlcd
Cursor Off
Cls
Locate 1 , 1
Lcd "Zahl eingeben:"
Lowerline
Cursor Blink
End Sub

Sub Taste6()

Initlcd
Cursor Off
Cls
Locate 1 , 1
Lcd "Taste6"
End Sub

Nun steht in der ersten Zeile auf dem LCD "Zahl eingeben" dann wird der blinkende Cursor in die Zeile darunter gesetzt.
Wenn ich jetzt die Taster 1-3 drücke klappt ja alles bis auf das, dass er nach x belibiegen eingegebenen Zeichen aus der oberen einen Teil der Zeichen löscht und in eine andere Zeile setzt.

Was ich möchte ist, dass ich erstmal mit den Tastern eine durchgehende,fortlaufende Zahlenreihe eingeben kann.

Gibt es da einen best. Befehl?
was ist daran falsch?

mfg
Timo

Danke

linux_80
07.01.2007, 20:28
Hallo,
Du machst ziemlich oft Initlcd, reicht das nicht einmal am Anfang ?
Da wird doch immer das LCD zurückgesetzt, und vergisst was es bis jetzt angezeigt hat :-k

timo1105
12.01.2007, 11:31
hi!

Wenn ich das initlcd und das ___lcdno=0 an den Anfang schreibe, dann sind nach einem Tastendruck auf dem ganzen LCD nur 2en z.B zu sehen.

Wenn ich es in die Sub's mit reinschreibe, dann löscht er Teilstücke des Textes.

Wo würdest du es genau reinschreiben?

Timo

Reeper
12.01.2007, 14:44
@ timo1105

Vielleicht hilft dir das hier:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=22151&highlight=tastatur

Das Prinzip ist das selbe, in diesem Fall ist es eben eine Tastatur. Dies kann aber auch ein Taster, Schalter o.ä. sein :-)

Gruß
Stefan

timo1105
12.01.2007, 17:04
hi

dankeschön für den tip! schau ich mir morgen genauer an, wenn ich zeit habe.

Beim ersten überflug über dein Programm ist mir aufgefallen, das die Werte "case 400 to 440" bei dir fehlen?! Also die Werte die beim ADC ankommen,entstanden durch die versch. Widerstände.

Was bedeutet erst,zweit, drittbelegung?

heißt das, dass z.B die Taste 1 mehrere belegungen hat wenn man sie mehrmals drückt?


Danke

Timo

Reeper
14.01.2007, 10:35
Wie im Thread geschrieben, speichere ich alle Werte am Anfang und kann mit einer best. Taste oder Schalter einfach die print-Befehle ändern.

Sicher kann man das Programm noch erheblich verbessern und komprimieren, für den Anfang aber funktionierts :-)

Gruß
Stefan