Hi Amgen,
I don't recall why I included a PPL in my oscillator comment but, I believe that I have my OSCON statement correct for an internal 4 MHz cock. Right?
OSCCON = %01100000 ' Set system internal clock 4MHz.
Thank you for pointing that out!
Hi Amgen,
I don't recall why I included a PPL in my oscillator comment but, I believe that I have my OSCON statement correct for an internal 4 MHz cock. Right?
OSCCON = %01100000 ' Set system internal clock 4MHz.
Thank you for pointing that out!
looks right now, ...... first post was unsure for OSCCON..... no wait !!!!! check for ... $01100001, bit 0, system clock ,,, but looks like you had it right UNLESS the configuration setting didn't set properly, so can use this one which calls for system to use int osc...... good fkin luck if all that fails
Last edited by amgen; - 19th April 2024 at 01:58.
This is a photo of the packet (8N1) generated by my PIC transmitter and that for some reason is not being received by my PIC receiver port GPIO.5. It's a two byte transmission $A and $61. Its in "true" format with idling level at +5VDC (Mark condition).
SERIN is not recognizing it... Why?
works perfectly for me if you don't try to use qualifier before you actually set it to a meaningful value as rocket troy indicated
Code:#CONFIG; set CONFIG1 for internal oscillator, watchdog on, MCLR pin as OFF __config _WDTE_ON & _MCLRE_OFF & _INTOSCIO & _PWRTE_ON #ENDCONFIG OSCCON = % 01100000 ' Set system clock 4MHz DEFINE OSC 4 ' PBP timing to 4MHz system clock OPTION_REG.7 = 0 ' Enable Weak Pullups Control WPU = % 00100000 ' Disable all Weak Pullups except GPIO.5 ANSEL = 0 ' No analog inputs TRISIO = % 00111001 ' Make GP1, GP2 outputs. GP0, GP3, GP4 & GP5 = inputs CMCON0 = % 00000111 ' Turn off comparators IDByte var byte ' Receiver ID. IDByteRx var byte ' New IDByte Z1Alarm var GPIO.2 ' Zone1 Alarm LED Z2Alarm var GPIO.1 ' Zone2 Alarm LED ProgIDRx var byte ' Received Programmer ID PrgIn var GPIO.5 ' Programmer Detect & Data Port ProgIDRx = $d ' define qualifier gpio=0 '''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''' MainLoop: Serin PrgIn,1,[ProgIDRx],IDByteRx ' Wait for new I.D. to arrive GOSUB UpdateID ' Verify arrival and execute UpdateID Subroutine GOTO MainLoop UpdateID: Z1Alarm = 1 : Z2Alarm = 1 ' LEDs to Confirm programing Subroutine PAUSE 500 Z1Alarm = 0 : Z2Alarm = 0 ' Turn off LEDs PAUSE 1000 Z1Alarm = 1 : Z2Alarm = 1 ' LEDs to Confirm in programing mode PAUSE 1000 Z1Alarm = 0 : Z2Alarm = 0 ' Turn off LEDs IDByte = IDByteRx 'Write 1, IDByte ' Write new ID to EEPROM RETURN ENd
Last edited by richard; - 19th April 2024 at 02:29.
Warning I'm not a teacher
Hi Richard,
Thank you and appreciate for your input.
The function of this program is to allow the reprogramming of the Receiver's ID.
The program is structured to provide a five second period of time upon power up of the Receiver to allow the attachment of a PIC based programmer (My design) to reprogram the ID of the respective receiver before the programs "MainLoop" begins.
I added your modifications and still couldn't get it to work. BTW, why the GPIO=0? Does that clear all GPIO ports, I presume?
Below is the modified code.
************************************************** *****************
********************** Receiver Code *********************************
************************************************** *****************
#CONFIG
__config _WDTE_ON & _MCLRE_OFF & _INTOSCIO & _PWRTE_ON
#ENDCONFIG
OSCCON = %01100000 ' Set system internal clock 4MHz
DEFINE OSC 4 ' Calibrate PBP timing to 4MHz system clock
OPTION_REG =% 00000000 ' Enable Weak Pullups Control
WPU =% 00100000 ' Disable all Weak Pullups except on GPio.5
ANSEL = %000000 ' No analog inputs
TRISIO = %111001 ' Make GP1, GP2 outputs. GP0, GP3, GP4 & GP5 = inputs
CMCON0 =%000111 ' Turn off comparators
ADCON0 = 0 ' Turn off A/D
AlarmByte var Byte ' Received Alarm
AlarmVal var byte ' Alarm Zone(s)
RxIn var GPIO.0 ' Incoming Packet Port
Z1Alarm var GPIO.2 ' Zone1 Alarm LED
Z2Alarm var GPIO.1 ' Zone2 Alarm LED
ByteSum var Byte ' IDByte & AlarmByte Sum Value
ChkSum var byte ' ChkSum value to test
ProgID var byte ' Programmer Present Verify
PrgIn var GPIO.5 ' Programmer Detect & Data Port
IDByte var byte ' Receiver ID.
IDByteRx var byte ' New IDByte
ProgIDRx var byte ' Received Programmer ID
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Pause 500 ' Pause for Register initialization
ProgIDRx = $D ' Define qualifier
GPIO=0
Z2Alarm = 1 'Confirm in programing mode
Serin PrgIn,1,5000,MainLoop,[ProgIDRx],IDByteRx ' Check for new I.D.
if ProgIDRx = $A then ' Match Programmer ID
IDByte = IDByteRx
Write 1, IDByte
Z1Alarm = 1 : Z2Alarm = 1 ' Confirm programing Subroutine
pause 500
Z1Alarm = 0 : Z2Alarm = 0
pause 1000
Z1Alarm = 1 : Z2Alarm = 1 'Confirm in programing mode
pause 1000
Z1Alarm = 0 : Z2Alarm = 0
endif
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; START ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MainLoop:
I suspect that I may have a protocol issue in that my packet isn't in proper form for SERIN? Below is a JPG of my oscilloscope screen showing the packet received from the Programmer (Transmitter).
Thank you for your help!
you misunderstand how the qualifier works
this can not work as you set the qualifier to 0x0d as per my example , ProgIDRx will always be 0x0d
untill you change it , serin will never change it
if ProgIDRx = $A then ' Match Programmer ID ;;// will always fail
this time out loop is pointless in this example as serin with [a qualifier ] will always block until the input qualifier is received
Serin PrgIn,1,5000,MainLoop,[ProgIDRx],IDByteRx ' Check for new I.D.
this will do the same thing
MainLoop:
Serin PrgIn,1,[ProgIDRx],IDByteRx ' Check for new I.D.
IDByte = IDByteRx
Write 1, IDByte
Z1Alarm = 1 : Z2Alarm = 1 ' Confirm programing Subroutine
pause 500
Z1Alarm = 0 : Z2Alarm = 0
pause 1000
Z1Alarm = 1 : Z2Alarm = 1 'Confirm in programing mode
pause 1000
Z1Alarm = 0 : Z2Alarm = 0
endif
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; START ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
goto MainLoop
note i used 0x0d AS a qualifier as its easer to use than 0x0a in proteus simulatorI added your modifications and still couldn't get it to work.
u need to either change it back to 0x0a or alter the tx code to match
BTW, why the GPIO=0? Does that clear all GPIO ports, I presume
yes because at power up the alarm leds could be in any random state if you don't
Last edited by richard; - 19th April 2024 at 05:12.
Warning I'm not a teacher
Maybe all you want then is just:
Serin PrgIn,1,5000,MainLoop, ProgIDRx
?
Troy
Hi Troy,
You were right on in assuming that I misunderstood how the Qualifier works. With your help, now I do!
I've modified the program accordingly and now it works perfectly!
Thank you for taking your valuable time to assist me!
Thanks to all who responded to my post. This is a great website and support forum!
Bookmarks