mcki0127@hotmail.com wrote:> Yes, I also clear all the ports before writing to the TRIS registers. > SteveSteve, I'm not trying to second-guess you but, is clearing the ports the correct thing to do? In my own circuits, I usually have low-true scan signals. When I do, I set those port bits to a 1. HTH, Noel
pic16f77 acting goofy
Started by ●December 16, 2004
Reply by ●December 17, 20042004-12-17
Reply by ●December 17, 20042004-12-17
My program is written in assembler and I've tried to be careful about writing to the correct banks. I do however get several messages like this one: Message[302] C:\PIC PROJECTS\QUIZ.ASM 34 : Register in operand not in bank 0. Ensure that bank bits are correct. This is referring to me writing to the OPTION_REG which is in bank1. bank1 movlw b'10000111' movwf OPTION_REG ; intitialize interrupts bank1 macro bsf STATUS, RP0 bcf STATUS, RP1 endm So, I think I'm writing to the banks correctly.
Reply by ●December 17, 20042004-12-17
Noel, Do you mean that your inputs are active low? Mine are active high. I have 1K pull-down resistors from each pin to ground. Steve
Reply by ●December 17, 20042004-12-17
On 17 Dec 2004 10:13:14 -0800, the renowned mcki0127@hotmail.com wrote:>My program is written in assembler and I've tried to be careful about >writing to the correct banks. I do however get several messages like >this one: > >Message[302] C:\PIC PROJECTS\QUIZ.ASM 34 : Register in operand not in >bank 0. Ensure that bank bits are correct. > >This is referring to me writing to the OPTION_REG which is in bank1. > >bank1 >movlw b'10000111' >movwf OPTION_REG ; intitialize interrupts > > >bank1 macro >bsf STATUS, RP0 >bcf STATUS, RP1 >endm > >So, I think I'm writing to the banks correctly.And you switch back to bank 0 after that in every case? Best regards, Spehro Pefhany -- "it's the network..." "The Journey is the reward" speff@interlog.com Info for manufacturers: http://www.trexon.com Embedded software/hardware/analog Info for designers: http://www.speff.com
Reply by ●December 17, 20042004-12-17
Yes I do, and I just stepped through the program again while monitoring the STATUS bits. After initializations, the bank bits stay in bank0 for the remainder of the program.
Reply by ●December 17, 20042004-12-17
mcki0127@hotmail.com wrote:> Noel, > > Do you mean that your inputs are active low? Mine are active high. I > have 1K pull-down resistors from each pin to ground. > > SteveBoth the outputs, because I scan key matricies, and the inputs are active-low. This is done for noise immunity and habit from two decades of design with TTL-level circuit. Since mine are active-low, I initialize the device with high (negated) outputs. Your technique will work fine. I hope you didn't think I was being remedial. Noel
Reply by ●December 17, 20042004-12-17
mcki0127@hotmail.com wrote:> I will try to make this question as short as possible. I'm making a > "quiz box" that displays the first two of any 20 players that buzz in. > I'm using a pic16f77. The program scans 20 ports (buttons) and > displays the first two numbers (1-20) on four single digit 7-segment > LED displays via a display driver. Also, a speaker buzzes after the > first player has buzzed in. Everything works great except for this one > "little" bug. > > When I first turn on the power, the displays get set to zero's and the > program starts scanning the buttons. If I first push a button in the > teens (10-19) the first digit is always wrong. For example, in stead > of displaying 12, it displays 32 or 72. Next I push a button (1-9) and > it displays correctly. If I reset the program and push the same > buttons in the same order, the problem occurs again. However, if I > reset the program and first push a button (1-9), then push a button > (10-20), it displays correctly and every time thereafter until the > power switch is toggled off then on again. > > The same thing happens when I turn the power on and first press a > button (1-9) then a button (10-19) - it displays incorrectly until I > reverse the order. I push one (10-19) then one (1-9) and everything > works fine. > > So, everytime I want to use it, I have to "intialize" it to get past > the bug before it will work right. This problem is very perplexing. > The program debugs fine. There is absolutely no reason for the mc to > be spitting out these goofy numbers. Does anyone have any idea, > hardware or software, what could be causing this problem? I hope this > wasn't too confusing. Thanks in advance. > > SteveAfter re-reading your description, and in light of the rest of the thread, it looks like your scanning and port initialization are correct. Perhaps there is an uninitialized variable in the routine that converts the scanned key to a displayed value. You mentioned that if you press, say, key 19, you see key 39 or key 79. in binary: 19: 0001 1001 39: 0011 1001 79: 0111 1001 Since I have not seen your conversion routines I cannot be sure but it looks like a register used for the most-significant digit is not being initialized. Noel
Reply by ●December 17, 20042004-12-17
Noel, Remedial is fine with me. I'm open to improvement and I in no wise consider myself an expert (competent? :=) )at any of this. Now that I look back over my program I can see that I don't initialize dig1a or dig1b (I've changed things around a lot while troubleshooting). My thinking there was that those registers get rewritten anyway before being used to send data to the display. Here is my conversion routine: ___movf flag1,0 ___movwf temp ; move flag1 to temp for safe keeping ___movlw .10 ; store 10 in W ___subwf temp,0 ; subtract 10 (W) from temp (flag1) ___btfsc STATUS,C ; check if flag1<10 ___goto aGreater10 ; no (C=0) ___movf flag1,0 ; yes (C=1), move flag1 to W ___movwf dig1b ; we have dig1b ___clrf dig1a ; we have dig1a (0) ___goto Output1 aGreater10 ___btfsc flag1,4 ; check if flag1=20 (10100) ___btfss flag1,2 ___goto aNot20 ___movlw .2 ___movwf dig1a ; we have dig1a (2) ___clrf dig1b ; we have dig1b (0) ___goto Output1 aNot20 ___movf flag1,0 ___movwf temp ; move flag1 to temp for safe keeping ___movlw .10 ; store 10 in W ___subwf temp,0 ; subtract 10 (W) from temp ___movwf dig1b ; we have dig1b ___bsf dig1a,0 ; we have dig1a (1) Output1 " sends data to the display " Since I only have 20 buttons, the only possibilities for dig1a is either 0, 1, or 2 - not 3, 5, 7, or "F" like I'm getting. How (generally) can I read or write to RAM in order to check the initializations like some of the earlier posts were referring to? Steve
Reply by ●December 17, 20042004-12-17
mcki0127@hotmail.com wrote:> Noel, > > Remedial is fine with me. I'm open to improvement and I in no wise > consider myself an expert (competent? :=) )at any of this. > > Now that I look back over my program I can see that I don't initialize > dig1a or dig1b (I've changed things around a lot while > troubleshooting). My thinking there was that those registers get > rewritten anyway before being used to send data to the display. Here > is my conversion routine: > > > ___movf flag1,0 > ___movwf temp ; move flag1 to temp for safe keeping > ___movlw .10 ; store 10 in W > ___subwf temp,0 ; subtract 10 (W) from temp (flag1) > ___btfsc STATUS,C ; check if flag1<10 > ___goto aGreater10 ; no (C=0) > ___movf flag1,0 ; yes (C=1), move flag1 to W > ___movwf dig1b ; we have dig1b > ___clrf dig1a ; we have dig1a (0) > ___goto Output1 > aGreater10 > ___btfsc flag1,4 ; check if flag1=20 (10100) > ___btfss flag1,2 > ___goto aNot20 > ___movlw .2 > ___movwf dig1a ; we have dig1a (2) > ___clrf dig1b ; we have dig1b (0) > ___goto Output1 > aNot20 > ___movf flag1,0 > ___movwf temp ; move flag1 to temp for safe keeping > ___movlw .10 ; store 10 in W > ___subwf temp,0 ; subtract 10 (W) from temp > ___movwf dig1b ; we have dig1b > ___bsf dig1a,0 ; we have dig1a (1) > Output1 > " > sends data to the display > " > > Since I only have 20 buttons, the only possibilities for dig1a is > either 0, 1, or 2 - not 3, 5, 7, or "F" like I'm getting. How > (generally) can I read or write to RAM in order to check the > initializations like some of the earlier posts were referring to? > Steveclearing dig1a in initialization may help. You may also want to change: bsf dig1a,0 to: movlw 0x01 movwf dig1a I don't see dig1a being in the case of a key in the 10-19 range. Just an educated guess, Noel
Reply by ●December 17, 20042004-12-17
Dear Steve, mcki0127@hotmail.com schrieb:> ___movf flag1,0 > ___movwf temp ; move flag1 to temp for safe keeping > ___movlw .10 ; store 10 in W > ___subwf temp,0 ; subtract 10 (W) from temp (flag1) > ___btfsc STATUS,C ; check if flag1<10 > ___goto aGreater10 ; no (C=0) > ___movf flag1,0 ; yes (C=1), move flag1 to W > ___movwf dig1b ; we have dig1b > ___clrf dig1a ; we have dig1a (0) > ___goto Output1 > aGreater10 > ___btfsc flag1,4 ; check if flag1=20 (10100) > ___btfss flag1,2^^^^^^ NEVER do this. Two btfsc/gtfss in a row are no good idea! HTH Wolfgang -- From-address is Spam trap Use: wolfgang (dot) mahringer (at) sbg (dot) at