Searching \ for '=?Iso-8859-1?Q?[PIC]:_Please_help_!,_retfie_fast_d' in subject line. ()
Make payments with PayPal - it's fast, free and secure! Help us get a faster server
FAQ page: www.piclist.com/techref/microchip/devices.htm?key=pic
Search entire site for: 'Please help !, retfie fast d'.

Truncated match.
PICList Thread
'=?Iso-8859-1?Q?[PIC]:_Please_help_!,_retfie_fast_d'
2001\02\21@045555 by o-8859-1?Q?K=FCbek_Tony?=

flavicon
face
Hi,
unravelled an very odd 'bug' that I really can't figure
out, please anyone with 18x experience take a few minutes to read below.

Here's the source:

; charaters in string to lcd in menutext ram
; now get the two consecutive bytes for type and option data
TBLRD*+ ; read and increment pointer
MOVFF   TABLAT,MenuType ; save menu type
TBLRD*+ ; read next and increment pointer
MOVFF   TABLAT,MenuOption ; save menu type option
TBLRD*+ ; prepare next byte ( into tablat )and increment pointer
; now we jump into specific handler for type
MOVF    MenuType,W,B
TABLE_JUMP_GTO  MENU_TYPE_TABLE
MENU_TYPE_TABLE
GOTO    MENU_IS_MAIN    ; 0
GOTO    MENU_IS_SUB     ; 1
GOTO    MENU_IS_LINK    ; 2
GOTO    MENU_IS_OPTION  ; 3
GOTO    MENU_IS_LINKED  ; 4

