Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[AVR][C]-wielokrotne przekazywanie portu jako parametru funkcji

06 Mar 2012 01:05 2118 8
  • Poziom 30  
    Witam
    Na podstawie http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass chciałem zrobić przekazywanie parametru do funkcji, którym jest adres portu. Dla jednorazowego przekazania tego parametru do funkcji sposób działa jednak ja mam pytanie co w zrobić w sytuacji, gdy przekazuję parametr funkcji, którym jest właśnie dany port uP do jednej funkcji a ta przekazuje go dalej. Robiłem analogicznie do instrukcji z linku powyżej jednak program nie działa.
    Proszę o pomoc.
    Chcę uzyskać coś takiego:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jednak sposób nie działa, co robię źle?
  • Poziom 21  
    Do funkcji Read_DS18B20 przekazujesz wskaźnik na port, i w tej funkcji masz już wskaźnik na port to po co znowu dajesz &port, wystarczy dać sprawdz=RESET_PULSE(port,iw_pin);
  • Poziom 38  
    A czym się objawia to niedziałanie ?
  • Poziom 38  
    Najwyraźniej obsługa one wire jest zła, a nie złe przekazywanie parametrów.
  • Poziom 30  
    Obsługa jest poprawna, używam jej od 2 lat i nie ma z nią problemów, problemy powstały gdy zacząłem kombinować z czujnikami podłączanymi do niezależnych linii procesora. Wiem, że traci tu sens sama magistrala 1Wire jednak takie rozwiązanie było konieczne (nie trzeba wprowadzać ręcznie adresów czy chociażby przypisywać konkretnych adresów do konkretnych zmiennych w programie). Jeszcze w poprzednim urządzeniu, gdy wszystkie czujniki były podłączone pod ten sam port i różniły się tylko numerem bitu było ok.

    Dodano po 1 [godziny] 6 [minuty]:

    W tej chwili aby ruszyć z innymi elementami programu powieliłem dodatkowo wszystkie funkcje do obsługi 1-wire. Wygląda to beznadziejne ale działa poprawnie. Tu znalazłem podobny problem https://www.elektroda.pl/rtvforum/topic2031118.html jednak u mnie wszystko rozbija się o to, że jedna funkcja przekazuje pewne parametry dalej. Dla przykłądu funkcja Read_DS18B20 przyjąć musi zmienną port,pin i je przekazać do send_byte, ta dalej do send_bit.
    W podanym linku wspomniano o strukturze aby nie przekazywać wszystkich trzech parametrów do funkcji, ja używam makr:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dzięki czemu muszę podawać do funkcji już 2 parametry, port i pin a to już dla mnie jest dość wygodne.
  • Pomocny post
    Poziom 39  
    Karol966 napisał:
    ... ja używam makr:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Te makra, to są Ci potrzebne jak umarłemu kadzidło :D
    Zastanów się, pomyśl, poczytaj, co to jest makro, do czego służy , z czym to się je i co się z nim dzieje w trakcie kompilacji.

    A sprawa z przekazywaniem adresów portów do funkcji, jest śmiesznie prosta- mały - przykładzik:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 30  
    W końcu to sprawdziłem ;) Dziękuję za pomoc. Niby proste jednak sobie nie radziłem, teraz wygląda na to, że jest OK.
    Makra i tak pozostawiłem. O ile dobrze wyczytałem to na etapie kompilacji wszystko co jest danym makrem zostaje wstawione we właściwym miejscu. Uważa kolega, że to nie potrzebne jednak z mojego punktu widzenia zapis:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a następnie użycue
    Kod: c
    Zaloguj się, aby zobaczyć kod

    jest dużo bardziej zrozumiały niż
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Oba oznaczają to samo jednak nie każdy musi pamiętać, że adres rejestru DDRx dla danego portu jest o jeden wcześniej niż adres rejestru PORTx
    Jeżeli coś źle rozumuję to poprosił bym o nakierowanie :)