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

Atmega8 - Dlaczego kod nie działa

polarczn 18 Sie 2013 12:56 2448 27
  • #1 18 Sie 2013 12:56
    polarczn
    Poziom 16  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Wklejam swój prosty kod. Nie rozumiem, dlaczego nie działa tak jak chce.
    Mam 3 diody led podłączone do PD0, PD1 i PD2 oraz mikroprzyciski podłączone do portów PB1, PB2 i PB3. Ustawiłem porty D jako wyjścia, a B jako wejścia z podciągnięciem do VCC. Na razie pali mi się tylko 1 lampka nawet bez wciskania przycisku. Słabo rozumiem zagadnienie maski, wydaje mi się, że tu może być błąd. Na koniec pętla zwiększająca wartość i o 100. Czyli co każde wciśnięcie przycisku powinna być dłuższa przerwa pomiędzy świeceniem lampek.

    0 27
  • Arrow Multisolution Day
  • #2 18 Sie 2013 13:00
    dondu
    Moderator Mikrokontrolery Projektowanie

    Witaj,

    Zacznij od lektury dot. zmiennej wartości delay: http://mikrokontrolery.blogspot.com/2011/04/gcc-avr-funkcje-opoznienia-delay.html

    Co ma robić ten fragment:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    polarczn napisał:
    Słabo rozumiem zagadnienie maski, wydaje mi się, że tu może być błąd.

    Proszę bardzo - poćwicz tutaj: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-operator-bitowy-and.html


    Poza tym stosuj zdefiniowane nazwy pinów i przesunięcia bitowe:
    http://mikrokontrolery.blogspot.com/2011/03/a...howComment=1375869639131#c3165447750334300977

    Na koniec jeszcze pytanie: Czy ustawiłeś częstotliwość zegara w opcjach projektu?

    0
  • #3 18 Sie 2013 13:22
    BlueDraco
    Specjalista - Mikrokontrolery

    To poniżej - to jest pętla nieskończona, więc dalszy ciąg kodu nigdy się nie wykona.
    for(i=0;i<1000;i+100);

    Wartość i nigdy się nie zmienia - jest zawsze równa 0.

    Czytaj ostrzeżenia kompilatora, zapewne to zauważył i zaraportował.

    0
  • #4 18 Sie 2013 13:22
    polarczn
    Poziom 16  

    PORTB=0xFF;
    czyli PORTB= 1111 1111
    PINB = 0001 0000 Używając & przycisk PB4 powinien otrzymać wartość 1, czyli, że jest wciśnięty.
    Dobrze będę stosować przesunięcie bitowe.
    Niestety, ale kompiluje na razie w Programmer's Notepad, ale fusebity ustawiłem w twoim programie na 12 Mhz i taki oscylator mam wpięty do nóżek XTAL1 i XTAL2 (czyli 1 nóżka kwarcu do XTAL1, a 2 do XTAL2)

    0
  • #5 18 Sie 2013 13:29
    dondu
    Moderator Mikrokontrolery Projektowanie

    polarczn napisał:
    PORTB=0xFF;
    czyli PORTB= 1111 1111
    PINB = 0001 0000 Używając & przycisk PB4 powinien otrzymać wartość 1, czyli, że jest wciśnięty.

    Żeby była jasność, to
    Kod: c
    Zaloguj się, aby zobaczyć kod

    włącza rezystory Pull-UP podciągające wejśćia do Vcc (stan wysoki).

    PINB natomiast odczytuje stan wejścia, czyli normalnie (przycisk nie naciśnięty) otrzymasz jedynkę.

    Aby sprawdzić, czy przycisk jest naciśnięty musi on zewrzeć pin do masy. Ty oczekujesz zupełnie czego innego:
    polarczn napisał:
    Używając & przycisk PB4 powinien otrzymać wartość 1, czyli, że jest wciśnięty.


    Musisz więc sprawdzać czy pin jest zerem"

    Kod: c
    Zaloguj się, aby zobaczyć kod



    polarczn napisał:
    Niestety, ale kompiluje na razie w Programmer's Notepad, ale fusebity ustawiłem w twoim programie na 12 Mhz i taki oscylator mam wpięty do nóżek XTAL1 i XTAL2 (czyli 1 nóżka kwarcu do XTAL1, a 2 do XTAL2)

    Fusebity ustawiają mikrokontroler. Kompilator musi natomiast wiedzieć dla jakiego zegara ma skompilować program w szczególności funkcje opóźnienia. Dlatego musisz mu podać co najmniej w kodzie przed linkowaniem delay.h:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    a najlepiej w makefile skoro używasz Programmer's Notepad. Ale przestań się męczyć z tym środowiskiem i zastosuj jedno z tych:
    http://mikrokontrolery.blogspot.com/2011/04/kompilator-i-srodowisko-programistyczne.html

    Wtedy F_CPU ustawisz w opcjach projektu:
    http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    EDIT:
    I popraw tę pętlę o której pisze BlueDraco.

    0
  • #6 18 Sie 2013 13:42
    polarczn
    Poziom 16  

    for(i=0;i<1000;i+100);
    Chciałem, aby do wartości i dodać 10 razy 100.

    0
  • Arrow Multisolution Day
  • #7 18 Sie 2013 13:45
    dondu
    Moderator Mikrokontrolery Projektowanie

    polarczn napisał:
    for(i=0;i<1000;i+100);
    Chciałem, aby do wartości i dodać 10 razy 100.


    OK, ale:

    BlueDraco napisał:
    Wartość i nigdy się nie zmienia - jest zawsze równa 0.

    dlatego zastanów się dlaczego Twoja zmienna i jest ciągle zerem.

    0
  • #8 18 Sie 2013 13:49
    polarczn
    Poziom 16  

    Można zmienić na:
    for(i=100;i+=100;i<1000);

    0
  • #10 18 Sie 2013 14:00
    polarczn
    Poziom 16  

    Nie, nie widzę tego. Nie chcę tutaj wklejać kodów z innych poradników, ale na przykład:
    /* Definicja zmiennych */
    int t;
    for(t=0; t<=768; t+=2)
    .......................................................
    _delay_us(t); // opóźnienie w mikrosekundach
    I tyle.

    0
  • #12 18 Sie 2013 14:04
    polarczn
    Poziom 16  

    ;) Ten kod napisałem wcześniej, zobacz 13:49.

    0
  • #13 18 Sie 2013 14:05
    BlueDraco
    Specjalista - Mikrokontrolery

    i += 2 to to samo, co i = i + 2, czyli obliczenie sumy i + 2 i podstawienie jej pod i.
    i + 100 - to obliczenie sumy i + 100 i zapomnienie jej.

    Zamiast poradników czytaj wiarygodne źródła, np. Kernigham.

    0
  • #14 18 Sie 2013 14:07
    polarczn
    Poziom 16  

    Dopiero się uczę. W poradniku to jest napisane, jednak bardzo powoli to ogarniam i dlatego robię błędy.
    Źródło, które podałeś jest w języku angielskim. Aż tak dobrze tego języka nie znam.

    0
  • #16 18 Sie 2013 14:09
    BlueDraco
    Specjalista - Mikrokontrolery

    Mógłbym przysiąc, że od przynajmniej 15 lat ta książka jest regularnie wydawana po polsku.

    0
  • #18 18 Sie 2013 14:11
    polarczn
    Poziom 16  

    Dziękuję za informacje, jeszcze dzisiaj zakupię tą książkę.

    0
  • #19 18 Sie 2013 21:55
    Fredy
    Poziom 27  

    polarczn napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod



    a czy ten średnik na końcu pętli for ma sens? Co poeta miał na myśli?

    0
  • #20 18 Sie 2013 22:25
    polarczn
    Poziom 16  

    Projekt się nie kompilował. Szukałem co może przeszkadzać i po wstawieniu średnika wszystko się skompilowało.

    0
  • #21 18 Sie 2013 22:41
    Fredy
    Poziom 27  

    zatem poczytaj o konstrukcji pętli for w C , a następnie sam zauważysz jaki jest bezsens tego średnika.

    0
  • #22 23 Sie 2013 11:53
    polarczn
    Poziom 16  

    Atmega8 - Dlaczego kod nie działa
    Wstawiam zdjęcie mojej płytki. Mikroprzyciski są podłączone do GND, rezystory do VCC.
    Wstawienie tego kodu powoduje ciągłe palenie się 1 diody.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ten kod się nie kompiluje, wywalają błędy.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Na płytce jest aż tyle kabelków, ponieważ podłączyłem płytkę do USB złączem KANDA i te kabelki są podpięte do tego portu. Na razie programuje płytkę i odłączam programator USBASP od usb. Nie ma opcji zatrzymania urządzenia w pasku bocznym. Czy mogę zasilać atmegę zasilaczem i mieć jednocześnie podłączony USBASP pod port usb?

    0
  • #23 23 Sie 2013 14:30
    landy13
    Poziom 29  

    Kod: c
    Zaloguj się, aby zobaczyć kod
    PINB & 0x40 maskuje szósty bit, a nie pierwszy. W następnym warunku też źle.

    Kod: c
    Zaloguj się, aby zobaczyć kod
    Nie wiem jaki cel Ci tu przyświecał, ale jeśli chcesz wyzerować PD6, to robi się to tak: PORTD &= ~(1<<PD6). Nie kompiluje się, bo brak średników.

    0
  • #24 26 Sie 2013 10:04
    polarczn
    Poziom 16  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Program się kompiluje. Mikroprzyciski mam podłączone do GND. Jak diody miałem podłączone do VCC (poprzez rezystor) to 2 lampki się paliły (ciągle). A jak podłączyłem do GND to nic się nie pali nawet jak wciskam przycisk.
    Posiłkuje się tym kursem:
    http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=2

    0
  • #25 26 Sie 2013 10:54
    BlueDraco
    Specjalista - Mikrokontrolery

    Czy masz rezystory podciągające przy przyciskach? Jeśli nie - włącz wewnętrzne.

    (1 << PD0) nie robi nic - obliczy wartość wyrażenia i "zapomina" je - brak podsatwienia.

    W wewnętrznej pętli for masz tylko jedną instrukcję - warunkowe podstawienie na PORTD. delay() jest już poza pętlą. Nie masz żadnej "częstotliwości świecenia", gdyż jedyne, co robisz w pętli - to warunkowe zaświecenie diod w dużej pętli nieskończonej. Nigdy ich nie gasisz.

    Proponuję, żebyż zaczął od tego, od czego zaczynają wszyscy - uruchomienia i ZROZUMIENIA programu migającego diodą, na razie bez przycisków.

    Dopóki nie ZROZUMIESZ, jak zaświeca się i gasi diodę w języku C, nie startuj dalej.
    Jak już zrozumiesz - dokładaj po jednej instrukcji do kolejnych wersji programu.

    0
  • #26 26 Sie 2013 11:42
    Wojtek001
    Poziom 15  

    polarczn napisał:
    Program się kompiluje.

    Bardzo optymistyczne podejście ,ale (przynajmniej na razie) staraj się doprowadzać wynik kompilacji do warnings = 0 bo patrząc na kod na pewno wyskoczyły ci warningi. (np. polecenia które nic nie robią typu (1<<PD0) - zamiast tego
    napisz po prostu PORTD |= 1;
    albo pętla for która (jak się domyślam) została użyta inaczej niż planowałeś - brak nawiasów klamrowych.
    użycie "_delay_ms(i); " to katastrofa - argumentem tej beznadziejnej funkcji musi być stała dosłowna; zamiast tego zrób pętle for bez ciała i reguluj opóźnienie początkową wartością zmiennej przekazanej do tej pętli - oczywiście gdy chcesz zatrzymywać program bo ogólnie są lepsze sposoby.

    0
  • #27 27 Sie 2013 20:34
    polarczn
    Poziom 16  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Wgrywam taki kod. Diody led mam podłączone odwrotnie tzn. anodą do rezystora. Diody led świecą, wciskanie przycisków nic nie daje. :) Super.

    0
  • #28 27 Sie 2013 21:14
    zumek
    Poziom 39  

    polarczn napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Z tego co tu piszesz wynika, że Twoja umiejętność programowania w "C" jest wybacz ... mierna i do puki nie zrozumiesz do czego w "C" służy przecinek czy klamra, to Twoje programy nie będą działać - taka jest smutna prawda.

    Temat zamykam - regulamin p. 3.1.17

    0