Shop OBEX P1 Docs P2 Docs Learn Events
WAITPEQ Madness -- RESOLVED — Parallax Forums

WAITPEQ Madness -- RESOLVED

localrogerlocalroger Posts: 3,452
edited 2009-06-20 19:53 in Propeller 1
SOLUTION -- typical Prop gotcha, I have a jmp l1 that should be jmp #l1.· The bizzarro thing is that it worked at all like that.
----

OK, this has me scratching my head.· I am trying to use my demoboard to profile the signal that a portable DVD player uses to drive its LCD.· (If I get the end project working it will show up here, and I think some folks will find it very useful.)· The signal "reverses" every scan line so, to make a long story short, it never spends more than about 63 milliseconds at logic 1 and for frame sync reeasons about 126 msec at logic 0.· The signal is only 0.9V p-p so I made a voltage divider with a 1K and 2K resistor and connected the DVD player ground to the center point, and I've verified with a scope meter that w/r/t demoboard ground the signal is swinging from about 1 to 2 volts, straddling the center threshold of the input.· I am operating both the DVD player and the other DVD player I'm using to monitor results on battery so there are no ground loop issues.

My basic questions are things like "exactly how long is a line pulse" and "how many lines are there in a frame."· The scope meter doesn't quite give me what I need, but the prop should let me get the answers to the microsecond -- except that it's not working.

Voila la code:
CON
   _clkmode  = xtal1 + pll16x
   _xinfreq  = 5_000_000
  video     = 12
 
OBJ
     text  : "tv_text"                   ' Parallax 13-line Video
VAR
  long maxc
 
PUB mainProgram  | r, i 
  text.start(video)
  cognew(@entry,@maxc)
  repeat
    text.hex(maxc,8)
    text.out(32)
    text.hex(ina[noparse][[/noparse]7],1)
    text.out(13)
    repeat 100000
 
DAT
entry                   
l1                      mov     thisval, ina
                        and     thisval, pmask wz
              if_nz     jmp     #l1 
                        mov     pval, cnt
 
l2                      mov     thisval, ina 
                        and     thisval, pmask wz
              if_z      jmp     #l2
  
                        mov     thisval, cnt
                        sub     pval, thisval
                        neg     pval, pval
 
                        cmp     pval, thrval wc
              if_c      jmp     l1
              
                        wrlong  pval, par
                        jmp     #entry
                        
thisval                 long    0
pmask                   long    $80
pval                    long    0
pclr                    long    0
thrval                  long    $2700

 

This works, but of course is only accurate to about 8-10 clock cycles.· I'm basically just looking for "the last pulse longer than thrval."· The repeat 100000 statement just slows down the results so I can read a representative sample.· Note that in spin I'm also outputting the raw pin so I can verify that it's toggling.·

With waitpeq I should be able to get it down to 1-2 clock cycles, right?· This also works:

l1                      mov     thisval, ina
                        and     thisval, pmask wz
              if_nz     jmp     #l1 
                        mov     pval, cnt
 
                        waitpeq pmask, pmask
  
                        mov     thisval, cnt
                        sub     pval, thisval
                        neg     pval, pval


So far so good.· This also works:

l1                      mov     thisval, ina
                        and     thisval, pmask wz
              if_nz     jmp     #l1 
                        mov     pval, cnt
 
                        waitpne pclr, pmask
  
                        mov     thisval, cnt


But ALL of the following lock the Prop up as soon as the signal is applied, whether they are followed by the second coded loop or the waitpeq that works if l1 is coded:

l1
                        waitpeq pclr, pmask 
                        mov     pval, cnt

l1
                        waitpne pclr, pmask 
                        mov     pval, cnt

l1
                        waitpeq pmask, pmask 
                        mov     pval, cnt

l1
                        waitpne pmask, pmask 
                        mov     pval, cnt

Note that by lock up, I mean it locks up the OTHER COG that is generating video.· If I download the program with the signal disconnected, the program starts and displays zeroes -- until I clip the test lead to the input pin, and the screen goes black.

I have tried alternate input pins, running everything on battery, and disconnecting all other peripherals.· I've tried coding to return max instead of greater than thrval.· I cannot for the life of me figure out why this doesn't work, and especially how changing from the coded loop to a waitpeq which should do exactly the same thing as the coded loop·manages to lock up the other cog that shouldn't have anything to do with the cog running the pasm profiler.

Any idears?

Post Edited (localroger) : 6/20/2009 6:58:40 PM GMT

Comments

  • Phil Pilgrim (PhiPi)Phil Pilgrim (PhiPi) Posts: 23,514
    edited 2009-06-20 18:36
    Could you show us a complete listing of a program that locks up, please? I've found, in instances such as this, that the problem often has nothing to do with the snippets of code that are offered as trouble spots.

    -Phil
  • localrogerlocalroger Posts: 3,452
    edited 2009-06-20 18:49
    @Phil -- in this case it's just as simple as it looks.
    CON
       _clkmode  = xtal1 + pll16x
       _xinfreq  = 5_000_000
      video     = 12
     
    OBJ
         text  : "tv_text"                   ' Parallax 13-line Video
    VAR
      long maxc
     
    PUB mainProgram  | r, i 
      text.start(video)
      cognew(@entry,@maxc)
      repeat
        text.hex(maxc,8)
        text.out(32)
        text.hex(ina[noparse][[/noparse]7],1)
        text.out(13)
        repeat 100000
     
    DAT
    entry                   
    l1
                            waitpeq pclr, pmask 
                            mov     pval, cnt
      
    l2                      mov     thisval, ina 
                            and     thisval, pmask wz
                  if_z      jmp     #l2
      
                            mov     thisval, cnt
                            sub     pval, thisval
                            neg     pval, pval
     
                            cmp     pval, thrval wc
                  if_c      jmp     l1
                  
                            wrlong  pval, par
                            jmp     #entry
                            
    thisval                 long    0
    pmask                   long    $80
    pval                    long    0
    pclr                    long    0
    thrval                  long    $2700
    

    This version should work exactly the same as the first "working" version above, but it displays zeroes until the input pin goes logic 1, at which point the screen goes black.

    EDIT -- and resolved.· there's a jmp l1 in there that should be jmp #l1.· Odd that the other version works with this error.

    Post Edited (localroger) : 6/20/2009 6:57:40 PM GMT
  • MagIO2MagIO2 Posts: 2,243
    edited 2009-06-20 19:14
    Not to surprising.

    JMP l1 reads the content of COG RAM adress $0 and finds mov thisval, ina
    INA is somwhere around $1f?, so in the end we have JMP $1f?.
    As you don't use the counters and stuff the 'code' there will be NOPs and the program counter turns around comeing back to l1.

    JMP l1 in the waitxx case takes pmask as adress, which is $080. What to find there is very likely something comeing from the tv_text ... maybe some SPIN code which accidently contains the cogstop-command or a write to HUB-RAM to a place that confuses the TV-driver.
  • localrogerlocalroger Posts: 3,452
    edited 2009-06-20 19:53
    @MagIO2 -- the cognew command copies 2Kbytes whether you need them or not, most of which will be what follows my DAT module in hub RAM -- and that would indeed be the TVTEXT object. No doubt that is how the jump to nowhere manages to fiddle with something that messes up the other instance of TVTEXT. Talk about unexpected behavior, though LOL.
Sign In or Register to comment.