​ ​ ​ ​ dirsC mystery
Results 1 to 8 of 8

Thread: dirsC mystery

  1. #1
    New Member
    Join Date
    Jan 2014
    Location
    Surrey
    Posts
    18

    Default dirsC mystery

    I am baffled ...

    The following is a very much cut-down version of a multi-slot program on a 28x2, where the LED combinations indicate which slot is active. For some reason, the yellow LED (on pin C.1) never lights when the real program runs. The code below lights all three LEDs, but when the "let dirsC" is executed, the yellow one goes out. The print of the status of C.0 - C.2 shows 111 before the dirsC and 101 afterwards. The simulator shows 111 both times (which is what I would expect). Any thoughts?

    Roger

    Code:
    #picaxe 28x2
    #no_table
    #no_data
    
    symbol LC_RED 	= C.0
    symbol LC_YELLOW = C.1
    symbol LC_BLUE = C.2
    
    pause 1000
    
    high LC_RED
    high LC_YELLOW
    high LC_BLUE
    
    pause 1000
    
    sertxd(#pinC.0,#pinc.1,#pinC.2,CR,LF)
    
    let dirsC = %11100111
    
    pause 2000
    
    sertxd(#pinC.0,#pinc.1,#pinC.2)
    
    end

  2. #2
    Senior Member
    Join Date
    Feb 2009
    Location
    Cheshire, England
    Posts
    2,486
    Blog Entries
    4

    Default

    Are you sure C.1 is wired correctly ?

    Try writing a simple code to turn each LED on/off individually, like :

    high lc_red
    pause 1000
    low lc_red
    pause 1000
    high lc_yellow
    pause 1000
    etc ...

    Cheers,

    Buzby

  3. #3
    New Member
    Join Date
    Jan 2014
    Location
    Surrey
    Posts
    18

    Default

    Absolutely sure. For a start, the yellow one comes on at the beginning of the program, and only goes off when the dirsC statement is executed. However, I have done as you suggested and ...

    the first set of high/low lights each LED in turn. After the dirsC, red and blue light up in their correct turn, but yellow does not.

  4. #4
    Senior Member
    Join Date
    Feb 2009
    Location
    Cheshire, England
    Posts
    2,486
    Blog Entries
    4

    Default

    Hi Roger,

    I've run your code exactly as written, on a real 28X2, and all three LEDs stay lit.

    My suspicion is still some difference in the wiring of C.1 compared to the others.

    Why exactly do you need the 'dirs' instruction ?. It's unusual to need to alter the direction registers.

    Cheers,

    Buzby

    EDIT : What result do you get if you change the dirs to let dirsC = %00000111 ?
    Last edited by Buzby; 01-07-2018 at 18:35.

  5. #5
    New Member
    Join Date
    Jan 2014
    Location
    Surrey
    Posts
    18

    Default

    Thanks, Buzby for giving me the clue. There was a tiny sliver of uncut copper between C.6 and C.1. Now working as intended.

    Roger

  6. #6
    Senior Member
    Join Date
    Feb 2009
    Location
    Cheshire, England
    Posts
    2,486
    Blog Entries
    4

    Default

    Glad you got it working !.

    I was heading in that direction when I suggested removing the three upper bits from the dirsC instruction.

    With those bits set pins C.7, C.6, and C.5 would change to outputs when dirs executed, thus putting '0's out where before they were inputs.

    The '0' from C.6 would then short circuit the '1' from C.1, so the LED would not light.

    Connecting '0' and '1' pins like this usually leads to a dead pin due to overcurrent, but PICAXE chips are quite hardy and can survive abuse like this, as long as it's only for a short time.

    It is worth checking that C.6 is still working properly.

    Cheers,

    Buzby

  7. #7
    New Member
    Join Date
    Jan 2014
    Location
    Surrey
    Posts
    18

    Default

    Hi Bizby,

    Following your suggestion, I have checked C.6 and it still appears to be working. I'm rather surprised, because I would have had C.1 on for a long time while I was trying to find the fault. As it happens, C.6 is "reserved for future use", so the short had no impact on the rest of the program.

    As far as using the dirsC instruction is concerned ...
    I am nearly always short of code space in my projects, and a dirsX instruction uses less space than three or more "output" instructions. I do realise that "high" and "low" instructions make a pin into an output, but some of my code is of the form "pinX.n = xxx" and so would need an "output" as well. It may only be a byte or two, but every little counts.

    Roger

  8. #8
    Senior Member
    Join Date
    Feb 2012
    Location
    London
    Posts
    2,882

    Default

    Hi,

    Quote Originally Posted by Aries View Post
    C.6 .. still appears to be working. I'm rather surprised, because I would have had C.1 on [low] for a long time
    I'm not surprised for the case of two output pins shorted together, because the pullup (P-channel) FETs are not particularly "strong", so you'd be very unlucky for a "damaging" current to flow. It might be a different story if the pin were shorted directly to the supply rail (and driven low). The more recent data sheets from Microchip for the M2 base PICs show the I/V characteristics of the output devices at 5, 3 and 1.8 volts, in graphs towards the end of section 31. The 1.8 volt curves might give you quite a fright if you believe that "a PICaxe pin will supply 20 mA".

    But I am surprised that it's "necessary" to use the DIRs command to save program memory space. However, there are a few "greedy" commands such as BINTOASCII, PWMDUTY and READINTERNALTEMP (if anybody ever bothers to use it) where the use of a subroutine can reduce the program size considerably.

    Cheers, Alan.

Bookmarks

Posting Permissions

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