-
Das gleiche geht glaub ich auch mit Conifg Portx = &b00001111 (0 = Eingang / 1 = Ausgang)
öhm...RCO... war nicht ein Byte (8Bit)von 0 bis 255 und ein Integer wie ein Word (16 Bit) aber mit zulässigen Wertzuweisungen von
-30tausendirgentwas bis +30tausendirgentwas?!??!? (und ergäbe nicht -(-30tausendirgentwas) + +30tausendirgendwas zusammen 65534 ?!?)Lass mich nicht verzweifeln. Bin grad ganz schön am grübeln... ;)
-
öhm...ja möglich! :oops: ;-)
-
Einen guten Einstieg in Bascom gibt es auf der Seite von Roland Walter( http://www.rowalt.de/mc/index.htm). Kann auch sein Buch dazu empfehlen.
Gruß Jens
-
viele Wege führen nach Rom
config portX = input / output 'setzen des ganzen Ports
config portX.Y = input / output 'setzen eines einzelnen Pins
ddrX = &B00001111 'setzen des Ports
wenn das Programm leicht zu lesen sein soll, dann würde ich config verwenden; soll das Programm vielleicht nach Assembler übersetzt werden, dann sollte ddrX verwendet werden.
ein Byte (8 Bit) - 0 bis 255
ein Integer (16 Bit) - -32768 bis 32767
ein Word (16 Bit) - 0 bis 65535
bei Integerzahlen wird das höchstwertige Bit als Vorzeichen verwendet, das ist ansich der ganze Unterschied zum Word
-
Kleine Korrektur:
config portX.Y = input / output 'setzen eines einzelnen Pins
Das funktioniert nur bei Output.
Wenn eine Leitung als Input fungieren soll, muß man es so definieren:
config pinX.Y = input
-
Das ist ein super Thread, genau das habe ich gesucht! Vielen Dank an alle.
Das ganze hat jetzt jedoch noch einige Fragen bei mir aufgeworfen! Warum das "Waitms 100" am ende der Schleife, dadurch hat man doch nur unnötige Verzögerung! Bei mir funzt es ohne das Wait eigentlich genauso nur eben schneller. Daraus entsteht jetzt die nächste Frage: wenn ich alle LEDs an/aus schalte, passiert das sofort beim drücken. Wenn ich nur eine anschalten will, muss ich den T1 dafür einige Sek. gedrückt halten, warum?
So, genug erstmal. Jetzt werd ich mieder Learning by doing und Try & error machen :D
-
Hallo,
ich habe einiges Probiert und auch vieles davon früher/später hinbekommen. Jetzt habe ich mir eben mal ein Taster mit 2 Drähtchen zusammen gebastelt, den ich als Test-Sensor erstmal verwenden wollte. Den habe ich an meiner RN-Control zwischen +5V und Port A.2 (also den 3.) geklemmt. Mein ganz simples Motoren Test Progg soll anhalten bzw. den Motor anders herum drehen, sobald dieser Port durch den Taster auf High gesetzt wird.
Das tut es leider nicht. Programmier-technisch ist das auch noch nicht so schön gelöst, noch ist diese Prüfung in ner While Endlos Schleife, wodurch alle anderen Taster (die oboard) in der Zeit blockiert sind.
Vllt kann mir ja jemand helfen, hier erstmal der Code:
Code:
$crystal = 16000000
$baud = 9600
$regfile = "m32def.dat"
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pina.2 = Input 'Testsensor
Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein
Porta.2 = 1
Config Portc = Output
Config Portb = Output
Dim Taster As Word
Dim Sensor As Word
Dim I As Integer
Dim N As Integer
Dim B As Boolean
Ddrc = &B00000001
Do
Start Adc
Taster = Getadc(7)
Sensor = Getadc(2)
If Taster < 1010 Then
Select Case Taster
Case 410 To 450 'Taste 1: Motor 1 Dreht 1
Sound Portd.7 , 100 , 200
Ddrc = &B10000000
Do While Not B 'Dauernd prüfen
If Sensor < 1000 Then
Ddrc = &B00000000 'Wenn Hindernis, dann Rückwärts bzw. aus!
Exit Do
End If
Loop
Case 340 To 380 'Taste 2: Motor 1 Dreht 2
'Sound Portd.7 , 100 , 400
Ddrc = &B01000000
Case 265 To 305 'Taste 3: Motor 2 Dreht 1
'Sound Portd.7 , 100 , 200
Ddrb = &B00000010
Case 180 To 220 'Taste 4: Motor 2 Dreht 2
'Sound Portd.7 , 100 , 400
Ddrb = &B00000001
Case 80 To 150 'Taste 5: Motoren Stop
'Achtung, das Funzut auch noch nicht ganz, es geht nur der erste Motor aus!!
Ddrc = &B00000000 'Motor 1
Ddrb = &B00000000 'Motor 2
End Select
End If
Loop
End
Danke!
-
Mal ne Frage, wenn du doch den Pullup von A.2 anschaltest un den Taster gegen +5 V schaltest, wo soll da was passieren? Entweder der Taster ist nciht gedrück --> Pullup zieht den Eingang hoch oder Taster ist gedrückt, Taster und Pullup ziehen hoch.
Schalte den taster gegen GND.
MFG Moritz
-
Erscheint logisch, danke. Hab das gerade mal umgesteckt... Aber auf die Schnelle habe ich keinen Erfolg verzeichnen können. Muss ich dann abfragen ob der Wert näherungsweise 0 oder 1000 und paar zerquetschte ist?
-
N'abend!
Learning by doing hat sich wieder einmal bewährt! Habe das jetzt hinbekommen und weiß auch woran es lag! Ich habe als Endlosschleife eine For Schleife genutzt die nie Endet. Das mag er anscheind nicht. Mit Do Loop gehts ohne Probleme. Außerdem habe ich die Sache mit den Sub's hinbekommen. Alles eigentlich nicht schwer.
Hier mein kleines Programm zum Fahren mit 2 Motoren. Wird ein Hinderniss erfasst, wird kurz zurück gesetzt, etwas nach rechts gedreht und weiter gefahren... Ob die Zeiten in der Praxis OK sind kann ich nicht sagen, aber das ist ja egal.
Was meint ihr, kann man da etwas besser machen? Wie lasst ihr den Bot ausweichen?
Code:
Code:
$crystal = 16000000
$baud = 9600
$regfile = "m32def.dat"
Declare Sub Fahren()
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein
Config Portc = Output
Config Portb = Output
Dim Taster As Word
Ddrc = &B00000001 'Zu Beginn eine LED an
Do
Start Adc
Taster = Getadc(7)
If Taster < 1010 Then
Select Case Taster
Case 410 To 450 'Taste 1: Fahren bis Hindernis
Call Fahren()
'Case 340 To 380 'Taste 2:
'Case 265 To 305 'Taste 3:
'Case 180 To 220 'Taste 4:
'Case 80 To 150 'Taste 5:
End Select
End If
Loop
End
'#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#
Sub Fahren()
Dim Sensor As Word
Sensor = Getadc(2) 'Sensor 1 aktivieren
Config Pina.2 = Input 'Port als Input
Porta.2 = 1 'Port hoch setzen
Ddrc = &B10000000 'Motor 1 Vorwärts
Ddrb = &B00000010 'Motor 2 Vorwärts
Do 'Endlosschleife
If Getadc(2) < 1010 Then 'Wenn Port runter gesetzt wird (Low)
Ddrc = &B01000000 'Motor 1 Rückwärts
Ddrb = &B00000001 'Motor 2 Rückwärts
Print "Hindernis, setze zurueck!"
Waitms 100
'Rechtsdrehung
Ddrc = &B10000000 'Motor 1 Vorwärts
Ddrb = &B00000001 'Motor 2 Rückwärts
Waitms 50
'Geradeaus
Ddrb = &B00000010 'Motor 2 Vorwärts
Print "Setze Fahrt fort!"
End If
Loop
End Sub