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

Napięcia na pinach. Dlaczego różnią się w C i Bascomie?

29 Lip 2006 14:26 1460 16
  • Poziom 9  
    Witam. Dalczego napiecia na pinach są rózne dla programu w C i Bascoma:

    - dla c H -> 3.68V

    #include <avr\io.h>


    int main(void)
    {
    //konfig portu
    PORTA=0xAA;
    DDRA=0xFF;

    while(1);

    return 0;
    }





    - dla Bascoma H -> 5V

    $regfile "m8535.dat"
    $crystal = 8000000

    config porta = output
    porta = &b10101010
    end


    Uklad to atmega8535, opisywane piny pozostaja nie podlaczone, zasilanie 5V
  • Tektronix
  • Poziom 22  
    Bo w sumie nie wiadomo co kompilator rozumie pod tymi rozkazami. Dopiero deasemblacja kodu ukaże co faktycznie jest wykonane. Nie wiesz dokładnie co oznacza output w Bascomie.
  • Poziom 29  
    hm, może to szczegół ale w C najpierw robisz porta=... a potem ddra natomiast w basicu na odwrót - najpierw zrobiłeś ddra a potem porta... :P
  • Pomocny post
    VIP Zasłużony dla elektroda
    To nie w bascomie tkwi problem, tylko w kompilatorze C, według symulatora na wyjściu powinien być stan wysoki, czyli 5V, wygląda to tak jakby port był w stanie wysokiej impedancji. Sprawdź częstotliwość na tym pinie, bo podejżewam że procesor nie wchodzi prawidłowo w pętle i się resetuje co chwile, najlepiej byłoby to zrobić na oscyloskopie, ale częstotliwościomierz od biedy wystarczy, może to watchdog?
  • Poziom 21  
    Nie mam pod ręką żadnego atmega ale z tego co pamiętam 3,68V wystarczy żeby uC rozpoznał san wysoki!
  • Tektronix
  • Specjalista techniki cyfrowej
    Jeżeli piszesz w avr-gcc (i używasz standardowego Makefile z tego pakietu), to wrzuć tu plik .lss ze swojego projektu, w tym pliku jest kod w asm.
    Podejrzewam optymalizację, prawdopodobnie to co wpisałeś zostało przez optymalizację usunięte z kodu, bo nie robi nic pożytecznego, ale może się mylę. spróbuj kompilacji z opcją -O0 ("O zero").
  • Poziom 12  
    Ja jeszcze bym się zastanawiał nad kolejnością..
    DDRA=0xFF;
    PORTA=0xAA;
    Ale nie mam jak teraz tego sprawdzić. W sumie logiczne, że najpierw ustalamy kierunek portu, później jego wartość..
  • Pomocny post
    Poziom 22  
    Jeśli to rzeczywiście watchdog, to może spróbuj dodać to:
    Code:

    ...
    while(1)
    asm volatile ("WDR"::);
    ...
  • Poziom 15  
    Dzieje się tak dlatego że najpierw załączyłeś w trakcie gdy piny były wejściami stan wysoki, czyli tak naprawdę włączyłeś rezystor podciągający. Następnie przełączyłeś piny na wyjścia ale na nich nadal nie ma żadnego konkretnego stanu - pullupy chodzą i prawdopodobnie stan jest low.

    2 rozwiązania:

    1:
    DDRA=0xFF;
    PORTA=0xAA;

    2:
    PORTA=0xAA;
    DDRA=0xFF;
    PORTA=0xAA;

    W pierwszym przypadku ustawisz stan wysoki, w drugim włączysz rezystory podciągające do + a następnie włączysz stan wysoki. Efekt na mierniku powinien być taki sam :)
  • Poziom 12  
    Spóźniony zapłon :D Patrz 2 posty wcześniej, tak jak pisałem - najpierw przez DDRn ustalasz kierunek.. pózniej wartość. PORTn rzeczywiście wprowadza pull-up jeśli port jest wejściem a w przypadku, gdy nie piszesz na początku DDRn = 0xFF, DDR inicjowane jest jako 0x00. Pisząc później PORTn = 0xAA, niektóre piny stają się zródłem prądu. Podłączasz np. LEDa przez rezystor do masy i delikatnie będzie świecić. Sekcja "Configuring the pin" w dokumentacji.
  • Poziom 39  
    Procekk napisał:
    Spóźniony zapłon :D Patrz 2 posty wcześniej, tak jak pisałem - najpierw przez DDR ustalasz kierunek.. pózniej wartość.

    I obaj nie macie racji :( Kolejność zapisu rejestrów DDRx i PORTx , nie ma w tym przypadku nic do rzeczy.
  • Poziom 22  
    Może najlepiej by było, żeby kolega lukole udostępnił pliki *.hex (z Bascoma i C) i napisał jakiego kompilatora C używa. Może nie trzeba będzie więcej zgadywa co jest problemem...
  • Poziom 12  
    Echh, aż chciałbym to sprawdzić ale teraz nie mam jak. To może najlepiej będzie jak to uzasadnisz w jakiś sensowny sposób.
    ---
    Zerpo.. popieram :D!
  • Poziom 39  
    Procekk napisał:
    Echh, aż chciałbym to sprawdzić ale teraz nie mam jak. To może najlepiej będzie jak to uzasadnisz w jakiś sensowny sposób...

    Tu nie ma co uzasadniać :D Zajrzyj do pdf-ka np.ATMega8535 i na str.50 zobacz jak wygląda budowa portu.Przypatrz sie połączeniom przerzutników typu D , przechowującym stan bitów DDRx i PORTx , oraz potrójnej bramce , która przez inwerter steruje pullupem.Myślę że zrozumiesz ;)

    Piotrek
  • Poziom 12  
    Cytat:
    połączeniom przerzutników typu D , przechowującym stan bitów DDRx i PORTx

    No zgoda jak najbardziej, co do kolejności wg schematu. A co na to kompilator C? Tak wogóle to jeszcze się zastanawiam.. najpierw mamy port A jako wejscie z pull-up-em. Chwile poźniej port A staje się wyjściem. Nie redefiniujemy ktory pin jest H który L.. Tak sobie czytam.. strona 52 od megi8535...
    A żałuje że nie mogę akurat teraz tego zweryfikować praktycznie, przywykłem do uprzedniego ustalania kierunku portu.
    ---
    PORTA=0xAA daje co drugi bit "1". A co się dzieje z pinami na których powinno być "0"?
  • Poziom 39  
    Procekk napisał:

    No zgoda jak najbardziej, co do kolejności wg schematu. A co na to kompilator C? Tak wogóle to jeszcze się zastanawiam.. najpierw mamy port A jako wejscie z pull-up-em. Chwile poźniej port A staje się wyjściem. Nie redefiniujemy ktory pin jest H który L..

    Po co redefiniować , skoro przy zapisie do DDR , stan w PORT się nie zmienia.
    Procekk napisał:

    A żałuje że nie mogę akurat teraz tego zweryfikować praktycznie, przywykłem do uprzedniego ustalania kierunku portu.

    Ja to sprawdziłem i to wielokrotnie :)
    Procekk napisał:

    PORTA=0xAA daje co drugi bit "1". A co się dzieje z pinami na których powinno być "0"?

    Zero będzie tylko przy pracy jako wyjście , natomiast przy ustawieniu jako wejście "pływają"(stan wysokiej impedancji) , przez co doprowadzają niektórych "programistów" do rozpaczy :D

    Piotrek
  • Poziom 9  
    Witam. Po dzisiejszych próbach okazało się co następuje:

    1. Przyczyną takiego a nie innego stanu na pinach był najwyraźniej działający watchdog, zgodnie z tym co zasugerowali koledzy zerpo i McRancor

    2. Postanowilem unieruchomic watchdoga, przynajmniej na czas testów projektu, w tym celu zmodyfikowałem kod:

    #include <avr\io.h>


    void WDT_off(void)
    {
    //reset WDT
    __asm("wdr");
    //przygotowanie wylaczena WDT - 1 do rejestrow WDCE i WDE
    WDTCR |= (1<<WDCE) | (1<<WDE);
    //wlasciwe wylaczenie WDT
    WDTCR=0x00;
    }

    int main(void)
    {
    //disable WDT
    WDT_off();

    //konfig portu
    DDRA=0xFF;
    DDRB=0xFF;
    PORTA=0xAA;
    PORTB=0xAA;

    while(1);

    return 0;
    }


    3. W mojej atmedze8535 mialem ustawione bity konfiguracyjne S8535C i WDTON jako zaprogramowane, co oznaczało ustawienie poziomu zabezpieczenia watchdoga na level 2

    4. Przełączyłem zabezpieczenie na nizszy level co pozwolilo wyłączyc watchdoga powyzsza funkcja


    bardzo dziekuję za pomoc i pozdrawiam