Skocz do zawartości

[C] AVR - obsługa wyświetlacza LCD


Pomocna odpowiedź

Napisano

Witam, mam pytanie odnośnie fragmentu kodu

Wyslij_do_LCD:

void Wyslij_do_LCD(int8_t bajt)
{
PORT_LCD|=_BV(EN_LCD);

PORT_LCD=(bajt & 0xF0) | (PORT_LCD & 0x0F);

PORT_LCD&=~(_BV(EN_LCD));
}

mam pytanie która/ skąd zostanie wzięta zawartość PORT_LCD podkreślona na czerwono, jaką ona ma wartość?

Fragment kodu z książki "AVR & ARM7 programowanie uC dla każdego" str. 253

jaką wartość wczyta PORT_LCD?

w markrodefinicji jest napisane:

#define PORT_LCD PORTB

wiem że pod PORT_LCD podstawi PORTB ale mnie interesuje skąd tę wartość weźmie, jaka tam będzie wartość bitowa (zero/jedynkowa)?

Wszystko zależy od typu procesora na jaki kompilujesz kod. Przecież kompilator nic nie wie o adresach jakiegokolwiek rejestru peryferyjnego a do kompilacji każdego pliku startuje z "czystą kartką" nie znając żadnych symboli (oprócz kilku wbudowanych). Twoje środowisko (IDE - np. Arduino, Eclipse czy Atmel Studio) musiałeś jakoś powiadomić na jaki procesor chcesz otrzymać kod i to ono załatwiło to, że oprócz Twojego pliku dołączanych jest - trochę automatycznie - wiele różnych plików nagłówkowych typu h. Jeden z nich musi zawierać definicje wszystkiego co siedzi w procesorze: rejestrów portów, położenia bitów, wielkości dostępnej pamięci itp, itd.. Sprawdź na jaki procesor masz ustawione środowisko i znajdź odpowiedni dla niego plik h. Będziesz w nim miał setki linii #define. Będzie też oczywiście ta definiująca wartość symbolu PORTB a potem po nitce do kłębka. Jeżeli środowisko jest w miarę nowe, wspiera automatyczne wskazywanie definicji i miejsc użycia symboli więc - tak jak pisze Chumanista - tam wystarczy najechać myszą i kliknąć odpowiednią pozycję z menu kontekstowego, a do edytora zostanie załadowany i pokazany odpowiedni plik z definicją.

dzięki za informacje, przyznam że nie wiedziałem o tym. Uczę się programowania z wspomnianej książki ale nie trafiłem tam na informacje że PORTB ukryty jest w bibliotece i przyjmuje tam jakąś konkretną wartość, do tej pory postrzegałem to że to ja nadaję rejestrowi POTR jakąś wartość.

Ale człowiek mało wie, szkoda że podręcznik nie podaje takich rzeczy

Ależ nadajesz mu jakąż wartość. W bibliotekach jest tylko informacja gdzie ten rejestr faktycznie jest, to się zmienia w zależności od tego jakiego procesora używasz. PORTB to uniwersalna nazwa pod którą biblioteka odpowiednia do procesora podstawia fizyczny adres rejestru.

PORT_LCD=(bajt & 0xF0) | (PORT_LCD & 0x0F);

czyli w miejsce (PORT_LCD & 0x0f) zostanie podstawiona wartość 0x18, tak?

Nie. Zostanie podstawione (o ile masz taki sam procesor jak ja):

_SFR_IO8(0x18)

Pod co zostanie podstawione:

_MMIO_BYTE((0x18) + __SFR_OFFSET)

Pod co zostanie podstawione:

(*(volatile uint8_t *)(((0x18) + 0x20))

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...