Processor halts : Please help


Closed Thread
Results 1 to 13 of 13

Hybrid View

  1. #1
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by cwmaddy View Post
    Hello,

    Thanks for reply
    I agree with you in case of debugging firmware
    I have put serout statements in the program . Program jumpts to unknown place/starts printing serouts from another routine, when I repeatedly press the pickup-hangup switch. Otherwise execution is normal

    cwmaddy
    Do you have any sub routines that are called with goto and gosub? What I am thinking: you wrote subroutines with the expectation of return sending program back to the line after gosub, and if you send it with a goto it will run right past the return because there is no location in the stack to return to. Just a thought . . .
    If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
    .
    Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
    .
    There simply is no "Happy Spam" If you do it you will disappear from this forum.

  2. #2
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    cwmaddy,

    I think your biggest problems are in the Interrupts.

    1) You've only created 1 wsave variable. But there should be 1 for each bank of ram, usually at addresses $20,$A0,$120 and $1A0.

    The PIC cannot change banks before saving the W reg., because that would change W reg. So it has to be saved in whichever bank is currently selected when the interrupt occurs.

    Without the other wsave variables, the ISR will be saving and restoring the wrong values, and could be overwriting other variables that have nothing to do with the ISR.

    2) Even worse. You're using Basic language statements inside ASM type interrupts, which will corrupt PBP's system variables and can cause just about anything to happen, including jumping to routines that aren't supposed to be running. It also causes other variables to be overwritten with random values, which just causes more random actions.

    If you want to use Basic language statements in your ASM interrupts, the easiest way to do it is ...

    DT_INTS - Instant Interrupts
    http://www.darreltaylor.com/DT_INTS-14/intro.html

    hth,
    DT

  3. #3
    Join Date
    Jul 2009
    Posts
    10


    Did you find this post helpful? Yes | No

    Default

    Hello

    Thanks a lot for pointing out the wsave error. I had accidentally deleted it and had some other logic in my mind.Things are more clear now. The error is not appearing for the test points I ran. I still do not understand the problem that interrupts might cause by putting basic statements inside asm . PICBasic takes care of such scenarios isn't it? Some other codes which I have written with such structures work perfectly fine.

    Regards,
    cwmaddy

  4. #4
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by cwmaddy View Post
    I still do not understand the problem that interrupts might cause by putting basic statements inside asm . PICBasic takes care of such scenarios isn't it? Some other codes which I have written with such structures work perfectly fine.
    Then you've been lucky so far, because NO, PicBasic does NOT take care of such scenarios. That's why there's ON INTERRUPT, which allows basic language statements in an interrupt routine. Unfortunately, it also imposes severe limitations on how the interrupts are handled.

    With ASM interrupts, you can get away with basic variable assignments like detTone = 0, or simple addition and subtraction timer1_ofcnt = timer1_ofcnt +1. But anything more complex like ... if timer0 > 240 then timer0 = 1, will need to use PBP's system variables which is a BIG No-No. Essentially, any command that places it's code in the "Library" will have this problem. Most definitely SEROUT will not work, and using those serouts in the ISR for debugging will cause new problems of their own, so you won't be seeing the problems you are trying to debug. And then in the getdtmf routine you've got a FOR loop, an ARRAY operation, and a lot of stuff that's commented out with multiple math terms and shifts and and ...<hr>

    PBP sets aside several RAM locations with the variables R0 thru R8, some RR? RM? and T? variables. Most of them are listed in the PBPPIC14.RAM file in your PBP folder.

    When a command starts, it copies any parameters to the system variables and calls the library routine to actually accomplish the task. As that command continues to run, those variables will be used to count loops, keeps track of time or different states as needed.

    If an interrupt happens, it stops that command in the middle and jumps to the ISR. If in the ISR you now run a basic language statement that uses the library, it will copy it's parameters to the system variables in preparation to run the library routine, which overwrites everything that the command that was interrupted was using. The interrupt itself will work fine. But once it returns from the interrupt, the command that was previously running has no idea where it left off. And since the system variables now have data that was not even meant for that type of command, many different errors are possible, wrong answers, lock-ups, resets, invalid branches.

    With DT_INTS that I pointed to previously, it saves the state of PBP's system variables, runs the ISR, then restores the system variables before returning from the ISR. This allows basic language statements to be used in ASM interrupts without corrupting PBP's normal flow.
    <br>
    DT

  5. #5
    Join Date
    Jul 2009
    Posts
    10


    Did you find this post helpful? Yes | No

    Default

    After reading this explaination, I feel if code that does not use PBP library is placed inside interrupt should work fine isnt it?
    Eg statements line freqout, sound, pause, serouts will cause problems
    but simple math/ array operations should work . Am I right?
    If the code which is placed as BASIC code inside interrupt is getting modified at very selected locations in the program and we make sure the variable accesses are mutually exclusive then also it should not pose any problem.

    If i dont want to use wsave1,2,3 , if I store wsave register in access location eg $70 , that should solve the purpose am I right?

    I found the thread explaining about banks on the forum which saya the following thing-

    "When a particular bank is selected with the RP0 and RP1 bits in the STATUS register, any opcode trying to access that bank is limited to 128 bytes. So, $20, $A0, $120 and $1A0 all point to a location that is 32 bytes into their respective BANK. The Variable declarations wsave1-3 are set that way to reserve the same locations in each bank.

    That way you don't need to worry which bank you are in. The "MOVWF W_TEMP" always puts the byte in the correct location, no matter which bank is selected."

    If my program is in bank1 and interrupt fires, my registers get stored in bank1.If my interrupt lies in different bank it just jumps to the bank (long jumps) and returns with long jump. It picks up wsave from that bank
    If we give different offset of wsave1 and wsave, this interrupt handling should produce incorrect results. Am I right?

    Thanks and regards,
    cwmaddy

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts