PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Bascom "tastenabfrage"



garbage
24.09.2006, 17:54
Würde gerne bestimmte LED´s auf tastenabfrage ansteuern also drücke taste x um LED y zum leuchten zu bringen!
Jetzt habe ich keine Ahnung mehr was ich überhaupt gemacht habe, ich glaube das sieht man auch am CODE :oops: :oops: :oops: ..
Habe jetzt die ganze zeit rum probiert jetzt habe ich ein knoten im kopf, hilfe wer super !

THX Dirk



'************************************************* ********************

$regfile = "m32def.dat"
' bei Mega 16 $regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000 'Quarzfrequenz
$baud = 9600

'************************************************* ********************
Declare Function Tastenabfrage() As Byte
Declare Sub Led1()
Declare Sub Led2()
Declare Sub Led3()

'Porta.7 = 1
Config Pina.7 = Input 'Für Tastenabfrage
Config Portc = Output
Dim Taste As Byte
Config Adc = Single , Prescaler = Auto
'Portc.1 = 0

Do
'Print " Warte auf Eingabe!"
' Wait 10

Taste = Tastenabfrage()
If Taste <> 0 Then

Select Case Taste
Case 1
Call Led1
Case 2
Call Led2
Case 3
Call Led3
End Select
Sound Portd.7 , 400 , 500 'BEEP
Wait 10
End If
Wait 10
Loop
End


Sub Led1
Portc.3 = 1
Print "LED1 ist an"
End Sub

Sub Led2
Portc.3 = 1
Print "LED1 ist an"
End Sub

Sub Led3
Portc.3 = 1
Print "LED1 ist an"
End Sub

Ich weiß sieht ganz schön Besch... aus .!

Axi
24.09.2006, 18:41
Bei deinen Sub Led1-3 hast du immer den selben Port eingeschaltet.

mfg Axi

garbage
24.09.2006, 19:01
Ich weiß aber das kann ja nicht das prop sein oder?

Axi
24.09.2006, 19:06
dir fehlt noch das Unterprogramm Tastenabfrage()

mfg Axi

Axi
24.09.2006, 19:08
'Diese Unterfunktion fragt die Tastatur am analogen Port ab
Function Tastenabfrage() As Byte
Local Ws As Word

Tastenabfrage = 0
Ton = 600
Start Adc
Ws = Getadc(7)
' Print "Tastenabfrage anpassen!ADC Wert ws=" ; Ws
If Ws < 500 Then
Select Case Ws
Case 400 To 450
Tastenabfrage = 1
Ton = 550
Case 330 To 380
Tastenabfrage = 2
Ton = 500
Case 260 To 305
Tastenabfrage = 3
Ton = 450
Case 180 To 220
Tastenabfrage = 4
Ton = 400
Case 90 To 130
Tastenabfrage = 5
Ton = 350
' Case Else
' Print "Tastenabfrage anpassen!ADC Wert ws=" ; Ws
End Select
Sound Portd.7 , 400 , Ton 'BEEP

End If


End Function
(aus dem Beispielprogramm vom RN-Control)

mfg Axi

garbage
24.09.2006, 19:44
Axo ](*,)
kann mir jemand den code erklären ?
komentare reichen!

THX

Axi
24.09.2006, 20:00
hast du das RN-Control Board? im groben funktioniert es so:zuerst ließt das prog den analogen Eingang ein (je nach dem welche taste gedrückt ist liegt eine andere Spannung am analogen eingang an) Die Werte die oben angegeben sind stimmen fürs RN-Control.
Die 1. Taste liefert zb einen Wert zwischen 400 und 450. Dann schaut das Prog welche Taste gedrückt würde (mit der Select Case Anweisung) und speichert die dann (Tastenabfrage =1 bis 5). Danach gibt das Unterprog den Wert zurück (also 1-5 je nach taste). ich hoffe die erklärung stimmt und ist einigermaßen verständlich

mfg Axi

garbage
24.09.2006, 20:03
AAaaaa
ja habe ich!!

Mir geht ein Licht auf oder auch zwei vielen Dank ..

THX Dirk

ikarus_177
21.03.2008, 13:36
ich habe auch so ein ähliches problem: und zwar habe ich eine unterroutine, die alle leds einschalten soll (betonung liegt auf soll), wenn die taste 3 gedrückt wird.

und zwar:

Sub Leds()

Config Portc = Output

Portc.0 = 0
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
Portc.4 = 0
Portc.5 = 0
Portc.6 = 0
Portc.7 = 0

Config Portc = Input

End Sub

das programm führt diese unterroutine 100%ig aus, da ich eine print anweisung am ende eingefügt hatte, und diese ausgeführt wurde. allerdings haut das mit den leds noch nicht so hin.

wenn ich aber diesen code nicht in eine subroutine packe, sondern im "hauptteil" des programms, also ganz oben, direkt nach "do" funktioniert alles anstandslos.

woran könnte das liegen?

lg
ikarus_177

linux_80
21.03.2008, 14:39
Warum stelltst Du den Port danach wieder auf Input ? :-k

ikarus_177
21.03.2008, 16:23
das stand bei mir so im beispielprogramm, ich wollte es nur so umändern, dass es kein lauflicht erzeugt, sondern dass nur das alle leds dauerhaft leuchten.

'Einige male Lauflicht über LED´s anzeigen. Am I2C-Port darf in diesem Moment nichts angeschlossen sein
Sub Lauflicht()

Config Portc = Output
Portd = 0
For N = 1 To 10
For I = 0 To 7
Portc.i = 0
Waitms 100
Portc.i = 1
Next I
Next N
Config Portc = Input
End Sub

