Witam proszę o sprawdzenie kodu który ma za zadanie włączać i wyłączać dwie diody co sekundę .
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.
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ł .
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.
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?
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;
PiotrekUK napisał:Początkujący programista od wczoraj.
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.
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.
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.
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);
}