It's an snippet for a menu system, where in this case the program
should route to an type-specific handler. The table_jump_gto
is an macro with an dedicated ram-byte for calculating table jumps
( it works , but I've enclosed it at the bottom anyway ).
Now what happens is that, prior ending up here an i2c tx is
initiated ( isr based ) and it just so happens that the first i2c irq
is triggered *excately* after the line 'MOVF    MenuType,W,B'.
And it seems that w-reg is then trashed, even if using
fast register stack and no priorities on irq's.

This is repetable, so it was fairly easy to trace what happens here.
Here's a cutout from the trace:
( sorry about the line breaks/spacing, don't know what to do with them )
I've added my comment in between marked with '*'.

*Ok here the tablat is prepared for loading menutype
0F5C    0009            TBLRD *+        ---     --      0B1     00
00000000        00017985AA
0F5E    CFF5            MOVFF 0x1EA     ---     --      ---     --
00000000        00017985AB

*'random' table data
1AB6    0300            (Table Read)    ---     --      ---     --
00000000        00017985AC
1AB6    0300            MULWF 0x0,banked        ---     --      ---     --
00000000        00017985AD
1AB6    0300            MULWF 0x0,banked        ---     --      ---     --
00000000        00017985AE
1AB6    0300            MULWF 0x0,banked        AD_Flags        00      ---
--      00000000 00017985AF

*load menutype with data 0x03 !!!!!!!!!
0F60    F092            (nop) tablat,0x92       FF5     03      ---     --
00000000        00017985B0

0F62    0009            TBLRD *+        ---     --      MenuType        03
00000000        00017985B1
0F64    CFF5            MOVFF 0x1EA     ---     --      ---     --
00000000        00017985B2

*table access 'random' data.
1AB8    0101            (Table Read)    ---     --      ---     --
00000000        00017985B3
1AB8    0101            MOVLB 0x1       ---     --      ---     --
00000000        00017985B4
1AB8    0101            (Forced NOP)    COM_Flags       00      ---     --
0000000000017985B5
1AB8    0101            MOVLB 0x1       ---     --      ---     --
00000000        00017985B6

* load menuoption with 0x01
0F66    F093            (nop) tablat,0x93       FF5     01      ---     --
00000000        00017985B7

*prepare tablat for eventual use of menutype dependant handler
0F68    0009            TBLRD *+        ---     --      MenuOption      01
00000000        00017985B8

****
********** Load back Menutype into w wreg ************ ( i.e. 0x03 )
****
0F6A    5192            MOVF 0x92,W,banked      ---     --      ---     --
00000000        00017985B9

*'random' table data
1AB8    0101            (Table Read)    ---     --      ---     --
00000000        00017985BA
1AB8    0101            MOVLB 0x1       ---     --      ---     --
00000000        00017985BB
1AB8    0101            MOVLB 0x1       ---     --      ---     --
00000000        00017985BC
1AB8    0101            (Forced NOP)    RX_Buffer_Count 00      ---     --
00000000        00017985BD

* isr fires.............
0F6C    6E09            (Forced NOP)    ---     --      ---     --
00000000        00017985BE
0F6C    6E09            (Forced NOP)    ---     --      ---     --
00000000        00017985BF
*I'm a bit curoius though, why there are two NOP's above ?

0008    EF16            GOTO INT_ENTRY  ---     --      ---     --
00000000        00017985C0
000A    F000            (Forced NOP)    ---     --      ---     --
00000000        00017985C1
002C    50FA    INT_ENTRY       MOVF pclath,W   ---     --      ---     --
00000000        00017985C2

* now we should have 0x03 in w ( the same as in menutype )
* I don't specifically store/restore w reg but rely on the use of
* fast register stack
* now follows the end of the isr

0134    6EFA            MOVWF pclath    Saved_Pclath    12       W      12
00000000        000179861E
*retife fast !!!! should restore w
0136    0011            RETFIE fast     ---     --      FFA     12
00000000        000179861F
0138    6E02            (Forced NOP)    ---     --      ---     --
00000000        0001798620
*****
* ARGHHHHH!!!! w is now 0x00 ?????????????????????
*****
0F6C    6E09            MOVWF 0x9       ---     --      ---     --
00000000        0001798621
0F6E    4609            RLNCF 0x9       ---     --      Table_Temp      00
00000000        0001798622
0F70    4609            RLNCF 0x9       Table_Temp      00      Table_Temp
00      00000000        0001798623
0F72    0E0F            MOVLW 0xF       Table_Temp      00      Table_Temp
00      00000000        0001798624
0F74    B009            BTFSC 0x9,0x0   ---     --       W      0F
00000000        0001798625
0F76    0F01            (Forced NOP)    Table_Temp      00      ---     --
00000000        0001798626
0F78    B209            BTFSC 0x9,0x1   ---     --      ---     --
00000000        0001798627
0F7A    0F02            (Forced NOP)    Table_Temp      00      ---     --
00000000        0001798628

Please anyone, I know it much to ask as it is a bit to chew on but i really
don't know
why the problem occurs. I have no other problems with any interuppts at any
other time
and I'm running 2 external, internal uart, internal i2c master etc.


Here's the generated code:

0F5C  0009          TBLRD *+                            
0F5E  CFF5          MOVFF 0x1EA                          
0F60  F092          (nop) 0xFF5,0x92                    
0F62  0009          TBLRD *+                            
0F64  CFF5          MOVFF 0x1EA                          
0F66  F093          (nop) 0xFF5,0x93                    
0F68  0009          TBLRD *+                            
0F6A  5192          MOVF 0x92,W,banked                  
* isr fires here, and does not restore w ????????????????
* even thought retfie fast is used
0F6C  6E09          MOVWF 0x9                            
0F6E  4609          RLNCF 0x9                            
0F70  4609          RLNCF 0x9                            
0F72  0E0F          MOVLW 0xF                            
0F74  B009          BTFSC 0x9,0x0                        
0F76  0F01          ADDLW 0x1                            
0F78  B209          BTFSC 0x9,0x1                        
0F7A  0F02          ADDLW 0x2                            
0F7C  6EFA          MOVWF 0xFFA                          
0F7E  0EFC          MOVLW 0xFC                          
0F80  1609          ANDWF 0x9                            
0F82  0E8C          MOVLW 0x8C                          
0F84  2409          ADDWF 0x9,W                          
0F86  B0D8          BTFSC 0xFD8,0x0                      
0F88  2AFA          INCF 0xFFA                          
0F8A  6EF9          MOVWF 0xFF9                          
0F8C  EFD2  MENU_T  GOTO 0x1A4                          
0F8E  F007          (nop) MENU_IS_MAIN                  
0F90  EFE7          GOTO 0x1CE                          
0F92  F007          (nop) MENU_IS_SUB                    
0F94  EFFE          GOTO 0x1FC                          
0F96  F007          (nop) MENU_IS_LINK                  
0F98  EF15          GOTO 0x2A                            
0F9A  F008          (nop) MENU_IS_OPTION                
0F9C  EFF5          GOTO 0x1EA                          
0F9E  F008          (nop) MENU_IS_LINKED                

Heres the table jump macro:
( and no it really works :) albeit a bit messy ).

;+++++
;       TABLE_JUMP_GTO Calculates an eventual table boundary crossing  
;       set's up the PCLATH register correctly
;       Offset must be in w-reg, offset 0 jumps to the next instr.
,       Maximum offset is 62 note *UNCHECKED*
;       To be used OUTSIDE isr ONLY, modofied for 18x series and a table
with gotos
;       i.e. the number in w is quadrupled.
;
TABLE_JUMP_GTO  MACRO   TableStart
       MOVWF   Table_Temp,A    ; save wanted offset
       RLNCF   Table_Temp,F,A  ; multiply with 2 ( for 18x pic's ) ( bit 7
into bit 0 )
       RLNCF   Table_Temp,F,A  ; multiply with 2 again ( for 18x pic's ) (
bit 6 into bit 0, bit 0 into bit 1 )
       MOVLW   HIGH(TableStart); get high adress for table ( first adress
after macro )
       BTFSC   Table_Temp,0,A  ; lowest bit set means add one
       ADDLW   0x01            
       BTFSC   Table_Temp,1,A  ; second bit set means add two
       ADDLW   0x02    
       MOVWF   PCLATH,A        ; set high adress
       MOVLW   b'11111100'     ; mask out lowest two bits
       ANDWF   Table_Temp,F,A  
       MOVLW   LOW(TableStart) ; get low adress ( of first instr. after
macro )
       ADDWF   Table_Temp,W,A  ; add offset
       BTFSC   STATUS,C        ; page crossed ? ( 256 byte )
       INCF    PCLATH,F,A      ; yes add one to high adress
       MOVWF   PCL,A           ; And jump
       ENDM


PLEASE ...

/Tony



Tony Kübek, Flintab AB            
²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²
E-mail: spam_OUTtony.kubekTakeThisOuTspamflintab.com
²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²

--
http://www.piclist.com hint: PICList Posts must start with ONE topic:
[PIC]:,[SX]:,[AVR]: ->uP ONLY! [EE]:,[OT]: ->Other [BUY]:,[AD]: ->Ads


More... (looser matching)
- Last day of these posts
- In 2001 , 2002 only
- Today
- New search...