Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Input doesn't work in PIC controller.

  1. May 26, 2013 #1
    Hi everyone,

    In the past I learned very good things about electronics and PIC controller in this forum. After that I have decided to design a circuit with a PIC micro-controller and simulated it in Proteus. However it doesn't work. Could you have a look and tell me what I am missing?

    The circuit scheme is that:

    Circuit.png

    My code is below:

    Code (Text):
    #include <pic.h>
    #include <delay.c>
    #include <stdio.h>
    #define magnet RA0

    int main(void)
    {
        char n=1;
        unsigned int i;
        unsigned char birth[]={
            0x84, 0x84, 0xFD, 0x84, 0x84, 0x00,
            0x01, 0x02, 0xFC, 0x02, 0x01, 0x00,
            0x84, 0x84, 0xFD, 0x84, 0x84, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0xFF, 0x18, 0x24, 0x42, 0x81, 0x00,
            0x84, 0x84, 0xFD, 0x84, 0x84, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0xFF, 0x81, 0x81, 0x42, 0x3C, 0x00,
            0x7E, 0x81, 0x81, 0x81, 0x7E, 0x00,
            0x79, 0x85, 0xA5, 0xA5, 0x69, 0x00,
            0xFF, 0x81, 0x81, 0x42, 0x3C, 0x00,
            0x7F, 0x80, 0x80, 0x80, 0x7F, 0x00,
            0xFF, 0x06, 0x18, 0x60, 0xFF, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            };
        unsigned char name[]={
            0x01, 0x02, 0xFC, 0x02, 0x01, 0x00,
            0x81, 0x81, 0xFF, 0x81, 0x81, 0x00,
            0xFF, 0x80, 0x80, 0x80, 0x80, 0x80,
            0xFF, 0x81, 0x81, 0x42, 0x3C, 0x00,
            0x81, 0x81, 0xFF, 0x81, 0x81, 0x00,
            0xC1, 0xA1, 0x99, 0x85, 0x83, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            };
           
            TRISA=0x01; TRISB=0;
            PORTA=0; PORTB=0;
            for(;;){
                while(n){
                    if(magnet==1){
                        for(i=0;i<112;i++){
                            PORTB=birth[i];
                            DelayMs(1000);
                            }
                    n=0;
                        }
                    }

            n=1;
                while(n){
                    if(magnet==1){
                        for(i=0;i<56;i++){
                            PORTB=name[i];
                            DelayMs(1000);
                            }
                    n=0;
                        }
                    }
            n=1;
            }
            }
     
    I want to get output when I close the switch which gives input to RA0. If I delete this condition from my codes the circuit works. However I couldn't do this with an input. Could you explain me what is happening?

    Edit: The input pin show as (WHI) Weak High Input. However the LEDs seems as (WLO) Weak Low Output.

    Edit 2: When I use D pins instead of A pins it works perfect. However if you can explain why it doesn't work with A pins I will be happy to read.
     
    Last edited: May 26, 2013
  2. jcsd
  3. May 27, 2013 #2
    You need to set the ADCON1 register to

    adc.h: #define ADC_0ANA_0REF 0b00000111 // ALL DIGITAL I/O (0/0)

    to shut off the analog->digital converters so you can use digital I/O.
    (Actually, look ADCON1 up in the spec sheet to verify the bit settings,
    I get confused by their attempt to make ORmasks work like ANDmasks
    and vice versa...)

    I believe, at least on the 18F2455 that I use, this will preclude using any ADCs
    so you might want to select a higher A-bit as your input just in case.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Input doesn't work in PIC controller.
Loading...