also hab ich einfach die schleifen rausgenommen und durch die entsprechenden anweisungen ersetzt.

lg
ikarus_177

ikarus_177
24.03.2008, 13:54
so, habs jetzt mit einer goto - Anweisung hinbekommen:


'################################################# ##
'rncontroltest.BAS
'für
'RoboterNetz Board RN-CONTROL ab Version 1.1
'Das neue preiswerte Controllerboard zum experimentieren
'
'Aufgabe:
' Dieses testprogramm testet gleich mehrere Eigenschaften auf dem Board
' Den verschiedenen Tasten sind bestimmte Funktionen zugeordnet
' Taste 1: Zeigt Batteriespannung über RS232 an
' Taste 2: Angeschlossene Motoren beschleunigen und abbremsen
' Taste 3: Einige male Lauflicht über LED´s anzeigen. Am I2C-Bus
' darf in diesem Moment nichts angeschlossen sein
' Taste 4: Zeigt analoge Messwerte an allen Port A PIN´s über RS232 an
''Taste 5: Zeigt digitalen I/O Zustand von PA0 bis PA5 an


' Ser gut kann man aus dem Demo auch entnehmen wie Sound ausgegeben wird,
' wie Tasten abgefragt werden und wie Subroutinen und Funktionen angelegt werden

'Autor: Frank
'Weitere Beispiele und Beschreibung der Hardware
'unter http://www.Roboternetz.de oder robotikhardware.de
'################################################# ######



Declare Sub Batteriespannung()
Declare Sub Fehler()
Declare Function Tastenabfrage() As Byte


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32


Dim I As Integer
Dim N As Integer
Dim Ton As Integer

$crystal = 16000000 'Quarzfrequenz
$baud = 9600

Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung

Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein


Const Ref = 5 / 1023 'Für Batteriespannungsberechnung

Dim Taste As Byte
Dim Volt As Single

' Für Motorentest
'Ports für linken Motor
Config Pinc.6 = Output 'Linker Motor Kanal 1
Config Pinc.7 = Output 'Linker Motor Kanal 2
Config Pind.4 = Output 'Linker Motor PWM
'Ports für rechten Motor
Config Pinb.0 = Output 'Rechter Motor Kanal 1
Config Pinb.1 = Output 'Rechter Motor Kanal 2
Config Pind.5 = Output 'Rechter Motor PWM
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1a = 0
Pwm1b = 0
Tccr1b = Tccr1b Or &H02 'Prescaler = 8





I = 0
Sound Portd.7 , 400 , 450 'BEEP
Sound Portd.7 , 400 , 250 'BEEP
Sound Portd.7 , 400 , 450 'BEEP

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

Do


Main:

Taste = Tastenabfrage()
If Taste <> 0 Then

Select Case Taste
Case 1
Call Batteriespannung 'Taste 1 Zeigt Bateriespannung über RS232 an
Case 2
Call Fehler 'Taste 2 Motoren beschleunigen und abbremsen
Case 3
Goto Leds 'Einige male Lauflicht über LED´s anzeigen. Am I2C-Port darf in diesem Moment nichts angeschlossen sein
Case 4
Call Fehler 'Zeigt Messwerte an allen Port A PIN´s
Case 5
Call Fehler 'Zeigt digitalen I/O Zustand von PA0 bis PA5 an



End Select
Sound Portd.7 , 400 , 500 'BEEP
End If

Waitms 100





Loop

End

Leds:
Config Portc = Output

Portc.0 = 0
Portc.1 = 1
Portc.2 = 0
Portc.3 = 1
Portc.4 = 0
Portc.5 = 1
Portc.6 = 0
Portc.7 = 1

Sound Portd.7 , 400 , 450 'BEEP
Sound Portd.7 , 400 , 250 'BEEP
Sound Portd.7 , 400 , 450 'BEEP

Return



'Diese Unterfunktion fragt die Tastatur am analogen Port ab
Function Tastenabfrage() As Byte
Local Ws As Word

Tastenabfrage = 0
Ton = 600
Start Adc
Ws = Getadc(7)
'Print "Tastenabfrage anpassen!ADC Wert ws=" ; Ws
If Ws < 500 Then
Select Case Ws
Case 400 To 450
Tastenabfrage = 1
Ton = 550
Case 330 To 380
Tastenabfrage = 2
Ton = 500
Case 260 To 305
Tastenabfrage = 3
Ton = 450
Case 180 To 220
Tastenabfrage = 4
Ton = 400
Case 90 To 130
Tastenabfrage = 5
Ton = 350
'Case Else
'Print "Tastenabfrage anpassen!ADC Wert ws=" ; Ws
End Select
Sound Portd.7 , 400 , Ton 'BEEP

End If

End Function



'Diese Unterfunktion zeigt Batteriespannung an
Sub Batteriespannung()
Local W As Word
Start Adc
W = Getadc(6)
Volt = W * Ref
Volt = Volt * 5.2941
Print "Die aktuelle Spannung betraegt: " ; Volt ; " Volt"

End Sub


Sub Fehler()

Print "Nicht verfügbare Funktion!"

End Sub


lg
ikarus_177

linux_80
24.03.2008, 17:59
Hi,
nimm statt dem Goto ein Gosub, denn sonst startet das Programm immer von neuem wenn Leds aufgerufen wird !
Denn das Goto Leds endet mit einem Return, da aber nix zum returnen da ist, gehts ins Nirvana !

Return gehört zum beenden eines mit Gosub aufgerufenen Unterprogrammes.

Bei Gelegenheit mal die Bascom-Hilfe konsultieren, da sind viele Beispiele enthalten.