str = str1 + str2Mike.
Edit, I don't know how to concatenate strings.
Hi S,Compiler rejects the longer str= statement, stating that it is too long and one has to define the STRING_MAX_LENGTH to a larger value. It just won't compile...
The runtime just seems to ignore going over bounds for strings. It does not overflow to the next storage location. The LEN function returns the maximum length as defined as maximum string length.What happens if you extend it programatically?
I.E.
What does it return for len(str) then?Code:for i=1 to 20 str=str&"A" next i
Not that it matters, I'm just curious.
Mike.
Edit, I don't know how to concatenate strings.
Was this code which gave glitch free opperation previously?I prgrammed it with the shift register CODe from a while back
Hi M,Was this code which gave glitch free opperation previously?
Mike.
'18F4431 32MHz XTL REMOTE_SLAVE 164 389 030223 1200
Define CONFIG1L = 0x00
Define CONFIG1H = 0x06 '8mHz XTL x4 =32mHz
Define CONFIG2L = 0x0c
Define CONFIG2H = 0x20
Define CONFIG3L = 0x04
Define CONFIG3H = 0x80
Define CONFIG4L = 0x80 'Set for HVP
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40
Define CLOCK_FREQUENCY = 32
'Define SIMULATION_WAITMS_VALUE = 1 'Comment in for SIM out for PIC
Dim servoCount as byte
Dim i as Word
Dim wordTemp As Word
Dim servoPos(8) as word
Dim frame as word
'need to ensure the 164 is reset at power on.
OSCCON = %01110000 '& h70
TRISA = %11000000 '7=OSC, 6=OSC,
TRISC = %11111010 '6=1-slave4431_cs, 2=74HC164 CLK, 0=74HC164 DATA
LATC.0=0 'ensure data is low
LATC.2=0 'snd clock
For i = 0 to 7
LATC.2=1 'send positive clock edge
servoPos(i)=i*250+2000 '1ms(2000) to 1.875(1 7/8ths - 3750)ms in 1/8th mS steps
LATC.2=0 'send negative edge
Next i
TRISC=%11111010 'CCP0 (RC2) & RC0 output
servoCount=8 'cause it to reset
T1CON=%00100000 'prescaler = 4
T1CON.0=1 'start timer
CCP1CON=%1000 'will go high on interrupt - will start a 0.5mS pulse
frame=1000 'start everything in 4000 cycles
While 1
If PIR1.CCP1IF Then 'has CCP1 triggered?
wordtemp.HB = CCPR1H 'get value of CCPR1 into wordTemp
wordtemp.LB = CCPR1L
If CCP1CON = 0x08 Then 'have we started the 1000 cycle pulse
CCP1CON = 0x09 'yes so end the pulse after 0.5mS
wordtemp = wordtemp + 1000 'adding 1000 will make pulse 0.5mS long
Else
LATC.0=0 'clear the data pin
CCP1CON = 0x08 'No so output the timed gap
if servoCount<8 then
'still doing the servos so add remainder of time
wordtemp = wordtemp+servoPos(servoCount)
wordTemp=wordTemp-1000 'knock of the 1000 already elapsed
frame=frame-servoPos(servoCount)
servoCount = servoCount + 1
Else
'done all the servos so just the frame gap to do
wordtemp = wordtemp +frame
frame=39000 '40,000(20mS) minus time of positive pulse(0.5mS)
servoCount=0 'start all over again
LATC.0=1 'will become first pulse
Endif
Endif
CCPR1H = wordtemp.HB 'put value back into CCPR1
CCPR1L = wordtemp.LB
PIR1.CCP1IF = 0 'clear interrupt flag
Endif
'change any servo positions here
Wend
End
If servoPos < 2000 Then 'have we gone past the end?
If servoPos(i) < 2000 Then 'have we gone past the end?
' change Long to Byte since the largest elapased time is '> 20'
Dim ms As Byte
Dim tick As Byte
'add new declarations
Dim Dir as byte
Dim Pos as word
While 1
'adjust servo positions here
'INTCON.GIE = 0 'not required if ms and tick are bytes
If (ms - tick) > 20 Then '50 Then CHANGE<<<<<<<<<<<<<<<
tick = ms
For i = 0 To 7
Dir = servoDir(i)
Pos = servoPos(i)
If Dir = 1 Then
Pos = Pos + 40 'add 1/50th to the servo position
If Pos > 4000 Then 'same for other end
Pos = 4000
Dir = 0
Endif
Else
Pos = Pos - 40 'subtract it
If Pos < 2000 Then 'have we gone past the end?
Pos = 2000 'yes so make it the end stop
Dir = 1 'and turn it around
Endif
Endif
' update global data
servoDir(i) = Dir
INTCON.GIE = 0
servoPos(i) = Pos
INTCON.GIE = 1
Next i
Endif
'INTCON.GIE = 1 ' not required
'other code here.
Wend
'18F4431 32MHz XTL PCB9 REMOTE_SLAVE GPS_UART 040423 1700
Define CONFIG1L = 0x00
Define CONFIG1H = 0x06 '8mHz XTL x4 =32mHz
Define CONFIG2L = 0x0c
Define CONFIG2H = 0x20
Define CONFIG3L = 0x04
Define CONFIG3H = 0x80
Define CONFIG4L = 0x80 'Set for HVP
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40
Define CLOCK_FREQUENCY = 32
Define SINGLE_DECIMAL_PLACES = 2
Define STRING_MAX_LENGTH = 20
'Define SIMULATION_WAITMS_VALUE = 1 'Comment in for SIM out for PIC
Dim wordTemp As Word
Dim ServoCount As Byte
Dim i As Word
Dim ServoPos(8) As Word
Dim servoDir(8) As Byte
Dim frame As Word
Dim Buff(80) As Byte
Dim strCount As Byte
Dim rec As Byte
Dim isDone As Bit
Symbol rled = PORTD.7
OSCCON = %01110000 '& h70
TRISA = %11000000 '7=OSC, 6=OSC,
TRISC = %11110010 '6=1-slave4431_cs, 3=74HC164 MR, 2=74HC164 CLK, 0=74HC164 DATA'<<<<<<<<<<<<
TRISD = %00000000
LATC.0 = 0 'ensure data is low
LATC.2 = 0 'and clock
LATC.3 = 1 'Master reset HIGH for run.'<<<<<<<<<<<<<<
'Start up led
rled = 1
WaitMs 1000
rled = 0
WaitMs 1000
rled = 1
WaitMs 1000
rled = 0
WaitMs 1000
For i = 0 To 7
LATC.2 = 1 'send positive clock edge
ServoPos(i) = i * 250 + 2000 '1ms(2000) to 1.875(1 7/8ths - 3750)ms in 1/8th mS steps
LATC.2 = 0 'send negative edge
servoDir(i) = i And 1 '<<<<<<<added
Next i
'TRISC = %11111010 'CCP0 (RC2) & RC0 output'<<<<<<<<<<<<<<<<<<<<
ServoCount = 8 'cause it to reset
T1CON = %00100000 'prescaler = 4
T1CON.0 = 1 'start timer
CCP1CON = %1000 'will go high on interrupt - will start a 0.5mS pulse
frame = 1000 'start everything in 4000 cycles
strCount = 0
isDone = 0
'setup USART for 9600 baud receive
RCSTA = %10010000
TXSTA.BRGH = 1
BAUDCON.BRG16 = 1
SPBRG = 207
PIR1.RCIF = 0
PIE1.RCIE = 1
PIE1.CCP1IE = 1
INTCON.PEIE = 1
INTCON.GIE = 1
While 1
While ServoCount = 0 'wait for 20mS to pass (=1/50th of a second)
Wend
While ServoCount <> 0
Wend
For i = 0 To 7
INTCON.GIE = 0
If servoDir(i) = 1 Then
ServoPos(i) = ServoPos(i) + 40 'add 1/50th to the servo position
Else
ServoPos(i) = ServoPos(i) - 40 'subtract it
Endif
If ServoPos < 2000 Then 'have we gone past the end?
ServoPos(i) = 2000 'yes so make it the end stop
servoDir(i) = 1 'and turn it around
Endif
If ServoPos(i) > 4000 Then 'same for other end
ServoPos(i) = 4000
servoDir(i) = 0
Endif
INTCON.GIE = 1
Next i
'adjust servo positions here
Wend
End
On High Interrupt 'go via location 0x0008
Save System
If PIR1.CCP1IF Then 'has CCP1 triggered?
wordTemp.HB = CCPR1H 'get value of CCPR1 into wordTemp
wordTemp.LB = CCPR1L
If CCP1CON = 0x08 Then 'have we started the 1000 cycle pulse
CCP1CON = 0x09 'yes so end the pulse after 0.5mS
wordTemp = wordTemp + 1000 'adding 1000 will make pulse 0.5mS long
Else
LATC.0 = 0 'clear the data pin
CCP1CON = 0x08 'No so output the timed gap
If ServoCount < 8 Then
'still doing the servos so add remainder of time
wordTemp = wordTemp + ServoPos(ServoCount)
wordTemp = wordTemp - 1000 'knock of the 1000 (0.5mS) already elapsed
frame = frame - ServoPos(ServoCount)
ServoCount = ServoCount + 1
Else
'done all the servos so just the frame gap to do
wordTemp = wordTemp + frame
frame = 39000 '40,000(20mS) minus time of positive pulse(0.5mS)
ServoCount = 0 'start all over again
LATC.0 = 1 'will become first pulse
Endif
Endif
CCPR1H = wordTemp.HB 'put value back into CCPR1
CCPR1L = wordTemp.LB
PIR1.CCP1IF = 0 'clear interrupt flag
Endif
If PIR1.RCIF Then
rec = RCREG 'get the received character
If RCSTA.OERR Or RCSTA.FERR Then 'neither of these should ever occur.
RCSTA.CREN = 0 'this is kinda wishful thinking
If PIR1.RCIF Then
rec = RCREG
Endif
RCSTA.CREN = 1 'as any data received is corrupt
strCount = 0 'however, reset everything
isDone = 0 'and hope for the best
Else 'no errors so use the data
If strCount = 0 And isDone = 0 Then 'are we already receiving
'waiting for $ 'no so wait
If rec = "$" Then 'for $ to appear'<<<<<<<<<<<<<<<<<<<<<<<<
Buff(strCount) = rec 'start receiving
strCount = strCount + 1
Endif
Else
If isDone = 0 And strCount < 79 Then 'have we collected a full string?
Buff(strCount) = rec 'no so carry on storing
strCount = strCount + 1
If rec = "W" Then 'have we got the "endOfString" character'<<<<<<<<<<<<
isDone = 1 'yes, so set done true
'put break here
Endif
Else
If isDone = 0 Then '?????????<<<<<<<<<<<<<<<<<<<<<<<
'still waiting to start or buffer overflow
strCount = 0
Endif
Endif
Endif '<<<<<<<<<<<<<<<
Endif
Endif 'end RS232 if
Resume
If ServoPos < 2000 Then
Hi T,That's just flat out wrong. It needs to have the 'ServoPos(i)' to use the correct index.Code:If ServoPos < 2000 Then
As far as SAVE SYSTEM, I know that it's associated with interrupt context. I just don't know exactly what it saves in this language.
'18F4431 32MHz XTL PCB9 REMOTE_SLAVE GPS_UART 040423 1700
Define CONFIG1L = 0x00
Define CONFIG1H = 0x06 '8mHz XTL x4 =32mHz
Define CONFIG2L = 0x0c
Define CONFIG2H = 0x20
Define CONFIG3L = 0x04
Define CONFIG3H = 0x80
Define CONFIG4L = 0x80 'Set for HVP
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40
Define CLOCK_FREQUENCY = 32
Define SINGLE_DECIMAL_PLACES = 2
Define STRING_MAX_LENGTH = 20
'Define SIMULATION_WAITMS_VALUE = 1 'Comment in for SIM out for PIC
Dim wordTemp As Word
Dim ServoCount As Byte
Dim i As Word
Dim ServoPos(8) As Word
Dim servoDir(8) As Byte
Dim frame As Word
Dim Buff(80) As Byte
Dim strCount As Byte
Dim rec As Byte
Dim isDone As Bit
Dim pos as word
Dim dir as byte
Symbol rled = PORTD.7
OSCCON = %01110000 '& h70
TRISA = %11000000 '7=OSC, 6=OSC,
TRISC = %11110010 '6=1-slave4431_cs, 3=74HC164 MR, 2=74HC164 CLK, 0=74HC164 DATA'<<<<<<<<<<<<
TRISD = %00000000
LATC.0 = 0 'ensure data is low
LATC.2 = 0 'and clock
LATC.3 = 1 'Master reset HIGH for run.'<<<<<<<<<<<<<<
For i = 0 To 7
LATC.2 = 1 'send positive clock edge
ServoPos(i) = i * 250 + 2000 '1ms(2000) to 1.875(1 7/8ths - 3750)ms in 1/8th mS steps
LATC.2 = 0 'send negative edge
servoDir(i) = i And 1 '<<<<<<<added
Next i
'Start up led
rled = 1
WaitMs 1000
rled = 0
WaitMs 1000
rled = 1
WaitMs 1000
rled = 0
WaitMs 1000
'TRISC = %11111010 'CCP0 (RC2) & RC0 output'<<<<<<<<<<<<<<<<<<<<
ServoCount = 8 'cause it to reset
T1CON = %00100000 'prescaler = 4
T1CON.0 = 1 'start timer
CCP1CON = %1000 'will go high on interrupt - will start a 0.5mS pulse
frame = 1000 'start everything in 4000 cycles
strCount = 0
isDone = 0
'setup USART for 9600 baud receive
RCSTA = %10010000
TXSTA.BRGH = 1
BAUDCON.BRG16 = 1
SPBRG = 207
PIR1.RCIF = 0
PIE1.RCIE = 1
PIE1.CCP1IE = 1
INTCON.PEIE = 1
INTCON.GIE = 1
While 1
While ServoCount = 0 'wait for 20mS to pass (=1/50th of a second)
Wend
While ServoCount <> 0
Wend
For i = 0 To 7
dir=servoDir(i) 'doesn't matter if ISR happens as servoPos isn't changed by ISR
pos=servoPos(i)
If dir = 1 Then
pos = pos + 40 'add 1/50th to the servo position
Else
pos = pos - 40 'subtract it
Endif
If pos < 2000 Then 'have we gone past the end?
pos = 2000 'yes so make it the end stop
dir = 1 'and turn it around
Endif
If pos > 4000 Then 'same for other end
pos = 4000
dir = 0
Endif
INTCON.GIE = 0
servoPos(i)=pos
INTCON.GIE = 1
servoDir(i)=dir 'servoDir not used by ISR
Next i
Wend
End
On High Interrupt 'go via location 0x0008
Save System
If PIR1.CCP1IF Then 'has CCP1 triggered?
wordTemp.HB = CCPR1H 'get value of CCPR1 into wordTemp
wordTemp.LB = CCPR1L
If CCP1CON = 0x08 Then 'have we started the 1000 cycle pulse
CCP1CON = 0x09 'yes so end the pulse after 0.5mS
wordTemp = wordTemp + 1000 'adding 1000 will make pulse 0.5mS long
Else
LATC.0 = 0 'clear the data pin
CCP1CON = 0x08 'No so output the timed gap
If ServoCount < 8 Then
'still doing the servos so add remainder of time
wordTemp = wordTemp + ServoPos(ServoCount)
wordTemp = wordTemp - 1000 'knock of the 1000 (0.5mS) already elapsed
frame = frame - ServoPos(ServoCount)
ServoCount = ServoCount + 1
Else
'done all the servos so just the frame gap to do
wordTemp = wordTemp + frame
frame = 39000 '40,000(20mS) minus time of positive pulse(0.5mS)
ServoCount = 0 'start all over again
LATC.0 = 1 'will become first pulse (is data pin of shift register)
Endif
Endif
CCPR1H = wordTemp.HB 'put value back into CCPR1
CCPR1L = wordTemp.LB
PIR1.CCP1IF = 0 'clear interrupt flag
Endif
If PIR1.RCIF Then
rec = RCREG 'get the received character
If RCSTA.OERR Or RCSTA.FERR Then 'neither of these should ever occur.
RCSTA.CREN = 0 'this is kinda wishful thinking
If PIR1.RCIF Then
rec = RCREG
Endif
RCSTA.CREN = 1 'as any data received is corrupt
strCount = 0 'however, reset everything
isDone = 0 'and hope for the best
Else 'no errors so use the data
If strCount = 0 And isDone = 0 Then 'are we already receiving
'waiting for $ 'no so wait
If rec = "$" Then 'for $ to appear'<<<<<<<<<<<<<<<<<<<<<<<<
Buff(strCount)=rec 'start receiving
strCount = strCount + 1
Endif
Else
If isDone = 0 And strCount < 79 Then 'have we collected a full string?
Buff(strCount)=rec 'no so carry on storing
strCount = strCount + 1
If rec = "W" Then 'have we got the "endOfString" character'<<<<<<<<<<<<
isDone = 1 'yes, so set done true
'put break here
Endif
Else
If isDone = 0 Then '?????????<<<<<<<<<<<<<<<<<<<<<<<
'still waiting to start or buffer overflow
strCount = 0
Endif
Endif
Endif '<<<<<<<<<<<<<<<
Endif
Endif 'end RS232 if
Resume
Hi M,I've just noticed,
LATC.3 = 1 'Master reset HIGH for run.'<<<<<<<<<<<<<<
to reset the shift register.
However, I can't see where it is cleared again.
Mike.
Hi M and T,Here's a version with Tumbleweeds corrections and suggestion,
Code:'18F4431 32MHz XTL PCB9 REMOTE_SLAVE GPS_UART 040423 1700 Define CONFIG1L = 0x00 Define CONFIG1H = 0x06 '8mHz XTL x4 =32mHz Define CONFIG2L = 0x0c Define CONFIG2H = 0x20 Define CONFIG3L = 0x04 Define CONFIG3H = 0x80 Define CONFIG4L = 0x80 'Set for HVP Define CONFIG4H = 0x00 Define CONFIG5L = 0x0f Define CONFIG5H = 0xc0 Define CONFIG6L = 0x0f Define CONFIG6H = 0xe0 Define CONFIG7L = 0x0f Define CONFIG7H = 0x40 Define CLOCK_FREQUENCY = 32 Define SINGLE_DECIMAL_PLACES = 2 Define STRING_MAX_LENGTH = 20 'Define SIMULATION_WAITMS_VALUE = 1 'Comment in for SIM out for PIC Dim wordTemp As Word Dim ServoCount As Byte Dim i As Word Dim ServoPos(8) As Word Dim servoDir(8) As Byte Dim frame As Word Dim Buff(80) As Byte Dim strCount As Byte Dim rec As Byte Dim isDone As Bit Dim pos as word Dim dir as byte Symbol rled = PORTD.7 OSCCON = %01110000 '& h70 TRISA = %11000000 '7=OSC, 6=OSC, TRISC = %11110010 '6=1-slave4431_cs, 3=74HC164 MR, 2=74HC164 CLK, 0=74HC164 DATA'<<<<<<<<<<<< TRISD = %00000000 LATC.0 = 0 'ensure data is low LATC.2 = 0 'and clock LATC.3 = 1 'Master reset HIGH for run.'<<<<<<<<<<<<<< For i = 0 To 7 LATC.2 = 1 'send positive clock edge ServoPos(i) = i * 250 + 2000 '1ms(2000) to 1.875(1 7/8ths - 3750)ms in 1/8th mS steps LATC.2 = 0 'send negative edge servoDir(i) = i And 1 '<<<<<<<added Next i 'Start up led rled = 1 WaitMs 1000 rled = 0 WaitMs 1000 rled = 1 WaitMs 1000 rled = 0 WaitMs 1000 'TRISC = %11111010 'CCP0 (RC2) & RC0 output'<<<<<<<<<<<<<<<<<<<< ServoCount = 8 'cause it to reset T1CON = %00100000 'prescaler = 4 T1CON.0 = 1 'start timer CCP1CON = %1000 'will go high on interrupt - will start a 0.5mS pulse frame = 1000 'start everything in 4000 cycles strCount = 0 isDone = 0 'setup USART for 9600 baud receive RCSTA = %10010000 TXSTA.BRGH = 1 BAUDCON.BRG16 = 1 SPBRG = 207 PIR1.RCIF = 0 PIE1.RCIE = 1 PIE1.CCP1IE = 1 INTCON.PEIE = 1 INTCON.GIE = 1 While 1 While ServoCount = 0 'wait for 20mS to pass (=1/50th of a second) Wend While ServoCount <> 0 Wend For i = 0 To 7 dir=servoDir(i) 'doesn't matter if ISR happens as servoPos isn't changed by ISR pos=servoPos(i) If dir = 1 Then pos = pos + 40 'add 1/50th to the servo position Else pos = pos - 40 'subtract it Endif If pos < 2000 Then 'have we gone past the end? pos = 2000 'yes so make it the end stop dir = 1 'and turn it around Endif If pos > 4000 Then 'same for other end pos = 4000 dir = 0 Endif INTCON.GIE = 0 servoPos(i)=pos INTCON.GIE = 1 servoDir(i)=dir 'servoDir not used by ISR Next i Wend End On High Interrupt 'go via location 0x0008 Save System If PIR1.CCP1IF Then 'has CCP1 triggered? wordTemp.HB = CCPR1H 'get value of CCPR1 into wordTemp wordTemp.LB = CCPR1L If CCP1CON = 0x08 Then 'have we started the 1000 cycle pulse CCP1CON = 0x09 'yes so end the pulse after 0.5mS wordTemp = wordTemp + 1000 'adding 1000 will make pulse 0.5mS long Else LATC.0 = 0 'clear the data pin CCP1CON = 0x08 'No so output the timed gap If ServoCount < 8 Then 'still doing the servos so add remainder of time wordTemp = wordTemp + ServoPos(ServoCount) wordTemp = wordTemp - 1000 'knock of the 1000 (0.5mS) already elapsed frame = frame - ServoPos(ServoCount) ServoCount = ServoCount + 1 Else 'done all the servos so just the frame gap to do wordTemp = wordTemp + frame frame = 39000 '40,000(20mS) minus time of positive pulse(0.5mS) ServoCount = 0 'start all over again LATC.0 = 1 'will become first pulse (is data pin of shift register) Endif Endif CCPR1H = wordTemp.HB 'put value back into CCPR1 CCPR1L = wordTemp.LB PIR1.CCP1IF = 0 'clear interrupt flag Endif If PIR1.RCIF Then rec = RCREG 'get the received character If RCSTA.OERR Or RCSTA.FERR Then 'neither of these should ever occur. RCSTA.CREN = 0 'this is kinda wishful thinking If PIR1.RCIF Then rec = RCREG Endif RCSTA.CREN = 1 'as any data received is corrupt strCount = 0 'however, reset everything isDone = 0 'and hope for the best Else 'no errors so use the data If strCount = 0 And isDone = 0 Then 'are we already receiving 'waiting for $ 'no so wait If rec = "$" Then 'for $ to appear'<<<<<<<<<<<<<<<<<<<<<<<< Buff(strCount)=rec 'start receiving strCount = strCount + 1 Endif Else If isDone = 0 And strCount < 79 Then 'have we collected a full string? Buff(strCount)=rec 'no so carry on storing strCount = strCount + 1 If rec = "W" Then 'have we got the "endOfString" character'<<<<<<<<<<<< isDone = 1 'yes, so set done true 'put break here Endif Else If isDone = 0 Then '?????????<<<<<<<<<<<<<<<<<<<<<<< 'still waiting to start or buffer overflow strCount = 0 Endif Endif Endif '<<<<<<<<<<<<<<< Endif Endif 'end RS232 if Resume
Note, it doesn't use ms or wait as it uses the servo control to time 20mS.
I also moved the for...next loop above the LED code so the shift register is immediately cleared. Didn't want random outputs for 4 seconds.
Mike.
Hi M,Does that mean it's glitchless?
Mike.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?