$part macht nur 16 Werte, habe jedoch 32 Werte

Antworten
abacom
Site Admin
Beiträge: 3925
Registriert: Dienstag 23. September 2008, 10:54
Kontaktdaten:

$part macht nur 16 Werte, habe jedoch 32 Werte

Beitrag von abacom » 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
ABACOM support

Antworten

Zurück zu „Thema RS232“