ja hatte es in einem anderen thread gelesen nachdem ich die frage gepostet habe aner trotzdem danke :D
hatte vergessen dass $regfile "m32def.dat" einzugeben ;)
MfG
DarkSoldier
Druckbare Version
ja hatte es in einem anderen thread gelesen nachdem ich die frage gepostet habe aner trotzdem danke :D
hatte vergessen dass $regfile "m32def.dat" einzugeben ;)
MfG
DarkSoldier
@Richard die Datein gibts im Netz zum download:http://www.shop.robotikhardware.de/s...products_id=12
hätte dann noch eine Frage: Ich habe oben beschrieben wie ich meinen roboter programmieren will. Dazu habe ich jetzt ein Programm geschrieben nur, weiß ich nicht ob dass funktioniert wie ich mir das Vorstelle. Als ich es ausprobieren wollte, kam mal wieder eine Fehlermeldung. Deswegen würde ich jemanden der mit BasCom erfahrung hat bitten, dies zu kontrollieren und zu sagen was falsch ist ;). Das ist eins der ersten Programme die ich selber geschrieben habe, deswegen bitte ich euch nicht auf die "äußere Form " zu achten. ;)
Wäre nett wenn ihr mir weiter helfen könntet, mal wieder
MfG
Danke im Vorraus DarkSoldier
$regfile "m32def.dat"
Declare Sub Ledein
Declare Sub Ledaus
Const Writepowerport_adr = &H72
Const Readpowerport_adr = &H73
Dim I2cdaten As Byte
Dim I As Word
$crystal = 8000000
Config Scl = Portc.0
Config Sda = Portc.1
I2cinit
I2cstart
I2cwbyte &H74
I2cwbyte &B00000010
I2cstop
Config Pind.6 = Output
Portd.6 = 1
Config Pinc.5 = Output
Portc.5 = 0
Config Pind.6 = Output
Portd.6 = 1
Elseif
I2cstart
I2cwbyte Writepowerport_adr
I2cwbyte 15
I2cstop
Then
Config Pind.6 = Output
Portd.6 = 0
Config Pinc.4 = Output
Portc.4 = 0
Config Pinc.5 = Output
Portc.5 = 1
Config Pinc.3 = Output
Do
Portc.2 = 0
Waitms 5
Portc.2 = 1
Waitms 5
Loop Until I < 1
Config Pind.6 = Output
Portd.6 = 1
Du solltest gleich von Beginn an eine gewisse Ordnung in deine Programme bringen. Programmkopf mit Kompileranweisungen, Definitionen, Variablen, Funktionen, Configs und dann die Hauptschleife. Nicht nur wir können dann besser nachvollziehen, was das Programm bewirken soll. Da ich normalerweise in C programmiere kann ich als Beispiel nur ein Programm präsentieren, das ich noch auf meiner Festplatte gefunden habe:Zitat:
Das ist eins der ersten Programme die ich selber geschrieben habe, deswegen bitte ich euch nicht auf die "äußere Form " zu achten.
Keine Ahnung, um was es dabei ging. Es soll nur zeigen, wie hübsch ein struckturierter Programmaufbau aussieht.Code:
$regfile = "M168Pdef.dat" 'es handelt sich um einen ATmega168P
$crystal = 3686400 'der eingebauter RC-Oszillator läuft mit 3,6864 Mhz
$hwstack = 60 'im Speicher werden für den Hardware-Stack 60 Byte reserviert
$swstack = 60 'im Speicher werden für den Software-Stack 60 Byte reserviert
$framesize = 80 'im Speicher werden für den Frame 80 Byte reserviert
$baud = 19200
'IR Sensor
Dim Ir As Word
'Motoren
Dim Mrechts As Byte , Mlinks As Byte
'Servostellung
Dim Servo1 As Byte , X30 As Bit , X40 As Bit , X50 As Bit , X60 As Bit , X70 As Bit , X80 As Bit
'Input für Taster
S1 Alias Pind.2
Smi Alias Pinc.1
'Taster
Config S1 = Input
Config Smi = Input
'PullUp-Widerstand einschalten
S1 = 1
Smi = 1
'Submenüs Declarieren
Declare Sub Vor
Declare Sub Stopp
Declare Sub Denken
Declare Sub Zurück
Declare Sub Weniglinks
Declare Sub Links
Declare Sub Wenigrechts
Declare Sub Rechts
Declare Sub Sehen
'PWM Modulieren
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
'Motoren 0 = Vollgas
Mrechts = 0
Mlinks = 0
'Output für PWM
Config Portb.1 = Output
Config Portb.2 = Output
'Motoren
M1vor Alias Portd.4
M1zur Alias Portd.5
M2vor Alias Portd.6
M2zur Alias Portd.7
Config M1vor = Output
Config M1zur = Output
Config M2vor = Output
Config M2zur = Output
'IR Sensor 300 ca 20 cm, 500 ca 10 cm
'Config für Ir Augen
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
'Servo Settings
'Servo von 20 - 106 (Verwendet 30-80)
Config Servos = 1 , Servo1 = Portd.3 , Reload = 10
Config Portd.3 = Output
Enable Interrupts
'Servo in Mittelstellung
Servo(1) = 54
'S1 schaltet Robi ein
Bitwait S1 , Reset
Bitwait S1 , Set
Wait 1
'Hauptschleife Go
Haupt:
Do
Print "Hauptschleife"
'Mitte Ca. 54 , 30 Links, 80 Rechts
Servo(1) = 35
Call Sehen
Call Sehen
Call Sehen
Call Sehen
Servo(1) = 75
Call Sehen
Call Sehen
Call Sehen
Call Sehen
Call Vor
Loop
End 'end program
Sub Denken
Print "Denken"
'Stopp
M1vor = 0
M2vor = 0
M1zur = 0
M2zur = 0
Waitms 100
Servo1 = 30
Servo(1) = Servo1
X30 = 0
X40 = 0
X50 = 0
X60 = 0
X70 = 0
X80 = 0
Waitms 300
Do
If Smi = 0 Then Call Zurück
Servo(1) = Servo1
Waitms 50
Ir = Getadc(0)
If Servo1 = 30 And Ir > 210 Then X30 = 1
If Servo1 = 35 And Ir > 210 Then X30 = 1
If Servo1 = 40 And Ir > 210 Then X40 = 1
If Servo1 = 45 And Ir > 210 Then X40 = 1
If Servo1 = 50 And Ir > 210 Then X50 = 1
If Servo1 = 55 And Ir > 210 Then X50 = 1
If Servo1 = 60 And Ir > 210 Then X60 = 1
If Servo1 = 65 And Ir > 210 Then X60 = 1
If Servo1 = 70 And Ir > 210 Then X70 = 1
If Servo1 = 75 And Ir > 210 Then X70 = 1
If Servo1 = 80 And Ir > 210 Then X80 = 1
Print "Servopos.: " ; Servo1 ; " Ir: " ; Ir
Servo1 = Servo1 + 5
Loop Until Servo1 > 80
If X30 = 1 And X40 = 0 And X50 = 0 And X60 = 0 And X70 = 0 And X80 = 0 Then Call Wenigrechts
If X30 = 0 And X40 = 0 And X50 = 0 And X60 = 0 And X70 = 0 And X80 = 1 Then Call Weniglinks
If X30 = 1 And X40 = 1 And X50 = 0 And X60 = 0 And X70 = 0 And X80 = 0 Then Call Rechts
If X30 = 1 And X40 = 1 And X50 = 0 And X60 = 0 And X70 = 0 And X80 = 0 Then Call Rechts
If X30 = 1 And X40 = 1 And X50 = 1 And X60 = 0 And X70 = 0 And X80 = 0 Then Call Rechts
If X30 = 0 And X40 = 0 And X50 = 0 And X60 = 0 And X70 = 1 And X80 = 1 Then Call Links
If X30 = 0 And X40 = 0 And X50 = 0 And X60 = 0 And X70 = 1 And X80 = 1 Then Call Links
If X30 = 0 And X40 = 0 And X50 = 0 And X60 = 1 And X70 = 1 And X80 = 1 Then Call Links
If X50 = 1 And X60 = 1 Then Call Zurück
If X40 = 1 And X70 = 1 Then Call Zurück
Call Vor
End Sub
Sub Stopp
Print "Stopp"
'Stopp
M1vor = 0
M2vor = 0
M1zur = 0
M2zur = 0
Goto Denken
End Sub
Sub Vor
Print "Vor"
Pwm1a = Mrechts
Pwm1b = Mlinks
'Vorwärts fahren
M1vor = 1
M2vor = 1
M1zur = 0
M2zur = 0
Goto Haupt
End Sub
Sub Weniglinks
Print "Weniglinks"
M1vor = 0
M2vor = 0
M1zur = 1
M2zur = 0
Waitms 100
Call Stopp
End Sub
Sub Links
Print "Links"
M1vor = 0
M2vor = 0
M1zur = 1
M2zur = 0
Waitms 200
Call Stopp
End Sub
Sub Wenigrechts
Print "Wenigrechts"
M1vor = 0
M2vor = 0
M1zur = 0
M2zur = 1
Waitms 100
Call Stopp
End Sub
Sub Rechts
Print "Rechts"
M1vor = 0
M2vor = 0
M1zur = 0
M2zur = 1
Waitms 200
Call Stopp
End Sub
Sub Zurück
Print "Zurück"
'Zurück
M1vor = 0
M2vor = 0
M1zur = 1
M2zur = 1
Waitms 250
If Ir > 256 Then Call Links
If Ir < 257 Then Call Rechts
End Sub
Sub Sehen
If Smi = 0 Then Call Zurück
If S1 = 0 Then Mrechts = Mrechts + 2
Ir = Getadc(0)
Print "Servo: " ; Servo(1) ; " Ir: " ; Ir
If Ir > 230 Then Call Stopp
Waitms 50
End Sub
Gruß
mic
Edit:
Ich habe mal versucht dein Programm zu ordnen:
Irgendwie wird's dadurch aber auch nicht besser. Vielleicht solltest du dir mal ein Bascom-Tutorial durchlesen.Code:$regfile "m32def.dat"
$crystal = 8000000
Const Writepowerport_adr = &H72
Const Readpowerport_adr = &H73
Dim I2cdaten As Byte
Dim I As Word
Config Scl = Portc.0
Config Sda = Portc.1
Config Pinc.3 = Output
Config Pinc.4 = Output
Config Pinc.5 = Output
Config Pind.6 = Output
Declare Sub Ledein
Declare Sub Ledaus
I2cinit
I2cstart
I2cwbyte &H74
I2cwbyte &B00000010
I2cstop
Portd.6 = 1
Portc.5 = 0
Portd.6 = 1
Elseif
I2cstart
I2cwbyte Writepowerport_adr
I2cwbyte 15
I2cstop
Then
Portd.6 = 0
Portc.4 = 0
Portc.5 = 1
Do
Portc.2 = 0
Waitms 5
Portc.2 = 1
Waitms 5
Loop Until I < 1
Portd.6 = 1
Das ist kein Programm, wo sind die Sub Routinen und wo werden sie aufgerufen/beendet?
Ein Elseif oder auch ein Then alleine in einer Zeile ergibt keinen Sinn...und bitte Programmzeilen/Beispiele in Code Tags
()Code:)
Programm
(
Einsperren. :-)
Gruß Richard
kann mir jemand von euch sagen, wie mann eine wenn, dann Beziehung schreibt wäre echt nett.
danke an Richard und radbruch die versucht haben aus meinem blödsinn noch was gescheids zu machen.
mfg
DarkSoldier
Bascom Hilfe IF,Then,else, gosub, Call, return ...für jeden Befehl gibt es kleine leicht zu verstehende Beispiele, die solltest (MUSST) Du leider abarbeiten und ausprobieren. Da geht KEIN Weg an vorbei!!!!!! Genau genommen sollte man ALLE Befehle aus der Hilfe so nach und nach durch probieren um die Möglichkeiten von Bascom zu erlernen. Mühsam ernährt sich das Eichhörnchen....oder es verhungert,stirbt aus.Code:if x = 1 then gosub...............'gehe zu subroutine LED EIN
else Gosub ...........................'gehe zu subroutine LED AUS
Gruß Richard
gibts des ganze auch auf deutsch? wenn net is auch egal
Hier ist 'ne Seite auf deutsch, die ich sehr hilfreich finde.Zitat:
gibts des ganze auch auf deutsch?
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/
Gruß
Searcher
Danke werde mir diese seite mal zu gemüte führen baue grad an meinem Robotergehäuse und dann les ichs
Danke
mfg Dark
Nachdem mir radbruch das ganze programm schon einmal formatiert hat poste ich es jetzt da mir noch eine Frage aufgekommen ist:
Nach dem Unterprogramm besteht bascom darauf, dass man noch ein loop hinzufügt. Aber soweit ich weiß hat man dann eine schleife. Deshalb ist meine Frage: Wie muss man das programmieren dass er nach einmaligen durchlauf wieder zurück zum hauptprogramm springt?
PS Dass noch nichts im Hauptprogramm steht weiß ich :D
$regfile = "M32def.dat"
$crystal = 8000000
' Interruptserviceroutinen(ISR) Zuordnen
On Int0 Unterprogramm1
On Int1 Unterprogramm1
On Int2 Unterprogramm1
' erst enablen wenn alle Interrupteinstellungen erledigt sind
Enable Interrupts
' es reicht die funktionen der Pins einmalig festzulegen
Config Pinc.3 = Output
Config Pinc.4 = Output
Config Pinc.5 = Output
Config Pind.6 = Output
Portc.3 = 0
Portc.4 = 1
Portc.5 = 0
Portd.6 = 1 'Portd?
' Hauptschleife
Do
Loop
' Programmende
End
' ISR
Unterprogramm1:
Portc.4 = 0
Portc.5 = 1
Portd.6 = 0
Wait 2
Portd.6 = 1
Wait 2
Portd.6 = 0
Do
Waitms 5
Portc.3 = 1
Waitms 5
Portc.3 = 1
Loop
Return
Danke im Vorraus
MfG Dark