Mit den Befehlen Gosub und Return.
Code:Do Reset Watchdog' wenn man ihn nutzt Gosub Uhranzeigen ' wird jedesmal aufgerufen If Ischarwaiting() = 1 Then ' Wenn Zeichen über RS232 angekommen ist, dann dahin, sonst einfach mit Hauptschleife weitermachen Gosub Empfangen End If Loop End Empfangen: A = Inkey() If A >= 13 Then ' alles kleiner 13 wird einfach abgeschnitten. Nutze ich hauptsächlich, da ich Werte im String übertrage If A = 13 Then Gosub Auswerten Else If Len(seingang) < Maxlaenge Then ' nicht, dass seingang "platzt" und die nächsten Variablen überschreibt Seingang = Seingang + Chr(a) End If End If End If Return Auswerten: ... ' hier der Code, um das Empfangene auszuwerten ... ... return
Wenn das Herz involviert ist, steht die Logik außen vor! \/
ICH MÖCHTE DEN BEREICH WO anfang und ende unterprogramm steht in ein unterprogramm packen damit der rest einfach weiter läuft$crystal = 1000000
$regfile = "m16def.dat"
$baud = 2400
Config Pinb.6 = Input
Config Portc = Output
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , _
Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Config Lcd = 16 * 2
Cursor Off
Cls
Dim Asd As String * 255
Dim P1 As Integer
Dim P2 As Integer
Dim P3 As Integer
Dim P4 As Integer
Dim P5 As Integer
Dim P6 As Integer
Dim P7 As Integer
Dim P8 As Integer
Dim P9 As Integer
Dim P10 As Integer
Do
If Pinb.6 = 0 Then
Locate 1 , 1
Lcd P1
Locate 1 , 5
Lcd "P1"
Locate 1 , 8
Lcd P2
Locate 1 , 12
Lcd "P2"
Locate 2 , 1
Lcd P3
Locate 2 , 5
Lcd "P3"
Locate 2 , 7
Lcd P4
Locate 2 , 11
Lcd "P4"
Locate 2 , 13
Lcd P5
Else
Locate 1 , 1
Lcd P6
Locate 1 , 5
Lcd "P6"
Locate 1 , 8
Lcd P7
Locate 1 , 12
Lcd "P7"
Locate 2 , 1
Lcd P8
Locate 2 , 5
Lcd "P8"
Locate 2 , 7
Lcd P9
Locate 2 , 11
Lcd "P9"
Locate 2 , 13
Lcd P10
End If
P6 = Getadc(0)
P7 = Getadc(1)
P8 = Getadc(2)
P9 = Getadc(3)
P10 = Getadc(4)
If P1 <> P6 Then Portc.0 = 1 Else Portc.0 = 0
If P1 = P6 Then Portc.1 = 1 Else Portc.1 = 0
If P2 <> P7 Then Portc.2 = 1 Else Portc.2 = 0
If P2 = P7 Then Portc.3 = 1 Else Portc.3 = 0
If P3 <> P8 Then Portc.4 = 1 Else Portc.4 = 0
If P3 = P8 Then Portc.5 = 1 Else Portc.5 = 0
If P4 <> P9 Then Portc.6 = 1 Else Portc.6 = 0
If P4 = P9 Then Portc.7 = 1 Else Portc.7 = 0
'ANFANG UNTERPROGRAMM
Asd = ""
Input Asd
Select Case Asd
Case "1,"
Input P1
Print P1
Case "2," 'p2 schreiben
Input P2
Print P2
Case "3," 'p3 schreiben
Input P3
Print P3
Case "4," 'p3 schreiben
Input P4
Print P4
Case "5," 'p3 schreiben
Input P5
Print P5
End Select
'ENDE UNTERPROGRAMM
Loop
End
Der Rest läuft nicht einfach weiter. Ein Input blockiert den MC auch in einem Unterprogramm, wenn da keine Daten anliegen.
Könnte jetzt laufen.Code:$crystal = 1000000 $regfile = "m16def.dat" $baud = 2400 Config Pinb.6 = Input Config Portc = Output Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1 Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , _ Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0 Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Config Lcd = 16 * 2 Cursor Off Cls Dim Asd As String * 5 Dim P0 As Byte At Asd Overlay Dim P1 As Word At Asd + 2 Overlay Dim B As Byte Dim P(10) As Word Do If Pinb.6 = 0 Then Locate 1 , 1 Lcd P(1) Locate 1 , 5 Lcd "P1" Locate 1 , 8 Lcd P(2) Locate 1 , 12 Lcd "P2" Locate 2 , 1 Lcd P(3) Locate 2 , 5 Lcd "P3" Locate 2 , 7 Lcd P(4) Locate 2 , 11 Lcd "P4" Locate 2 , 13 Lcd P(5) Else Locate 1 , 1 Lcd P(6) Locate 1 , 5 Lcd "P6" Locate 1 , 8 Lcd P(7) Locate 1 , 12 Lcd "P7" Locate 2 , 1 Lcd P(8) Locate 2 , 5 Lcd "P8" Locate 2 , 7 Lcd P(9) Locate 2 , 11 Lcd "P9" Locate 2 , 13 Lcd P(10 ) End If P(6) = Getadc(0) P(7) = Getadc(1) P(8) = Getadc(2) P(9) = Getadc(3) P(10) = Getadc(4) If P(1) <> P(6) Then Portc.0 = 1 Else Portc.0 = 0 If P(1) = P(6) Then Portc.1 = 1 Else Portc.1 = 0 If P(2) <> P(7) Then Portc.2 = 1 Else Portc.2 = 0 If P(2) = P(7) Then Portc.3 = 1 Else Portc.3 = 0 If P(3) <> P(8) Then Portc.4 = 1 Else Portc.4 = 0 If P(3) = P(8) Then Portc.5 = 1 Else Portc.5 = 0 If P(4) <> P(9) Then Portc.6 = 1 Else Portc.6 = 0 If P(4) = P(9) Then Portc.7 = 1 Else Portc.7 = 0 'ANFANG UNTERPROGRAMM If Ischarwaiting() = 1 Then Gosub Empfangen End If 'ENDE UNTERPROGRAMM Loop End Empfangen: B = Inkey() If Len(asd) < 5 Then Asd = Asd + Chr(b) End If If Len(asd) = 5 Then Gosub Auswerten End If Return Auswerten: If P0 > 0 And P0 < 6 Then P(p0) = P1 Print P(p0) End If asd="" Return
Jedoch wird keine Abweichung / Versatz abgefangen
Wer sendet denn die Daten und wie werden die abgeschlossen?
Geändert von peterfido (05.06.2012 um 19:27 Uhr) Grund: Neuer Code So könnte es laufen
Wenn das Herz involviert ist, steht die Logik außen vor! \/
sie werden vom pc gesendet (bascom oder putty ) per RS232
also jetzt ist es so das wenn ich 1, absende weiß der amtega16 die vari. p1 wird jetzt mit der nächsten zahl beschrieben und wenn er das gemacht hat gibt er die gleiche zahl zurück. nur hält das programm an wenn ich nichts sende was mein prob. ist
Lesezeichen