Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[PIC18][C]Problem z pinami RB6 i RB7 na PIC18F4550

pr0cj0n 26 Gru 2009 14:58 1800 12
  • #1 26 Gru 2009 14:58
    pr0cj0n
    Poziom 9  

    Witam wszystkich. Wprawdzie nie jestem tu nowym użytkownikiem, ale jest to mój pierwszy post na forum.
    Natrafiłem na pewien problem, z którym nie potrafię sobie poradzić. Mianowicie nie mogę wymusić, aby piny RB6 (PGC) i RB7(PGD) działały jako normalne piny IO. Niby ustawiam konfigurację zgodnie z not katalogową, a mimo to nie potrafię sprawić, by cały port B działał jako cyfrowe wyjście...
    Oto mój kod:

    Code:

    #include <htc.h>
    #include <pic18.h>

    __CONFIG(1, HS);
    __CONFIG(2, BORDIS & WDTDIS & PWRTDIS);
    __CONFIG(4, DEBUGDIS & LVPDIS & ICPORTDIS);
    __CONFIG(5, UNPROTECT);

    /* zegar 8 Mhz */
    #define FOSC 8000000L

    /* funkcja opóźniająca */
    #define   delay_us(x) { unsigned char us; \
                us = (x)/(12000000/FOSC)|1; \
                while(--us != 0) continue; }

    void delay_ms(unsigned int ms)
    {
       if (ms <= 0)
          return;

       unsigned char i;
       do
       {
          i = 4;
          do {
             delay_us(164);
          } while(--i);
       } while(--ms);
    }

    void init(void)
    {
       PORTB = 0x00;
       LATB = 0x00;
       
       TRISB=0x00;

       /* RA0 wej analodoge RA1 wej cyfrowe
          napięcie odniesienia - Vref- = Vss, Vref+ = Vdd */
       ADCON1 = 0x0E; /* 0b00001110 */
       ADCON0 = 0x00; /* 0b00000000 */
       ADCON2 = 0xB9; /* 0b10111001 */
       ADCON0 |= 0x01; /* 0b00000001 - włączenie konwersji A/D */
    }

    void main(void)
    {
       unsigned char chSign,chEye,iType;
       unsigned int iDelay;

       
       chSign = 1;
       iType = 0;
       chEye = 0x01;

       init();

       for (;;)
       {
          /* rozpocznij konwersję */
          GODONE = 1;

          /* wait for A/D conversion to complete */
          while (GODONE)
             continue;

          iDelay=ADRESL; /* pobierz 8 najmłodszych bitów wyniku */
                   iDelay += (ADRESH << 8); /* 8 starszych */





          if (RA1 == 0)
             iType = ~iType;

          if (iType == 0)
          {
             PORTB = ~chEye;
             
             if (chSign)
             {
                
                chEye = chEye << 1;
                if (chEye >= 0x80)
                   chSign = 0;
             }
             else
             {
                chEye = chEye >> 1;
                if (chEye <= 0x01)
                   chSign = 1;
             }

             delay_ms(iDelay);
          }
          else
          {
             PORTB = 0x00;
             delay_ms(iDelay);
             PORTB = 0xff;
             delay_ms(iDelay);
          }         
       }
    }


    No i niby wszystko fajnie, ale zapalają mi się tylko diody podłączone do pinów RB0-RB5. Dodam tylko, że korzystam z MPLAB'a (kompilator firmy Hi-Tech), kod kompiluje jako release, a mój układ, na którym pracuję to rozwojówka Propox'a - EVBeasyPIC.

    Czy ktoś jest mi w stanie wytłumaczyć, co robię źle?

    Ps. Diody na pewno nie są spalone :P

    0 12
  • #2 26 Gru 2009 22:05
    UDMA
    Poziom 16  

    Nie wiem co może być przyczyną ale zawsze lepiej używać rej. LATx zamiast PORTx gdy port uC pracuje jako wyjście.

    0
  • #3 26 Gru 2009 23:51
    pr0cj0n
    Poziom 9  

    No ale to rzeczywiście nie jest przyczyną. Już o tym pomyślałem. :)

    0
  • #4 27 Gru 2009 16:13
    adamwesola
    Poziom 24  

    Daj hexa, zobacze u siebie.

    0
  • #5 27 Gru 2009 23:36
    czmi3l
    Poziom 13  

    wierzę, że te 2 instrukcje rozwiążą problem :-)

    Code:

       ADCON1 = 0x0F;         // PORT RA jako GPIO, wylaczylem analog input
       CMCON  = 0x07;         // wylaczam komparatory

    0
  • #6 28 Gru 2009 00:35
    kowales
    Poziom 12  

    czmi3l napisał:
    wierzę, że te 2 instrukcje rozwiążą problem :-)

    Code:

       ADCON1 = 0x0F;         // PORT RA jako GPIO, wylaczylem analog input
       CMCON  = 0x07;         // wylaczam komparatory


    Te dwie instrukcje nie rozwiążą problemu bo piny RB6 i RB7 nie mają możliwości ustawienia jako wejście analogowe lub komparatora (patrz nota katalogowa).

    => pr0cj0n
    pr0cj0n napisał:
    Code:
    __CONFIG(4, DEBUGDIS & LVPDIS & ICPORTDIS); 


    Jeżeli ta instrukcja włącza Ci debuggowanie to to może być twój problem, bo według noty katalogowej debugger korzysta z tych dwóch pinów (tak jak i programator).

    Pozdrawiam

    0
  • #7 28 Gru 2009 10:31
    pr0cj0n
    Poziom 9  

    @adamwesola: HEX w załączniku, konfiguracja - pod port B podpięte diody, zapalane "jedynką", pod RA1 przycisk, pod RA0 potencjometr.

    @kowales: no ale jeśli ja czyszczę ustawienia konfiguracyjne i programuję układ właśnie taką konfiguracją, która (według noty katalogowej) powinna wyłączyć debugg'owanie, to co jest nie tak? uC padł?

    0
  • #8 28 Gru 2009 13:28
    michalko12
    Specjalista - Mikrokontrolery

    Sprawdź rejestr CONFIG4L, bity DEBUG i ICPRT.

    Czy przypadkiem nie powinno byc tak?

    Code:
    __CONFIG(4, DEBUGDIS & LVPDIS ); 

    0
  • #9 28 Gru 2009 16:46
    pr0cj0n
    Poziom 9  

    No dałem tak:

    Code:
    __CONFIG(4, DEBUGDIS & LVPDIS & ICPORTDIS); 

    I nic, ale bez flagi ICPORTDIS też nic nie daje... :)

    0
  • #10 28 Gru 2009 19:45
    michalko12
    Specjalista - Mikrokontrolery

    A jesteś pewien że programator faktycznie programuje te rejestry?

    0
  • #11 28 Gru 2009 20:32
    pr0cj0n
    Poziom 9  

    Tak, bo reaguje na LVPEN.

    0
  • Pomocny post
    #12 28 Gru 2009 22:30
    adamwesola
    Poziom 24  

    Na symulacji program działa prawidłowo , zmienia prędkość zapalania diód w zależności od napięcia na RA0, port B zainicjowany prawidłowo - wyjście cyfrowe, debug wyłączony, spróbuj zwiększyć wartość rezystorów w szereg z diodami, możliwe że obciążenie na tyle go blokuje że nie może zmienić stanu (miałem kiedyś takie zjawisko w 16F676).
    Lub zmierz czy działają bez obciążenia

    0
  • #13 30 Gru 2009 23:13
    pr0cj0n
    Poziom 9  

    Natchnąłeś mnie na to, by sprawdzić napięcia i takim sposobem doszedłem, że miałem przerwę w ścieżkach łączących piny uC z goldpinami na płycie, w celu ewentualnego wlutowania oporników 4k7, nie wiedzieć po co. Nawet to na schemacie jest zaznaczone, jak się potem przyjrzałem. :D Troszkę gapiostwa wyszło. Dziękuję wszystkim, którzy starali mi się pomóc i wybaczcie, że kazałem Wam się mierzyć z błędem nie do wykrycia poprzez kod ;)

    0