logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega8][c]Hello led - nie chce działać

pio_05 01 Wrz 2008 18:10 2972 15
  • #1 5496825
    pio_05
    Poziom 12  
    Witam.

    To mój pierwszy program w c.

    Program napisałem AVR Studio (4.13 bez service paków) z użyciem Winavr(najnowszego).
    Po kompilacji program nie chce się symulować(strzałka podczas symulacji pokazuje cały czas int main (void){ ) a po wgraniu go do atmegi przez kompilator bascoma nie chce też w niej działać.

    Oto kod programu:

    
    include <avr/io.h>
    
    
    
    int main (void){       
    	
    	
    	DDRC=0b11111111;	
    	PORTC=0x00;
    
    	while(1){
    	  PORTC =0b00000000;
    	
                        }
    }
    


    Dioda jest podłączona do plusa(przez rezystor 1k) a więc port c powinien mieć stan niski.
    Możliwe że rezystor jest za duży ale w bascomie działa.
    To mój pierwszy program w c prosze o pomoc i z góry dziękuje.
    pozdrawiam.
    pio_05
  • #2 5497132
    Osmo
    Poziom 18  
    Sugeruje za pętlą główną dodać

    Program po wykonaniu sie musi zwrócić wartość do systemu ;) (oczywiście tu go nie ma, ale to taki archaizm ze starych czasów ;) )

    Poza tym przed 'include' należy dodać znak '#'

    I jeszcze pytanie, dlaczego w pętli głównej ustawiasz stan na porcie c, skoro zrobiłeś to już wczesniej?

    Dodano po 4 [minuty]:

    Poprawny kod (winavr go kompiluje);
    
    #include <avr/io.h>
    
    int main (void){       
       
    DDRC=0b11111111;   
    PORTC=0x00;
    
    while(1){
    
                }
    
    return 0;
    }
    
  • Pomocny post
    #3 5497215
    acid12
    Poziom 21  
    1) kompilator wyrzuca jakieś błędy?

    aha, zdecyduj sie w jakiej notacji piszesz ;) nastaw sie na szesnastkowy

    Cytat:
    Program po wykonaniu sie musi zwrócić wartość do systemu Wink (oczywiście tu go nie ma, ale to taki archaizm ze starych czasów Wink )

    widać że programujesz w C, ale dla kompilatora AVR-GCC to return nie jest ważne, bo program nie powinien dojść do tego momentu, tak jak piszesz, w mikrokontrolerach nie ma systemu więc nie można wyjść z programu.

    spr taki program, dioda powinna mrugać na porcie D

    #include <avr/io.h>
    #include <util/delay.h>
    int main (void){       
       
       DDRD=0xFF;   
       PORTD=0xFF;
    
       while(1){
         PORTD=0x00;
         _delay_ms(200);
         PORTD=0xFF;
        _delay_ms(200);
       
       }
    
    return 0;
    } 
  • #4 5497254
    dawid512
    Poziom 32  
    Fajnie acid12 tylko że kolega raczej nie chce mrugać całym portem :P
  • #5 5497413
    acid12
    Poziom 21  
    w nauce programowania mikroklocków w C, po programie zapalania diody na porcie, zawsze następnym krokiem jest zrobienie mrugania diodą, ułatwiłem mu :] a że nie pisze gdzie ma diodę podłączoną do mruga całym portem :P
  • #6 5497447
    dawid512
    Poziom 32  
    No nie wiem, ja jak startowalem w C na avr to jakos odrazu zrobilem mruganie na odpowiednim pinie :P
  • Pomocny post
    #7 5497462
    Osmo
    Poziom 18  
    No dla mnie tym następnym krokiem był przerzutnik T :)
    Również polecam :)

    Potem, sugeruje proste przerwania zewnętrzne, timer (tu duze pole do popisu, mozna sobie zrobić na nim mruganie diody, przyciskami sterowac częstotliwość), potem sterować jasnością z PWM.
    Dalej proponuje pobawić sie wewnętrznym eepromem, przydaje sie w dalszej nauce, potem zewnętrzny itd.
    i tak powoli poznawać te rodzine (sam jestem w trakcie i jeszcze mam sporo do nauki ;) ).

    I gdy czegoś sie nie rozumie - szukać odpowiedzi, a w razie 'w' pytać, zawsze ktoś pomorze ;)

    Dodano po 10 [minuty]:

    PS. acid12, co do notacji, zaleznie od zastosowan, przy ustawianiu portów na poczatek binarna jest bardziej przejzysta ;)
  • #8 5497778
    pio_05
    Poziom 12  
    Bardzo dziękuje za pomoc po dodaniu return'a działa wyśmienicie.

    Następnym programem pewnie będzie obsługa wyświetlacza.

    Pisze w c++ także z tym też powinienem sobie poradzić.

    Jeszcze raz dziękuje i pozdrawiam.
    pio_05


    ps. Ta biblioteka z delay zjadła mi pół pamięci flash:)
  • #9 5498014
    acid12
    Poziom 21  
    dawid512 napisał:
    No nie wiem, ja jak startowalem w C na avr to jakos odrazu zrobilem mruganie na odpowiednim pinie :P


    ja podobnie ;) ale czytając temat na elektrodzie dokonałęm uogólnienia ;) zresztą ja najpierw przeczytałem cały kurs 'mikroprocesorowej oślej łączki', później tez kurs 'C dla mikrokontrolerów' i 'kurs AVR-GCC' (wszystkie z EP lub EdW) a później kupiłem dopiero części, zrobiłem własną płytkę testową i zacząłem się odrazu bawić w C (bascoma olałem a w C/C++ mam doświadczenie) wiem, że źle, że najpierw teoria a później praktyka ale na części czekałem 2 tygodnie to przeczytałem wszystko a później w praktyce przy trudniejszych te podstawy i tak ćwiczyłem ;) zresztą dalej się uczę ;)

    osmo napisał:
    co do notacji, zaleznie od zastosowan, przy ustawianiu portów na poczatek binarna jest bardziej przejzysta Wink

    bć może ale już liczbę 32bitową ak przedstawiać to ciężko :P ale na początek dobre, tylko później oduczyć się może byćciężko ... a windowsowski kalkulator ma fajną opcję przełączania między systemami :P
  • #10 5498070
    Osmo
    Poziom 18  
    Windowsowego calc. nie uzywam, wkurza mnie to klikanie w celu przełączania okna, zmiany notacji ;], mam inżynierski casio, dużo lepiej jest nim ;).

    Oczywiście liczbe 32 bitową nie jest łatwo przedstawic binarnie :), natomiast jak już wyzej pisałem, do ustawiania stanu portów jest świetna.

    Skoro już, to zapytam na łamach tego tematu :)
    Montuje sobie mała klawiature na jednym przerwaniu (7 przycisków, do nawigacji po menu), i mam mały problem.
    mam sobie pin INT1, i jakiś tam PIND6.
    Pin INT1 (PD3) jest ustawiony jako wejscie, stan wysoki, Pin PD6, jako wejscie, stan niski. Między nimi switch, zwiera on PD3 do PD6. Przerwanie wywoływane zboczem opadającym. Z tego co się dowiedziałem, powinno to powodowac przerwanie, czego nie robi, robi natomiast gdy ustawie PD6 jako wyjście, stan niski.
    Zeby zrobić klawiaturkę, musze też odczytac stan pinu PD6, a wiec musi być on wejściem ;)
    Czemu ten układ nie działa ? Jak to zrobić by sie nie narobić, a by działało ;]
  • #11 5498255
    acid12
    Poziom 21  
    [atmega8][c]Hello led - nie chce działać

    można tak.
    INT1 oraz PDx jako wejścia podciągnięte (wewnętrznie bądź przez rezystory zewn to obojętnie jak uważasz)

    po przyciśnięciu, wyzwalasz zbocze opadające a INT1, oraz stan niski na PDx.
    Dzięki diodom, na PDy będzie dalej stan wysoki, bez diod po zwarciu przy PDx, na PDy również byłby stan niski ... a jokoś przydałoby się to rozróżnić ;)

    powinno działać, nie testowałem tego :P
  • #12 5498937
    marek-c
    Poziom 19  
    pio_05 napisał:
    Bardzo dziękuje za pomoc po dodaniu return'a działa wyśmienicie.

    Następnym programem pewnie będzie obsługa wyświetlacza.

    Pisze w c++ także z tym też powinienem sobie poradzić.

    Jeszcze raz dziękuje i pozdrawiam.
    pio_05


    ps. Ta biblioteka z delay zjadła mi pół pamięci flash:)


    To proponuje jeszcze poćwiczyć. To nie dlatego działa! Ten return nic nie daje.
  • #13 5499016
    _Robak_
    Poziom 33  
    To jednak przez ten hasz dziala ;) Tak to jest jak sie zmienia dwie rzeczy naraz :P
  • #14 5500018
    Osmo
    Poziom 18  
    hehe, jesli chodzi o niedziałanie danych napisanych przez siebie funkcji, jest sposób na skuteczną diagnoze, właśnie dziś go opracowałem i zastosowałem - skutek: po problemie :]

    Jedyne co musimy osiągnąć to poziom na którym już potrafimy obsłużyć wyświetlacz LCD.
    Opisując na swoim przykładzie.
    Nie mogłem dojść do ładu z tą klawiaturką, nie wiedziałem czy to wina kodu czy sprzętu, więc sobie dopisałem niewielka funkcje która podczas przerwania wyświetlała stan pinów portu na wyswietlaczu i tak wykluczyłem wade sprzetu, po czym znalazłem bład w programie ;)
  • #15 5500219
    rrata
    Poziom 19  
    pio_05 napisał:
    Bardzo dziękuje za pomoc po dodaniu return'a działa wyśmienicie.
    Tak już koledzy wyżej pisali return nie ma wpływu na działanie programu, gdyż program do tego return nigdy nie dojdzie.

    pio_05 napisał:
    ps. Ta biblioteka z delay zjadła mi pół pamięci flash:)
    Piszesz głupoty. Napisz jak to sprawdziłeś, bo pewnie nie zrozumiałeś komunikatu programu.

    :arrow: Osmo
    Sposób b. dobry, bo na LCD można dużo zobaczyć i wiadomo wtedy co i jak, ale jak w układzie nie ma LCD to lepiej podłączyć do komputera przez RS-232 :wink: nie dość, że tylko 3 przewody, jeden mały układzik (MAX232), to jeszcze na monitorze więcej widać :wink:
  • #16 5500280
    Osmo
    Poziom 18  
    W sumie masz racje, mniej roboty, ale jak juz sie ma LCD w układzie ;)

    Cytat:
    pio_05 napisał:
    ps. Ta biblioteka z delay zjadła mi pół pamięci flash:)

    mało prawdopodobne (nie zauwazyłem tego u siebie) ale wrazie w, mozesz uzyć takiej funkcji:

    
    wait_time(unsigned int mnoznik){
    unsigned int a;
    unsigned int b;
    unsigned int c;
    unsigned int m;
    for(m=0; m<mnoznik; m++);//stopień mnoznika
    for(a=0; a<f_cpu;a++); //pierwszy stopień, zamiast f_cpu podstawić czestotliwość procka w mhz
    for(b=0; b<100; b++); //drugi stopien, zajmie 100 cykli
    for(c=0; c<10; c++); //trzeci stopien, kolejne 10 cykli
    __asm("nop"); //wstawka z asamblera, 1 cykl
    // łacznie ok 1ms dla mnożnika równego 1.
    //ew mozna uciąć mnoznik i wartość opóźnienia ustawić na stałe
    
    }
    
REKLAMA