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.

Atmega 32 - sprawdzenie kodu c

wojkas3 08 Mar 2013 14:31 2013 18
  • #1 08 Mar 2013 14:31
    wojkas3
    Poziom 11  

    Witam proszę o sprawdzenie kodu który ma za zadanie włączać i wyłączać dwie diody co sekundę .

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 18
  • #2 08 Mar 2013 14:53
    BlueDraco
    Specjalista - Mikrokontrolery

    Błąd w pierwszej linii main() - powinno być:

    DDRC = LED1_PIN | LED2_PIN;

    0
  • #3 08 Mar 2013 16:06
    wojkas3
    Poziom 11  

    a jeżeli będzie tak jak jest to co się może stać to mój pierwszy program więc pomyłki mi się jeszcze zdarzają .

    0
  • #4 08 Mar 2013 16:21
    BlueDraco
    Specjalista - Mikrokontrolery

    Nic się nie stanie - po prostu nie będzie działać, bo instrukcja, której użyłeś nie zapisuje nic do DDRC.

    0
  • #5 08 Mar 2013 16:23
    wojkas3
    Poziom 11  

    A jeżeli napisałbym to tak
    DDRC |= LED1_PIN | LED2_PIN;
    czy było by dobrze?

    0
  • #6 08 Mar 2013 17:45
    BlueDraco
    Specjalista - Mikrokontrolery

    Jeśli nie wiesz, co jest i co powinno być w rejestrze DDRC, to nie bierz się za programowanie. ;)
    A jeśli wiesz - to napisz DDRC = to_co_trzeba;

    0
  • #7 08 Mar 2013 19:15
    wojkas3
    Poziom 11  

    Ale tylko sptałem czy z tą wersją by działało

    0
  • #8 08 Mar 2013 19:26
    BlueDraco
    Specjalista - Mikrokontrolery

    Zapytałeś, czy byłoby dobrze, a nie czy by działało.
    Działałoby, tylko po co wykonywać zbędne operacje logiczne - żeby zaciemnić program?

    Można też zapisać to samo tak, tylko po co?

    DDRC &= ~(LED1_PIN | LED2_PIN);
    DDRC |= 79 + LED1_PIN + 82 + LED2_PIN + 95;

    Przecież w końcu chcesz zapisać dobrze określoną wartość do DDRC, a nie wykonywać na tym rejestrze dziwne operacje, żeby nie zmienić nieznanych i tajemniczych wartości bitów.

    0
  • #9 08 Mar 2013 20:11
    wojkas3
    Poziom 11  

    Tak teraz rozumiem, ale mówisz o zaciemnianiu programu jak mówiłem to jest mój pierwszy program więc dopiero wyrabiam swoje nawyki do pisania. Ale i tak jestem zadowolony że moja druga propozycja by zadziałała. Napisałem tak ponieważ zacząłem naukę z tą książką http://atnel.pl/mikrokontrolery-avr-jezyk-c.html a tam tak to właśnie było opisane dodawanie portów ( nie wiem czy to dobrze ująłem ale myślę że wiesz że chodzi o tą błędną linię programu. Mam jeszcze jedno pytanie czy takie rozwiązanie jakie ja przedstawiłem zabiera miejsce (więcej) w pamięci.Wiem że dla ciebie pytanie jest śmieszne, ale to jest pierwszy tydzień mojej nauki więc proszę o wyrozumiałość.Czy mógłbyś mi rozpisać jak powinno wyglądać zapisanie portu dla 3 diod, chodzi mi o to co było błędem w moim kodzie bo ja bym zapisał to tak DDRC |= LED1_PIN | LED2_PIN | LED3_PIN;
    rozumiem że to też by działało jeżeli bym dodał do powyższego programu jeszcze definicję zmiany stanu dla tej trzeciej diody i w funkcji main odpowiednio ją zainicjował .

    0
  • #10 08 Mar 2013 20:56
    BlueDraco
    Specjalista - Mikrokontrolery

    DDRC |= x;

    jest przez procesor wykonywane jako trzy operacje - odczyt DDRC, suma logiczna i zapis nowej wartości. W niektórych procesorach jest to nawet pojedyncza instrukcja, w większości - trzy instrukcje. Nawet jeśli jest to pojedyncza instrukcja, to i tak działa wolniej niż pojedyncza instrukcja zapisu.

    Chodzi jednak głównie nie o zaoszczędzenie dwóch instrukcji i dwóch cykli zegara, a o to, co ten zapis wyraża dla tego, który go czyta i próbuje zrozumieć (czyli np. dla jego autora w rok po napisaniu programu).

    DDRC = 0b00110101 dość łatwo odczytasz jako "ustaw bity 0, 2, 4 i 5 jako wyjścia, pozostałe jako wejścia" (oczywiście ze stałymi symbolicznymi jest jeszcze śliczniej).

    DDRC |= 0b00001010 oznacza "ustaw bity 1 i 3 jako wyjścia i pozostaw poprzednią konfigurację pozostałych". Po przeczytaniu czegoś takiego pojawia się pytanie "a jaka jest konfiguracja pozostałych, kto i kiedy ją ustawił, i dlaczego muszę ją zachować?" i szukanie wcześniejszych ustawień DDRC w jakiejś wcześniejszej części programu.

    Operacje logiczne na rejestrach sterujących, np. DDRC, mają sens wtedy, gdy w czasie działania programu wielokrotnie zmieniasz np. kierunek jednej linii. Jeśli konfiguracja jest jednorazowa na cały czas pracy programu - trzeba zapisać ją tak, żeby potem się nie zastanawiać "a co z pozostałymi liniami portu / bitami rejestru?"

    Jeśli traktujesz projektowanie urządzeń mikroprocesorowych jako dziedzinę działalności inżynierskiej, a nie dziedzinę magii, to radzę zmienić podręcznik. ;)

    A następny krok, jaki powinieneś wykonać - to uruchomienie przerwania timera i odliczanie czasu (np. świecenia diod) przy jego użyciu.

    0
  • #11 09 Mar 2013 11:46
    wojkas3
    Poziom 11  

    Dziękuję za porady mam tylko pytanie jak długo zajmujesz się już tym językiem ?

    0
  • #12 09 Mar 2013 12:10
    BlueDraco
    Specjalista - Mikrokontrolery

    Jakieś 28 lat. :)

    0
  • #13 09 Mar 2013 23:53
    Antystatyczny
    Poziom 16  

    Witam.

    Nie chcę siać zamieszania, więc zacznę po swojemu. Jest kilka sposobów manipulowania bitami. Możemy napisać DDRC = 0xff, mozemy napisać DDRC = 0b11111111, a mozemy sobie "wsuwać"bity w ten sposób: DDRC |= (1<<PC0)|(1<<PC1); itd... przedmówca ma rację, że to są dodatkowe operacje logiczne...
    No ale zastanówmy się... To jest jeden z pierwszych softów młodego człowieka. Nie musi dbać o każdy bajt flasha czy ramu... Nie lepiej pomóc komuś, kto chce się tego nauczyć zamiast mieszać go z błotem? :)

    0
  • #14 15 Sty 2014 12:35
    PiotrekUK
    Poziom 11  

    BlueDraco napisał:
    Jeśli nie wiesz, co jest i co powinno być w rejestrze DDRC, to nie bierz się za programowanie. ;)
    A jeśli wiesz - to napisz DDRC = to_co_trzeba;


    Witam,
    Wpisałem przy DDRC wg zaleceń czyli: DDRC=to_co_trzeba i nie działa.
    Co robię źle?
    Pozdrawiam.Piotr
    Ps.
    Początkujący programista od wczoraj.

    0
  • #16 15 Sty 2014 18:05
    BlueDraco
    Specjalista - Mikrokontrolery

    Jeśli cały Twój program składa się z tej jednej instrukcji:
    DDRC=to_co_trzeba

    To ciekaw jestem, skąd wiesz, że nie działa.

    Jeśli w programie jest coś jeszcze, to wklej łaskawie cały program i napisz, dlaczego uważasz, że nie działa.

    0
  • #17 16 Sty 2014 01:44
    PiotrekUK
    Poziom 11  

    BlueDraco napisał:
    Jeśli cały Twój program składa się z tej jednej instrukcji:
    DDRC=to_co_trzeba

    To ciekaw jestem, skąd wiesz, że nie działa.

    Jeśli w programie jest coś jeszcze, to wklej łaskawie cały program i napisz, dlaczego uważasz, że nie działa.

    Proszę bardzo,

    #include <avr/io.h>
    #include <util/delay.h>

    int main(void)
    {

    DDRC=to_co_trzeba;

    while(1)
    {
    PORTC=to_co_trzeba;
    _delay_ms(tyle_co_trzeba);

    PORTC=to_co_trzeba;
    _delay_ms(tyle_co_trzeba);
    }
    }

    Od kumpla dostałem ten schemacik,taki jak w załączniku,połaczyłem wszystko i nic,jedna dioda świeci a dwie pozostałe nie świecą wogóle. :cry:

    A w sumie to po co ten program i te wszystkie krzaczki.
    Kiedyś jak polutowałem układ na dwóch tranzystorkach to ruszało mi to z miejsca.

    0
  • #18 16 Sty 2014 03:49
    dondu
    Moderator Mikrokontrolery Projektowanie

    PiotrekUK napisał:
    A w sumie to po co ten program i te wszystkie krzaczki.
    Kiedyś jak polutowałem układ na dwóch tranzystorkach to ruszało mi to z miejsca.

    To tak zrób i nie zawracaj sobie i nam głowy :)

    A jeśli jednak chcesz coś nowego się nauczyć, to podałem Ci link.
    Ale bez swojego wysiłku nie osiągniesz celu.

    0
  • #19 16 Sty 2014 08:53
    BlueDraco
    Specjalista - Mikrokontrolery

    Ten program ustawia stały stan linii portu C. W zależności od sposobu podłączenia LED będzei ona stale zgaszona lub stale zapalona. Na czym polega zauważone prze Ciebie niepoprawne działanie?

    Jeśli chcesz, żeby zamigało, zmień pętlę np. tak:

    while(1)
    {
    PORTC^=to_co_trzeba;
    _delay_ms(tyle_co_trzeba);
    }

    0