Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

gamzaj11 06 Feb 2018 20:14 1755 7
Computer Controls
  • #1
    gamzaj11
    Level 4  
    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.
  • Computer Controls
  • Helpful post
    #2
    Mscichu
    Level 17  
    masz błąd w main. Dokładnie w tej linijce:

    PORTB ^=(1<<LED1);
  • Computer Controls
  • Helpful post
    #3
    michas
    Level 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ł
  • Helpful post
    #4
    Kaliber PC - Service

    Level 22  
    Witam.

    Dla czytelności Waszych kodów...

    Autor tematu:
    Code: c
    Log in, to see the code


    Kolega michas:
    Code: c
    Log in, to see the code

    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.
  • Helpful post
    #6
    sobieh
    Level 12  
    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):
    Code: c
    Log in, to see the code


    koczis_ws wrote:
    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