Mit den Befehlen Gosub und Return.
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
Und was spricht dagegen einen USART Interrupt zu verwenden?
Dann läuft das Programm weiter solange nichts empfangen wird. Sobald was empfangen wird, springt der Controller in die ISR und dort musst du dann die Daten aus dem Buffer holen und das Empfangene richtig zusammensetzen (wenn es ein String ist den du sendest).
Guckste hier:
http://www.rowalt.de/mc/avr/avrboard/06/avrb06.htm
USART-Interrupts sind eh die elegantere Wahl um was zu empfangen. Eben aus deinem speziellen Grund.
Edit:
Und pack mal deinen Code zwischen {code} und {/code}. Nur halt diese Klammern nehmen []
Dann sieht das so aus
und die Leser haben nicht direkt so eine Textwand vor sich. Ich für meinen Teil habe mir da erstmal nur gedacht TLDR - Too long don´t read....und ich bin sicher nicht der einzigsteCode:Blablablabla Blablablabla Blablablabla Blablablabla Blablablabla Blablablabla Blablablabla Blablablabla Blablablabla
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
kann einer von euch nich meinen code umändern weil ich kp von usart habe
bitte
Was verstehst du den am USART nicht?
Sagen wir es mal so....USART ist von den "Busen" her der einfachste
Und wenn du den Bus nicht verstehst, dann nutz doch die Gelegenheit deines Problems um dich mal etwas intensiver mit ihm zu beschäftigen.
Wenn dir das jetzt jemand vorkaut wirst du das Prinzip nie verstehen. Am meisten lernst du nicht wenn etwas funktioniert sondern wenn etwas NICHT funktioniert.
Hilfestellung kann dir jeder hier geben.
Aber wie heißt es so schön.....wir können dir den Weg zeigen. Aber ans Ziel musst du alleine kommen.
Fang erstmal klein an. Nutze dafür den Link den ich dir gegeben habe. Und dann arbeite dich immer weiter vor.
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
danke aber ich blick da echt nich durch habe mir die seite angeschaut aber nop ich hab kp wie das gehen soll kanste mir den code nich machen dann hab ich was wo ich sehen kann aha da is mein eingang was ich sende und da schaltet der das so um das das programm weiter leuft.
Lesezeichen