and:
should be replaced with:Code:IF txbyte.bit0 = 1 THEN PORTB.1 = 1 ELSE PORTB.1 = 0 ENDIF
While still in BASIC.Code:PORTB.1 = txbyte.bit0
and:
should be replaced with:Code:IF txbyte.bit0 = 1 THEN PORTB.1 = 1 ELSE PORTB.1 = 0 ENDIF
While still in BASIC.Code:PORTB.1 = txbyte.bit0
IT MAY NOT BE WORTH THE EFFORT ,tried this on a 12f683
90 words
98 words for arts versionCode:#CONFIG __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_ON & _CP_OFF #ENDCONFIG DEFINE OSC 8 'LETS PBP KNOW WE WILL BE RUNNING AT 8MHZ 'PIN DEFENITIONS ' 'GP3 'GP4 USED FOR TRIGGER INPUT 'GP5 USED FOR LED 'SET UP THE REGISTERS OSCCON = %01110001 '8MHZ INTERNAL CLOCK USED CMCON0 = %00000111 'CIN PINS ARE I/O, COUT PIN IS I/O TRISIO = %00111011 ' GP2 OUTPUT THE REST ARE INPUTS ANSEL = 0 'NO ANALOG PORTS - ALL DIGITAL WPU = %00010000 'GP4 WEAK PULL UP ENABLED. DEFINE DEBUG_REG GPIO DEFINE DEBUG_BIT 2 DEFINE DEBUG_BAUD 9600 DEFINE DEBUG_MODE 0 ' LATB.7=1 'PBP software serial out 8N1 delay var word ' set baud rate delay txbyte var byte ' byte to send bcount var byte ' counter serpin var gpio.2 delay = 100 ' set serial delay here 9600 main: txbyte = "H" GOSUB serialout txbyte = "E" GOSUB serialout txbyte = "L" GOSUB serialout txbyte = "L" GOSUB serialout txbyte = "O" GOSUB serialout txbyte = $20 ' space GOSUB serialout goto main serialout: Debug txbyte RETURN
Code:#CONFIG __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_ON & _CP_OFF #ENDCONFIG DEFINE OSC 8 'LETS PBP KNOW WE WILL BE RUNNING AT 8MHZ 'PIN DEFENITIONS ' 'GP3 'GP4 USED FOR TRIGGER INPUT 'GP5 USED FOR LED 'SET UP THE REGISTERS OSCCON = %01110001 '8MHZ INTERNAL CLOCK USED CMCON0 = %00000111 'CIN PINS ARE I/O, COUT PIN IS I/O TRISIO = %00111011 ' GP2 OUTPUT THE REST ARE INPUTS ANSEL = 0 'NO ANALOG PORTS - ALL DIGITAL WPU = %00010000 'GP4 WEAK PULL UP ENABLED. 'PBP software serial out 8N1 delay var word ' set baud rate delay txbyte var byte ' byte to send bcount var byte ' counter serpin var gpio.2 delay = 100 ' set serial delay here 9600 main: txbyte = "H" GOSUB serialout txbyte = "E" GOSUB serialout txbyte = "L" GOSUB serialout txbyte = "L" GOSUB serialout txbyte = "O" GOSUB serialout txbyte = $20 ' space GOSUB serialout goto main serialout: ' start bit serpin = 0 ' tx clear PAUSEUS delay ' start bit delay ' send byte FOR bcount = 0 TO 7 serpin=txbyte.0 txbyte = txbyte >> 1 PAUSEUS delay ' data bit delay NEXT serpin= 1 PAUSEUS delay ' stop bit delay RETURN
Warning I'm not a teacher
Nice
If it could be matched in space, I’d still prefer to see my own code, just that I’ve never had a reason to do it until now.
It would be less in asm though, and I still think I could top it.
It was worth the effort to do with a dsPic where the pin was not mappable to UART, so incidentally tried with PBP as well.
No BASIC For/Next loop, instead I’d count down to zero.
No shift command, instead an asm rotate to ensure only 1 instruction,
My own delay routine, which is conveniently right before a return, so can be called multiple times.
watchdog timer resets also have to be turned off because PBP won’t put them in it’s own routines, but in YOUR code.
To my disadvantage, there needs to be some value stored in Delay, which would claim some more space.
Something like this (untested).. and I can’t remember if PBP labels need the underscore or not.
Code:count var byte pdelay var byte serialout: @ movlw ,8 @ movwf _count ,F @ clrf PORTB ,1 @ call pausedelay sendbyte: PORTB.1 = txbyte.bit0 @ rrf txbyte ,F @ call pausedelay @ decfsz _count goto sendbyte @ bsf PORTB ,1 pausedelay: @ movlw ,210 @ movwf _pdelay ,F zpausedelay: decfsz _pdelay @ goto zpausedelay @ return
Last edited by Art; - 21st November 2016 at 05:52.
asm version 52 words
Code:#CONFIG __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_ON & _CP_OFF #ENDCONFIG DEFINE OSC 8 'LETS PBP KNOW WE WILL BE RUNNING AT 8MHZ 'PIN DEFENITIONS ' 'GP3 'GP4 USED FOR TRIGGER INPUT 'GP5 USED FOR LED 'SET UP THE REGISTERS OSCCON = %01110001 '8MHZ INTERNAL CLOCK USED CMCON0 = %00000111 'CIN PINS ARE I/O, COUT PIN IS I/O TRISIO = %00111010 ' GP2 OUTPUT THE REST ARE INPUTS ANSEL = 0 'NO ANALOG PORTS - ALL DIGITAL WPU = %00010000 'GP4 WEAK PULL UP ENABLED. ' DEFINE DEBUG_REG GPIO ' DEFINE DEBUG_BIT 2 ' DEFINE DEBUG_BAUD 9600 ' DEFINE DEBUG_MODE 0 '' LATB.7=1 'PBP software serial out 8N1 delay var byte bank0 ' set baud rate delay txbyte var byte bank0' byte to send bcount var byte bank0' counter serpin var gpio.0 ; set serial delay for 9600b main: txbyte = "H" GOSUB serialout txbyte = "E" GOSUB serialout txbyte = "L" GOSUB serialout txbyte = "L" GOSUB serialout txbyte = "O" GOSUB serialout txbyte = $20 ' space GOSUB serialout goto main serialout: asm movlw 8 movwf _bcount bcf GPIO ,0 call pausedelay sendbyte btfss _txbyte ,0 goto snd0 bsf GPIO ,0 goto sndd snd0 bcf GPIO ,0 sndd rrf _txbyte ,F call pausedelay decfsz _bcount ,F goto sendbyte bsf GPIO ,0 pausedelay movlw 67 movwf _delay zpausedelay decfsz _delay ,F goto zpausedelay return endasm
Warning I'm not a teacher
printout from pickit2
Warning I'm not a teacher
Thanks for running itThat’s getting worthwhile then. Using Pauseus in the first post would have added code to it.
I might as well have a shot at the serial input over the next few days then.
Basically I did this on dspic in C, and it wrote easily into PBP as well.
The pic at the receive end is supposed to be 16F628A in PBP/asm.
My mp3 player serial spits out the artist & title info from the ID tags as tracks are skipped (that much is working).
Then the 16F628A is supposed to receive the serial, and transmit IR to an electronic sign the same way a user would normally use a remote to reprogram the scrolling message![]()
This time going for serial input of a string terminated with either 0x00 or 0x0D (or any value below 0x20 really) into an array.
So far one byte, and untested, but I do have a PBP program on 16F628A ready to test and use it when done.
It’s on the receive side where I want serene replaced because I can keep going with my own data until the program memory is full.
Code:rxbyte var byte count var byte delay var byte shortdelay var byte delay = 100 ‘ actual serial timing shortdelay = 50 ‘ time/2 serinbyte: IF PORTB.1 = 1 THEN ‘ optional countdown to timeout here GOTO serinbyte ENDIF pauseus delay pauses shortdelay FOR count = 0 TO 7 rxbyte.bit7 = PORTB.1 rxbyte = rxbyte >> 1 pauseus delay NEXT count pauses shortdelay rxbyte = rxbyte ^ $FF return
Bookmarks