$part macht nur 16 Werte, habe jedoch 32 Werte
Verfasst: Dienstag 14. Oktober 2008, 12:58
LED
Anmeldungsdatum: 15.02.2008
Beiträge: 54
Verfasst am: 17.06.2008 11:06 Titel: $part macht nur 16 Werte, habe jedoch 32 Werte
--------------------------------------------------------------------------------
Hallo Forum,
Ein Mikrocontroller sendet mir 32 Messwerte durch Komma getrennt über die RS232 an PL.
Mit dem Bauteil Part kann ich leider nur 16 Messwerte decodieren.
Muss ich jetzt mein µC Programm umstricken, oder gibt es eine einfache Möglichkeit.
mfg
LED
Nach oben
Mike D
Anmeldungsdatum: 03.07.2006
Beiträge: 236
Verfasst am: 17.06.2008 12:50 Titel:
--------------------------------------------------------------------------------
Hallo LED,
unter der Vorraussetzung, dass die Messwerte eine konstante Zeichenlänge haben, könntest du mit 2 $Copy die Zeile halbieren und dann auf 2 $Part geben.
Mike
Nach oben
LED
Anmeldungsdatum: 15.02.2008
Beiträge: 54
Verfasst am: 17.06.2008 13:10 Titel:
--------------------------------------------------------------------------------
Danke Mike D für die schnelle Antwort
Ich sende vom AD Eingang die messwerte als dezimal Wert, alos 0 bis 1023. Es ist also unterschiedliche Zeichenlänge.
Aber ich könnte das µC Programm (Bascom Basic) umstricken, so das jeweils pro Wert zwei Bytes gesendet werden, damit konstante Zeichenlänge und nur max 2 Bytes pro Wert statt 4 als dezimal Wert.
Dann stehe ich aber auf dem Schlauch, wüsste erst mal nicht wie ich das in PL mache. Ausserdem müssten die Werte wieder in Dezimal zurückgewandelt werden.
sende von den 16 AD Eingängen jeweils Maximum und Minimum Wert.
Hier erst mal mein Orginal
mfg LED
Code:
$prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus
$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44
$crystal = 16000000 'Quarzfrequenz
Config Pind.5 = Output
Led Alias Portd.5
$baud = 57600
'Config Com4 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Open "com4:" For Binary As #4 'USB Buchse
Const Tz = "," ' Trennzeiche ist ein Komma
Dim Kanal As Byte
'Min Max Buffer
Dim Adcmax(16) As Word 'Tabelle Maximum Werte
Dim Adcmin(16) As Word 'Tabelle Minimum Werte
Dim Index As Byte 'Zeiger auf Speicherplatz
Dim Wert As Word
' *** ADC ***
Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1
Start Adc
' *** Timer1 16 Bit ***
Const Timervorgabe = 3036 'Vorgabe für Timer um die genaue Intervallfrequenz zu erreichen
Config Timer1 = Timer , Prescale = 256
On Timer1 Timer1_isr
Enable Timer1
Enable Interrupts
'*** Hauptschleife ***
Do
Led = 1
For Kanal = 0 To 15
If Kanal > 7 Then Kanal = Kanal + 24 ' Wegen Bascom 1.11.9.1 Bug notwendig
Wert = Getadc(kanal)
If Kanal > 7 Then Kanal = Kanal - 24 ' Wegen Bascom 1.11.9.1 Bug notwendig
Kanal = Kanal + 1 ' Array ADCmax startet bei 1 und nicht bei 0
If Adcmax(kanal) <Wert> Wert Then Adcmin(kanal) = Wert
If Adcmin(kanal) = 0 Then Adcmin(kanal) = Wert ' Wenn = im Speicher (kleinster Wert) trotzdem überschreiben
Kanal = Kanal - 1
Next Kanal
Loop
' *** Timer 1 Interrupt Programm ***
' Aufruf jede Sekunde
Timer1_isr:
Timer1 = Timervorgabe
Led = 0
Print "*" ; Tz;
For Index = 1 To 16
Print Adcmax(index) ; Tz;
Adcmax(index) = 0
Print Adcmin(index) ; Tz;
Adcmin(index) = 0
Next Index
Print "#" ; Tz
Return
End
Nach oben
Mike D
Anmeldungsdatum: 03.07.2006
Beiträge: 236
Verfasst am: 17.06.2008 13:25 Titel:
--------------------------------------------------------------------------------
dann sende doch einmal nach dem 16. Wert statt des , ein ;.
In PL trennst du dann die Zeile mit einem 2-kanaligen $Part am ; und gibst die Hälten dann auf 2 $Part
Mike
Nach oben
LED
Anmeldungsdatum: 15.02.2008
Beiträge: 54
Verfasst am: 17.06.2008 14:13 Titel:
--------------------------------------------------------------------------------
Danke Mike D, du hast mir sehr geholfen.
Auf die Idee Part nochmal zum trennen zu nehmen wäre ich nicht gekommen, obwohl es ja logisch ist.
Habe das Programm nochmal geändert, funktioniert jetzt wunderbar.
Jetzt fehlt mir nur noch eine Art Prüfsumme, aber das ist nicht so dringend.
Code:
' *** Timer 1 Interrupt Programm ***
' Aufruf jede Sekunde
Timer1_isr:
Timer1 = Timervorgabe
Led = 0
For Index = 1 To 16
Print Adcmax(index) ;
Adcmax(index) = 0
If Index = 8 Then Print "#" ; Else Print ",";
Print Adcmin(index) ; Tz;
Adcmin(index) = 0
Next Index
Print
Return
End
Anmeldungsdatum: 15.02.2008
Beiträge: 54
Verfasst am: 17.06.2008 11:06 Titel: $part macht nur 16 Werte, habe jedoch 32 Werte
--------------------------------------------------------------------------------
Hallo Forum,
Ein Mikrocontroller sendet mir 32 Messwerte durch Komma getrennt über die RS232 an PL.
Mit dem Bauteil Part kann ich leider nur 16 Messwerte decodieren.
Muss ich jetzt mein µC Programm umstricken, oder gibt es eine einfache Möglichkeit.
mfg
LED
Nach oben
Mike D
Anmeldungsdatum: 03.07.2006
Beiträge: 236
Verfasst am: 17.06.2008 12:50 Titel:
--------------------------------------------------------------------------------
Hallo LED,
unter der Vorraussetzung, dass die Messwerte eine konstante Zeichenlänge haben, könntest du mit 2 $Copy die Zeile halbieren und dann auf 2 $Part geben.
Mike
Nach oben
LED
Anmeldungsdatum: 15.02.2008
Beiträge: 54
Verfasst am: 17.06.2008 13:10 Titel:
--------------------------------------------------------------------------------
Danke Mike D für die schnelle Antwort
Ich sende vom AD Eingang die messwerte als dezimal Wert, alos 0 bis 1023. Es ist also unterschiedliche Zeichenlänge.
Aber ich könnte das µC Programm (Bascom Basic) umstricken, so das jeweils pro Wert zwei Bytes gesendet werden, damit konstante Zeichenlänge und nur max 2 Bytes pro Wert statt 4 als dezimal Wert.
Dann stehe ich aber auf dem Schlauch, wüsste erst mal nicht wie ich das in PL mache. Ausserdem müssten die Werte wieder in Dezimal zurückgewandelt werden.
sende von den 16 AD Eingängen jeweils Maximum und Minimum Wert.
Hier erst mal mein Orginal
mfg LED
Code:
$prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus
$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44
$crystal = 16000000 'Quarzfrequenz
Config Pind.5 = Output
Led Alias Portd.5
$baud = 57600
'Config Com4 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Open "com4:" For Binary As #4 'USB Buchse
Const Tz = "," ' Trennzeiche ist ein Komma
Dim Kanal As Byte
'Min Max Buffer
Dim Adcmax(16) As Word 'Tabelle Maximum Werte
Dim Adcmin(16) As Word 'Tabelle Minimum Werte
Dim Index As Byte 'Zeiger auf Speicherplatz
Dim Wert As Word
' *** ADC ***
Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1
Start Adc
' *** Timer1 16 Bit ***
Const Timervorgabe = 3036 'Vorgabe für Timer um die genaue Intervallfrequenz zu erreichen
Config Timer1 = Timer , Prescale = 256
On Timer1 Timer1_isr
Enable Timer1
Enable Interrupts
'*** Hauptschleife ***
Do
Led = 1
For Kanal = 0 To 15
If Kanal > 7 Then Kanal = Kanal + 24 ' Wegen Bascom 1.11.9.1 Bug notwendig
Wert = Getadc(kanal)
If Kanal > 7 Then Kanal = Kanal - 24 ' Wegen Bascom 1.11.9.1 Bug notwendig
Kanal = Kanal + 1 ' Array ADCmax startet bei 1 und nicht bei 0
If Adcmax(kanal) <Wert> Wert Then Adcmin(kanal) = Wert
If Adcmin(kanal) = 0 Then Adcmin(kanal) = Wert ' Wenn = im Speicher (kleinster Wert) trotzdem überschreiben
Kanal = Kanal - 1
Next Kanal
Loop
' *** Timer 1 Interrupt Programm ***
' Aufruf jede Sekunde
Timer1_isr:
Timer1 = Timervorgabe
Led = 0
Print "*" ; Tz;
For Index = 1 To 16
Print Adcmax(index) ; Tz;
Adcmax(index) = 0
Print Adcmin(index) ; Tz;
Adcmin(index) = 0
Next Index
Print "#" ; Tz
Return
End
Nach oben
Mike D
Anmeldungsdatum: 03.07.2006
Beiträge: 236
Verfasst am: 17.06.2008 13:25 Titel:
--------------------------------------------------------------------------------
dann sende doch einmal nach dem 16. Wert statt des , ein ;.
In PL trennst du dann die Zeile mit einem 2-kanaligen $Part am ; und gibst die Hälten dann auf 2 $Part
Mike
Nach oben
LED
Anmeldungsdatum: 15.02.2008
Beiträge: 54
Verfasst am: 17.06.2008 14:13 Titel:
--------------------------------------------------------------------------------
Danke Mike D, du hast mir sehr geholfen.
Auf die Idee Part nochmal zum trennen zu nehmen wäre ich nicht gekommen, obwohl es ja logisch ist.
Habe das Programm nochmal geändert, funktioniert jetzt wunderbar.
Jetzt fehlt mir nur noch eine Art Prüfsumme, aber das ist nicht so dringend.
Code:
' *** Timer 1 Interrupt Programm ***
' Aufruf jede Sekunde
Timer1_isr:
Timer1 = Timervorgabe
Led = 0
For Index = 1 To 16
Print Adcmax(index) ;
Adcmax(index) = 0
If Index = 8 Then Print "#" ; Else Print ",";
Print Adcmin(index) ; Tz;
Adcmin(index) = 0
Next Index
Return
End