PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wert in Variable einlesen ?



nase
11.05.2013, 06:31
Hallo,
möchte über eine Infrarot Fernbedienung eine Tel Nr. als eine Reihe von Zahlen eingeben ,die dann in einer Variablen festgehalten wird.
Wie gestalte ich nun die Abfrage um mehre hintereinander eingegebene Zahlen in einer Variable zu speichern.

gruß Nase:(

DanielSan
11.05.2013, 10:30
Wie werden die Zahlen denn weiter verarbeitet?

Ich würde es mit einem Array machen. Sonst kannst du das auch in ein String schreiben.

Mit nem Array kannst du eine einfache Schleife machen und immer einen hochzählen.

nase
11.05.2013, 12:05
Also ich will per Infrarot Fernbedienung eine Telefon Nr. eingeben , dann diese Nr. z.B auf dem PC ausgeben, oder in meinen Fall mit einem angeschlossenen Handy eine Nummer anrufen.
Dazu brauche ich eine Variable in der die gesammte Nr. enthalten ist .!!

mfg nase

PICture
11.05.2013, 12:14
Hallo!

Am einfachsten wäre es für mich (ASMan) als in ausreichenden Array ablegbaren String mit variabler Länge und gezeichnetem Ende zu machen. ;)

DanielSan
11.05.2013, 12:49
Ja Array. Wie werden die Daten denn von dem Handy erwartet? Wie überträgst du sie? Über Uart?

nase
11.05.2013, 20:24
Ja Array. Wie werden die Daten denn von dem Handy erwartet? Wie überträgst du sie? Über Uart?
Ja über UART.

Ich will mehrere Werte in einer Variablen zusammen fassen, und das soll in Bascom geschehen.
Also wenn mir jemand einen Beispiel Code mit Erläuterung geben könnte wäre das schon ein feine Sache.


Und was das Array betrifft, so kann ich damit nix anfangen , will ja keine Variable einfach nur hoch zählen.

mfg Nase

DanielSan
12.05.2013, 08:53
Dann geh doch mal auf die Bascom Website und guck dir in der Hilfe das Kapitel zu Arrays an. Vorher würde ich dir noch ein paar Grundlagen zu Arrays empfehlen -> Wikipedia sollte da erstmal reichen.

Alternativ kannst du's auch so machen: (Achtung pseudo Code)


int telnr
int nr

while
get nr //Zahl von der IR Schnittstelle einlesen
telnr = telnr * 10 + nr
end


Das ist jetzt nicht vollständig durchdacht. Die erste Nummer zb. ist ein Sonderfall. Die Lösung ist aber nicht schön finde ich. Mit nem Array geht das besser.

nase
12.05.2013, 10:41
Dann geh doch mal auf die Bascom Website und guck dir in der Hilfe das Kapitel zu Arrays an. Vorher würde ich dir noch ein paar Grundlagen zu Arrays empfehlen -> Wikipedia sollte da erstmal reichen.

Alternativ kannst du's auch so machen: (Achtung pseudo Code)


int telnr
int nr

while
get nr //Zahl von der IR Schnittstelle einlesen
telnr = telnr * 10 + nr
end


Das ist jetzt nicht vollständig durchdacht. Die erste Nummer zb. ist ein Sonderfall. Die Lösung ist aber nicht schön finde ich. Mit nem Array geht das besser.

Erst einmal Danke , werde mich mal damit befassen und auch deinen Pseudo Code testen !!


mfg Nase

peterfido
12.05.2013, 11:27
Die Variable telnr wird überlaufen.

Wie geschieht denn die IR-Abfrage?

Nimm, wie schon erwähnt, ein Array.
Wenn die IR-Abfrage (Fernbedienungsroutine) per Interrupt z.B. die letzte Ziffer in der Variablen neueziffer ablegt, dann würde ich es so probieren (nicht getestet!):


$regfile = "m88Adef.dat"
$baud = 19200
$crystal = 8000000


$hwstack = 160
$swstack = 100
$framesize = 100

Dim Position As Byte
Dim Stelefonnr As String * 15
Dim Btelefonnr(15) As Byte At Stelefonnr Overlay
Dim Neueziffer As Byte


Gosub Telnrleeren

