• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja zmiany stanu na wyjściu led_on(1);

Object Storage Arubacloud
0 głosów
197 wizyt
pytanie zadane 8 maja 2021 w Mikrokontrolery przez argentrol Nowicjusz (220 p.)

Witam Was.

Szczerze mówiąc, to przypuszczam, że odpowiedź na moje pytanie gdzieś na forum jest, tylko że ja nie wiem jak to pytanie dobrze zadać. Zaczynam z językiem C, uczę się programować na Atmedze i nie umiem jeszcze nazwać niektórych rzeczy "po imieniu".

Mam taki mały kod, ale ugrzęzłem na takim czymś:

Chciałbym w main.c użyć funkcji np. led_on(x); gdzie (x) ma oczywiście oznaczać nr diody (ale nie nr pinu!). W tej chwili mam to zrobione tak, że funkcja sprawdza to na zasadzie:

#define LED1 (1<<PD6)
#define LED2 (1<<PD5)
#define LED3 (1<<PD4)

#define LED1_ON PORTD |= LED1
#define LED1_OFF PORTD &= ~LED1
#define LED1_TOG PORTD ^= LED1
#define LED2_ON PORTD |= LED2
#define LED2_OFF PORTD &= ~LED2
#define LED2_TOG PORTD ^= LED2
#define LED3_ON PORTD |= LED3
#define LED3_OFF PORTD &= ~LED3
#define LED3_TOG PORTD ^= LED3


void led_on (uint8_t x){
	if(x==1) LED1_ON;
	else if(x==2)LED2_ON;
	else if(x==3)LED3_ON;
}

void led_off (uint8_t x){
	if(x==1) LED1_OFF;
	else if(x==2)LED2_OFF;
	else if(x==3)LED3_OFF;
}

void led_tog (uint8_t x){
	if(x==1) LED1_TOG;
	else if(x==2)LED2_TOG;
	else if(x==3)LED3_TOG;
}

 To na pewno da się zrobić jakoś mądrzej, żeby w przypadku konieczności użycia np. czwartej diody nie musieć dopisywać do każdej funkcji kolejnego "else if", dyrektyw preprocesora (wiem, że one akurat nie są konieczne) itd.

Kombinowałem z jakimiś składniami typu: zamiast LED1 to LED(x), próbowałem użyć tych makr dostępu do portów, kombinowałem jak użyć tablic... nie umiem nic mądrego wymyślić... crying 
Naprowadzi mnie ktoś na jakiś azymut?

Tylko bardzo proszę, jak najprostszym, lub chociaż w miarę prostym językiem... Dziękuję za wyrozumiałość...smiley

Bartek.

komentarz 9 maja 2021 przez Oscar Nałogowiec (29,290 p.)

Uniwersalną metodą jest użycie tablicy ze stałymi.

const uint8_t leds[] = { (1<<PD6), (1<<PD5), (1<<PD4) };

void led_on (uint8_t x) {
    PORTD |= leds[x];
}

Dla uproszczenia pominałem sprawdzanie zakresu.

W taki sposób sam decydujesz która dioda jaki ma numer.

Jeśli ledy nie są na tym samym porcie to można rozbudować tablicę (np zrobić tablice struktur).

 

1 odpowiedź

0 głosów
odpowiedź 12 maja 2021 przez argentrol Nowicjusz (220 p.)
Dziękuję. Jak zobaczyłem Twoją odpowiedź to trochę się zdziwiłem... że to jest AŻ TAK PROSTE!!! Chyba właśnie przez to nigdy bym na to nie wpadł. Podrasowałem to troszkę dyrektywami #define i jest dokładnie tak jak chciałem. Oczywiście na tej podstawie myślę, że bez większych problemów dorzucę drugą tablicę i będzie się dało zrobić to dla dowolnych portów.

Pozdrawiam!
komentarz 13 maja 2021 przez Oscar Nałogowiec (29,290 p.)

Albert Einstein podobno powiedział mniej więcej coś takiego:

Wszystko powinno być tak proste jak to tylko możliwe, ale nie bardziej.

W programowaniu, szczególnie takim niższego poziomu bardzo często stosuje się różne stałe tabelki, Daje to prosty, szybki i łatwo konfigurowalny kod. Pewnie spotkałeś lub zaraz napotkasz tabelki wyglądu znaków na wyświetlaczu 7-segmentowym itp. Jak budujesz układy na płytce stykowej lub deweloperskiej to łączysz wszystko drucikami. Wtedy jest wszystko jedno, które punkty trzeba połączyć. Kiedyś będziesz projektował płytki drukowane, wtedy warto połączyć elementy jak jest wygodniej poprowadzić ścieżki, a odpowiednie zmiany zrobić w kodzie - w odpowiednich tabelkach.

komentarz 13 maja 2021 przez argentrol Nowicjusz (220 p.)
Chyba pierwsze dwa układy zmontowałem na płytce stykowej i Atmedze8, ale dotarło do mnie, że się zamęczę i zrobiłem sobie na płytce taki mini zestaw uruchomieniowy, bardzo prosty, ale jest na nim stabilizator, dioda debuger, klawisz resetu, kilka przycisków i porty na goldpinach. Zamontowałem też na nim MAX485 bo chciałem rozkminić coś jakby modbus, kilka komend do falownika, ale zapomniałem o MAX232 i teraz z 485 nie korzystam, a 232 mam na płytce stykowej obok... taka sytuacja...
Ale faktycznie, wiem o czym piszesz. Z tym, że ja prędzej połapię się przestrzennie, np. na płytce niż ogarnę te meandry powiązań w C... ale Slight Edge-owo powinno w końcu poukładać się w głowie nawet to...

Podobne pytania

+1 głos
0 odpowiedzi 440 wizyt
pytanie zadane 2 czerwca 2021 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
1 odpowiedź 604 wizyt
pytanie zadane 6 kwietnia 2018 w JavaScript przez JSJerry Początkujący (260 p.)
+1 głos
1 odpowiedź 587 wizyt
pytanie zadane 24 stycznia 2021 w C i C++ przez hicodyn Początkujący (420 p.)

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...