Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 - Czt mam uszkodzony uC?

polarczn 24 Lis 2013 23:12 3012 17
  • #1 24 Lis 2013 23:12
    polarczn
    Poziom 16  

    Wgrywam ten kod i ciągle pali mi się 1 dioda led. Dlaczego?

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #2 24 Lis 2013 23:29
    Carmixus
    Poziom 14  

    Sprecyzuj pytanie. Do którego portu podłączona jest ta świecąca się dioda, jak jest podłączona (przez rezystor do masy, czy plusa)? Co podłączasz do wejść 2, 3, 4 portu C?

    To może być wina tego, że PC4 nie ma włączonego rezystora pull-up.

  • #3 24 Lis 2013 23:33
    majster1991
    Poziom 9  

    Z tego co napisałeś nie wszystko wynika, ale prawdopodobnie wystarczy zmienić:
    PORTC = 0x0f na
    PORTC = 0xff.

  • #4 24 Lis 2013 23:35
    BlueDraco
    Specjalista - Mikrokontrolery

    polarczn napisał:
    Wgrywam ten kod i ciągle pali mi się 1 dioda led. Dlaczego?


    Proponuję zacząć od prawidłowego sformatowania kodu, co znakomicie podnosi jego czytelność:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dobrze jest również czytać ostrzeżenia kompilatora o "martwych" instrukcjach.
    Program zawsz będzie kręcić się w pętli while, w której jeden raz zmieni stan wyjścia PD0.

  • #6 25 Lis 2013 07:26
    polarczn
    Poziom 16  

    Korzystam z kursu ze strony:
    http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=2
    Diody podłączone poprzez rezystory do masy. Piny z portu C do przycisków i też do masy. Troszkę się uczyłem ADC i Timera0 i chciałbym to wszystko wykorzystać.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodałem kilka nawiasów i 2 ostatnie polecenia z przyciskami działają, a to 1 nie, bo dioda cały czas się świeci.

  • #7 25 Lis 2013 07:59
    dondu
    Moderator Mikrokontrolery Projektowanie

    Zrób trzy rzeczy:
    1. Komentuj swój kod, abyśmy wiedzieli co w danym momencie oczekujesz i mogli to zweryfikować.
    2. formatuj kod ładnie, by było łatwo go sprawdzać - także Tobie to pomoże. Stosuj wcięcia tabulatorem i zamykaj nawiasy w osobnych liniach
    3. zrób to co napisałem:

    dondu napisał:
    Użyj symulatora w AVR Studio czy Atmel Studio i zobacz jak pracuje Twój program.

    wtedy sam szybko dojdziesz dlaczego Twój program nie działa tak jak oczekujesz. A jeżeli pracujesz w WinAVR lub Eclipse, to porzuć te środowiska, na rzecz oryginalnych ATmela: http://mikrokontrolery.blogspot.com/2011/04/kompilator-i-srodowisko-programistyczne.html


    BlueDraco napisał:
    Dobrze jest również czytać ostrzeżenia kompilatora o "martwych" instrukcjach.

    Trochę się zdziwiłem, bo także oczekiwałem warningów, lecz kompilator ich nie pokazał - dlaczego?

    Cytat:
    Build started 25.11.2013 at 08:29:11
    avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Proba_10.o -MF dep/Proba_10.o.d -c ../Proba_10.c
    avr-gcc -mmcu=atmega8 -Wl,-Map=Proba_10.map Proba_10.o -o Proba_10.elf
    avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature Proba_10.elf Proba_10.hex
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex Proba_10.elf Proba_10.eep || exit 0
    avr-objdump -h -S Proba_10.elf > Proba_10.lss

    AVR Memory Usage
    ----------------
    Device: atmega8

    Program: 80 bytes (1.0% Full)
    (.text + .data + .bootloader)

    Data: 0 bytes (0.0% Full)
    (.data + .bss + .noinit)


    Build succeeded with 0 Warnings...

  • #8 25 Lis 2013 09:37
    polarczn
    Poziom 16  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Te 3 pętle if mają taką samą budowę i tak samo można je zapisać, a mimo to działają tylko 2 z 3.
    Mam zewnętrzny kwarc 12 Mhz. Ustawiłem to w mkAVR Calculator. Nie ustawiałem jednak CKOPT oscylatora.
    Uczę się Timera0 z twojego kursu:
    http://mikrokontrolery.blogspot.com/2011/03/led-sterowany-przez-timer.html
    Ja mam dzielić 12 Mhz przez preskaler? Chciałbym, aby każda dioda zapalała się np: co 5 sekund. Jak to zrobić?

  • #9 25 Lis 2013 09:43
    BlueDraco
    Specjalista - Mikrokontrolery

    A schematu wciąż nie znamy i kod wciąż sformatowany nieczytelnie.
    W programie masz jedną pętlę while(). if () - to konstrukcje warunkowe, a nie pętle.

  • #11 25 Lis 2013 11:13
    BlueDraco
    Specjalista - Mikrokontrolery

    Czy podłączyłeś VCC, AVCC i wszystkie GND?
    Jeśli tak, to sprawdź miernikiem działanie przycisku - napięcia na porcie wejściowym przy wciśniętym i zwolnionym przycisku.

  • #12 25 Lis 2013 16:02
    dondu
    Moderator Mikrokontrolery Projektowanie

    Uwaga BlueDraco jest słuszna, bo działasz według błędnego schematu, który może zadziałać tylko na podstawowym Atmega8 zawierającym błąd producenta polegający na wewnętrznym zwarciu pinów Vcc i AVcc:

    Atmega8 - Czt mam uszkodzony uC?

    Na przykład ATmega8A nie ma już tego problemu i brak podłączenia AVcc oznacza brak zasilania niektórych pinów portu C, w tym jego rezystorów pull-up.

    Lektura: http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html

    EDIT:
    Kod komentuj w ten sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Wtedy znamy Twoje intencje, a stan faktyczny opisuj słownie w poście.

    Dodano po 4 [godziny] 21 [minuty]:

    Zmobilizowałeś mnie w końcu do ruszenia tematu symulatora, bo w takich prostych sytuacjach on bardzo pomaga.
    Pozwoliłem sobie więc wykorzystać Twój przypadek: http://mikrokontrolery.blogspot.com/2011/03/Symulator-mikrokontrolerow-AVR-Atmel-Studio.html


    Link

  • #13 26 Lis 2013 13:58
    dondu
    Moderator Mikrokontrolery Projektowanie

    Przy okazji artykułu jeden z czytelników słusznie zauważył jeszcze, że nie włączasz wewnętrznego rezystora pull-up dla pinu PC4. Ze schematu nie wynika, czy podłączasz go z zewnątrz więc jeśli nie, to musisz to uwzględnić w tej linii:

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #14 26 Lis 2013 18:02
    pbuhne
    Poziom 14  

    Świeci Ci się ciągle jedna bo instrukcje:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    ustawiają CAŁY PORTD odpowiednio:

    0000 0001
    0000 0100
    0000 0010

    powinno byc:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    to raz, dwa w Twoim kodzie nie ma polecenia zgaszenia żadnej diody. Jeśli zapalasz diodę stanem wysokim (1) PORTD |= (1<<PDx) to gasisz ją stanem niskim (0): PORTD &= ~(1<<PDx).

    Warunek if(przycisk) zapal powoduje zapalnie diody gdy jest spełniony, ale jeśli nie jest spełniony to nie dzieje się nic. To nie działa tak, że jeśli naciśniesz przycisk to dioda się zapali a jak puścisz to zgaśnie. Ona pozostanie zapalona. Więc musisz ją innym poleceniem zgasić.

    ed:

    Tak jak już koledzy zauważyli, włącz pull-up też na 4 pinie PORTC:
    PORTC = 0x1F;
    Bo do tej pory miałeś tylko na pinach 0,1,2,3 a 4 wisiał w powietrzu i działał jak antena.

  • #16 26 Lis 2013 18:11
    pbuhne
    Poziom 14  

    dondu napisał:
    pbuhne napisał:
    to raz, dwa w Twoim kodzie nie ma polecenia zgaszenia żadnej diody.

    Ależ są i to nawet 3 - czy świadome, czy też nie to inna sprawa :)


    Masz racje :) Ja natomiast myślałem o jawnym ich gaszeniu, trochę się zagalopowałem ;)

  • #18 26 Lis 2013 23:45
    polarczn
    Poziom 16  

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Teraz diody palą się poprawnie. Kiedy stosować np: PORTD = (1<<PD1), a kiedy PORTD |= (1<<PD1)?

Szybka odpowiedź lub zadaj pytanie
Dziękuję Ci. Ta wiadomość oczekuje na moderatora.
 Szukaj w ofercie
Wyszukaj w ofercie 200 tys. produktów TME