Dave
Always wear safety glasses while programming.
If Dave's suggestion does not pan out, it could be a read-modify-write problem (which makes sense for RA5 to always work since it is the last pin you updated. Try this instead and let us know
If this works, you will need to be careful as this also updates RA6 and RA7. If it does work, however, there are workarounds to leave these two pins as they were found. Let us know.Code:B1 VAR BYTE TRISA = 0 loop: B1 = 0 GOSUB blueon pause 500 B1 = %00111111 gosub blueon pause 500 goto loop blueon: PORTA = B1 RETURN
Paul Borgmeier
Salt Lake City, UT
USA
__________________
Thank you Paul and Dave. I think the issue may be a combination of both problems.
I had not seen those posts by Melanie that you referenced, Dave. But tried to set PORTA to digital using various permutations of CMCON and ADCON1 and ANSEL--all to no avail. CMCON actually will not compile--have to use CMCON0. Suffice it to say that CMCON0 = 7 and ADCON1 = 7 seem to do nothing.
I'm too stupid to actually understand what is in the 16F916 spec sheet. It gives an assembly language example of how to set A to digital, but I cannot translate this into PicBasic code. So I'm still uncertain if I have tried this with PORTA in digital. Here's the asm code from the spec sheet.
BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTA ;Init PORTA
BSF STATUS,RP0 ;Bank 1
BCF STATUS,RP1 ;
MOVLW 07h ;Set RA<2:0> to
MOVWF CMCON0 ;digital I/O
CLF ANSEL ;Make all PORTA I/O
MOVLW F0h ;Set RA<7:4> as inputs
MOVWF TRISA ;and set RA<3:0>
; as outputs
BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
Can I just insert this as ASM in the PBP code?
Your code works, Paul, as I suspected it would given that PORTA = 255 would light everything up. So read-modify-write may be the issue. However, when I put a "Pause 10" after each of the pin commands, I still get good performance only on A.4 and A.5.
I would really like to be able to manipulate the pins independently, but if that is impossible, I think I can do a work-around by writing to the entire port.
Just got it to work with
CMCON0 = 7
ANSEL = 0
At the top. I must have messed something else up when I tried that before.
Thanks for getting me back in the saddle guys.
Translated:BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTA ;Init PORTA
BSF STATUS,RP0 ;Bank 1
BCF STATUS,RP1 ;
MOVLW 07h ;Set RA<2:0> to
MOVWF CMCON0 ;digital I/O
CLF ANSEL ;Make all PORTA I/O
MOVLW F0h ;Set RA<7:4> as inputs
MOVWF TRISA ;and set RA<3:0>
; as outputs
BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
PORTA = 0
CMCON0 = 7
ANSEL = 0 ; THE CLF on the ANSEL command you provide must be a typo - it should say CLRF
TRISA=240 ; or =$F0 or =%11110000
Adjust the TRISA the way you want it
If you still get only RA4 and 5 to work with the pause in between, then it is most likely NOT a R-M-W problem.
EDIT: Looks like you got it - nice work!
Last edited by paul borgmeier; - 19th October 2007 at 20:04. Reason: Update noted in body of reply
Paul Borgmeier
Salt Lake City, UT
USA
__________________
Bookmarks