Do
Gosub Infrarot
Gosub Zifferntest

Loop
End

Zifferntest:
Select Case Neueziffer 'Ziffer 0-9
Case Is < 10
Gosub Zifferhinzu
Case 13 'Nummer fertig eingegeben also wählen
Gosub Nummernwahl
Case 12 'letzte Stelle löschen
Gosub Zifferweg
Case 11 'alle Stellen löschen
Gosub Telnrleeren
End Select
Return

Infrarot: 'Wenn nicht per Interrupt

Return

Telnrleeren:
For Position = 1 To 15
Btelefonnr(position) = 0 'Nullbyte signalisiert Ende eines Strings
Next Position
Neueziffer = 255
Position = 0
Return

Zifferhinzu:
If Position < 15 Then
Incr Position
Neueziffer = Neueziffer + 48 'ASCii Codes für Zahlen
Btelefonnr(position) = Neueziffer
End If
Return

Zifferweg:
If Position => 1 Then
Decr Position
Btelefonnr(position) = 0
End If
Return

Nummernwahl:
Print "Kommandozumnummerwählen";
Print Stelefonnr
Gosub Telnrleeren
Return



In der IR-Routine dann einfach die Ziffer direkt in die Variable neueziffer schreiben.
Wurde OK gedrückt, dann die 13 reinschreiben.
usw.

nase
12.05.2013, 13:24
'
$regfile "m8def.dat" 'Definiert den Atmega als Atmega8
$crystal = 1000000 'Gibt die Quarzfrequenz an in Herz
$hwstack = 32 'Default use 32 Hardware reservierte Speicher
$swstack = 10 'Default Software resvierung Speicher
$baud = 2400

'---------------------- Config Display ----------------------------------------
' Konfiguration fürs Display
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , Rs = Portc.5 , E = Portc.4
'-------------------------Variable deklarieren -------------------------------
Dim Adresse As Byte ' Variable für Infrarot Adresse
Dim Commando As Byte

Dim Flag As Byte
Dim Blink_aus As Byte
Dim Blink_an As Byte


'------------------------------- I / O ----------------------------------------
Ddrd = &B11100000 ' Portd.5-d6-d7 als Ausgang für Leds setzen
Ddrb.2 = 1 ' BG2 als Ausgang für Display Beleuchtung setzen
Portb.6 = 1 ' Pull Down setzen für Tastereingang


'---------------- Konfiguration für 'IR Eingang -------------------------------

Portb.0 = 1 ' PullUp setzen für Eingangspin IR-Led
Config Rc5 = Pinb.0 ' Pin für IR Abfrage setzen

'---------------------------------- Interrupts ---------------------------------
Enable Interrupts ' Interrups Global freigeben

'------------------------------------------------------------------------------

Cls
Flag = 1
Do

'--------------------Ankommendes IR Signal auswerten --------------------------
Getrc5(adresse , Commando)
If Flag = 1 Then
Lcd "Warte auf IR Signal"
Flag = 0
End If
If Adresse <> 255 Then
Reset Commando.7

Cls
Flag = 1

End If
'------------------------
If Commando = 1 Then Gosub 1
If Commando = 2 Then Gosub 2
If Commando = 3 Then Gosub 3
Cls
Lcd " Taste=" ; Commando
Waitms 200

Loop


'---------------------- Sub Routinen fuer gedrückte Taste 1 -------------------
1:
Portd.5 = 1
Waitms 500
Portd.5 = 0
Return

'---------------------- Sub Routinen fuer gedrückte Taste 2 ------------------
2:
Print 2

Portd.6 = 1
Waitms 50
Portd.6 = 0
Return
'----------------------- Sub Routinen fuer gedrückte Taste 3 ------------------
3:
Print 3
Portd.7 = 1
Waitms 50
Portd.7 = 0
Return

Sauerbruch
12.05.2013, 14:29
Getrc5(adresse , Commando)
If Flag = 1 Then
Lcd "Warte auf IR Signal"
Flag = 0
End If
If Adresse <> 255 Then
Reset Commando.7

Cls
End If



Wo wird "Flag" denn auf 1 gesetzt?

nase
13.05.2013, 16:44
Sorry hatte ich vergessen , gerade nachgetragen , siehe unterstrichenes

mfg Nase