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: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






Zitieren


Lesezeichen