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.

Atmega8 [C] nie działa migająca dioda, dziwne zachowanie

gamzaj11 06 Lut 2018 20:14 1275 7
  • #1 06 Lut 2018 20:14
    gamzaj11
    Poziom 3  

    Witam. Dopiero zaczynam przygodę z programowaniem w C. Napisałem program, którego zadaniem jest miganie diodą podłączoną do pinu nr 1 portu D. po wgraniu programu, dioda ta świeci. Natomiast dioda podłączona do pinu 0 portu B miga w tym czasie lecz bardzo słabo. Kompletnie nie rozumiem tego..może mi ktoś pomóc W załączniku kod programu. Dodam ze wszystko robię na podstawce do programowania która ma odpowiednie podłączenie.

    0 7
  • Pomocny post
    #2 06 Lut 2018 21:45
    Mscichu
    Poziom 15  

    masz błąd w main. Dokładnie w tej linijce:

    PORTB ^=(1<<LED1);

    0
  • Pomocny post
    #3 07 Lut 2018 00:50
    michas
    Poziom 23  

    Witaj, ja też dopiero zaczynam :)
    #define F_CPU 8000000L
    #include <avr/io.h>
    #include <util/delay.h>

    #define LED1 PD0 // tutaj definiujesz ze led ma być na PD0 ale to info dla ciebie dla kompilatora wygląda to tak LED1 = PD0=0

    void main(void)
    {
    DDRD |= (1<<LED1); /* tu definiujesz kierunek pinu PD0 jako wyjście (robisz or wartości rejestru DDRD z jedynką przesunięta o 0 miejsc, bo LED1=PD0=0 czyli 00000001) */

    PORTD |= (1<<LED1); /* tu przypisujesz 1 na PD0 dlatego dioda świeci (względem masy wybrałeś taką logikę) ale uwaga! tutaj tez traktuj LED1 jako wartość 0 przesuwasz jedynkę o zero miejsc czyli masz 00000001 robisz or z wartością PORTD czyli ustawiasz linię PD0 na 1 */

    while (1) //Pętla główna
    {
    PORTB ^=(1<<LED1); /* tu zrobiłeś błąd zamiast portuD użyłes portuB ale zauważ ze dioda miga na na PB0 bo uwaga! LED1 traktujesz jako wartość 0 i stworzyłeś maskę przesuwając jedynkę o LED1 miejsc czyli o 0. Maska wynosi 00000001 robisz z nią xor z PORTB czyli w każdym obiegu pętli zmieniasz wartość PB0 na przeciwną.*/

    _delay_ms(100); /*dioda miga słabo bo 100ms to bardzo krótki czas daj np 500ms * i słabo, bo nie ustawiłeś linii portu PB0 jako wyjście instrukcją DDRB |= (1<<PB0) - ale to taka dygresja ,bo zadaniem przecież jest miganie diodą na linii 0 portuB */

    }
    }
    Zainteresuj się tez plikami nagłówkowymi tam się dzieje mnóstwo ciekawych rzeczy :)
    Pozdrawiam Michał

    0
  • Pomocny post
    #4 07 Lut 2018 01:11
    JasnyKris
    Poziom 21  

    Witam.

    Dla czytelności Waszych kodów...

    Autor tematu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kolega michas:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Generalnie kolega michas powiedział chyba wszystko, co trzeba było powiedzieć co do samego kodu i kilku zawartych w nim błędów, a ode mnie jeszcze pytanie - czy zadbałeś o filtrację zasilania Twojego uC? Jest to wbrew pozorom bardzo ważny temat jeśli chcesz, żeby nawet takie proste miganie LEDem działało prawidłowo.

    0
  • #5 07 Lut 2018 07:09
    koczis_ws
    Poziom 25  

    Najważniejsze, czy wejścia są podciągnięte do plusa, bo jeśli nie to takie rzeczy się dzieją.
    Nie widzę schematu a kodu nie analizuję bo nie znam i nie chcę znać "C" :D

    0
  • Pomocny post
    #6 07 Lut 2018 09:18
    sobieh
    Poziom 11  

    MCU teoretycznie powinien wyzerować pamięć ale zdażają się nieraz "dziwne zachowania" więc warto przypisać/wyzerować wartość zamiast używać ORa zwłaszcza jeśli przed main() uruchamia się jakiś bootloader (np. arduino):

    Kod: c
    Zaloguj się, aby zobaczyć kod


    koczis_ws napisał:
    Najważniejsze, czy wejścia są podciągnięte do plusa, bo jeśli nie to takie rzeczy się dzieją. kodu nie analizuję bo nie znam i nie chcę znać "C" :D

    Akurat tutaj ... takie rzeczy się dzieją jak się nie zna "C" :D

    0