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.

Nie działa makro do ustawiania DDR

kubajak 25 Kwi 2017 14:39 1140 13
  • #1 25 Kwi 2017 14:39
    kubajak
    Poziom 9  

    Witam.

    Korzystam z układu ATMEGA8515.
    Mam dziwny problem z ustawieniem portów jako wyjścia.
    W pliku z rozszerzeniem test.h mam zdefiniowane proste komendy


    Kod: c
    Zaloguj się, aby zobaczyć kod



    Następnie w funkcji main coś takiego


    Kod: c
    Zaloguj się, aby zobaczyć kod



    Po skompilowaniu i załadowaniu porty które powinny się ustawić jako wyjścia mają wartość nieustalona (ok 0,3V) a chyba powinny mieć ok 5V.

    Jeśli w funkcji main ( zamiast DDR_OUT() ) na sztywno ustawię DDRA = 0xff; oraz DDRB = 0xff to wszystko działa jak należy.

    0 13
  • #2 25 Kwi 2017 16:28
    adamekp
    Poziom 15  

    A gdzie deklaracja funkcji "void DDR_OUT(void)"?

    0
  • #3 25 Kwi 2017 16:31
    2675900
    Użytkownik usunął konto  
  • #4 25 Kwi 2017 19:22
    BlueDraco
    Specjalista - Mikrokontrolery

    I pomyśleć, że gdyby nie te piękne makra, cały program mógłby być tak paskudnie krótki:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    A najgorsze, że nie byłoby jak podzielić go wtedy na dwa pliki.

    0
  • #5 25 Kwi 2017 19:43
    kubajak
    Poziom 9  

    Przedstawione dane stanowią jedynie ułamek całego kodu, a pokazany przykład zawiera esencję problemu. Ponadto gdyby w programie były błędy jak np. brak deklaracji kompilator by wykazał błąd podczas kompilacji. Proszę o rzeczowe odpowiedzi.

    0
  • #6 25 Kwi 2017 19:52
    2675900
    Użytkownik usunął konto  
  • #7 25 Kwi 2017 20:25
    grko
    Poziom 33  

    BlueDraco napisał:

    A najgorsze, że nie byłoby jak podzielić go wtedy na dwa pliki.


    Aż strach pomyśleć jak wyglądają Twoje programy zapisane tylko w maini.c. Plus jeden do designu oprogramowania. Idąc Twoja logiką możnaby zapisać ten program w jednej linii. Jakby nie działał to od razu wiadomo w której linii jest błąd.

    Cytat:

    Zastąp ten fragment tym co @BlueDraco napisał. Jak nie zadziała to znaczy że pomyliłeś nóżki.


    Niby po co? Przecież napisał, że jak wpisze 0xFF to działa więc nie wiem w czym to pomaga.

    @kubajak Kilka hintów:
    1. Nie pisz tego typu makr. Niech mają jakieś znaczenie jeżeli już musisz. Coś w stylu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Zauważ, że nie ma średnika na końcu. Obliguje to użytkownika takiego makra do postawienia średnika po użyciu. Wieloliniowe makra zamykaj w do {} while (0). W tym konkretnym przypadku i tak lepiej napisać funkcję inline.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    2. Definicje od atmela typu: PA0, PB5 itd są bez sensu. Nie dość, że redundantne (PA0, PB0 idt to to samo) to nigdy nie pamiętam czy PA0 to 0 czy (1 << 0).

    3. Jeżeli chcesz mieć funkcję w nagłówku to dodaj do niej static inline. Jej nazwa nie powinna być zapisana wielkimi literami. Te zarezerwowane są dla makr. Istnieje niebezpieczeństwo, że w swoim kodzie będziesz miał makro i funkcję to tej samej nazwie. Może to prowadzić do błędów bardzo trudnych do wykrycia.

    0
  • #8 25 Kwi 2017 20:50
    Freddie Chopin
    Specjalista - Mikrokontrolery

    grko napisał:
    Aż strach pomyśleć jak wyglądają Twoje programy zapisane tylko w maini.c. Plus jeden do designu oprogramowania. Idąc Twoja logiką możnaby zapisać ten program w jednej linii. Jakby nie działał to od razu wiadomo w której linii jest błąd.

    No i jeszcze pamiętajmy o tym, że to programy na 18000 linii, które zajmują i tak mniej niż 32kB ograniczenia z Keila. Może motto przewodnie to tutaj "jeden program - jeden plik - jedna funkcja"? (;

    0
  • #9 25 Kwi 2017 21:15
    BlueDraco
    Specjalista - Mikrokontrolery

    Ciekawe macie te motta i pomysły. Ja mam zupełnie inne, ale fajnie poczytać wypowiedzi ał-torytetów. ;)

    0
  • #10 25 Kwi 2017 21:30
    2675900
    Użytkownik usunął konto  
  • #11 25 Kwi 2017 21:40
    grko
    Poziom 33  

    Piotrus_999 napisał:

    Rzeczywiście nazwa makra wszystko tłumaczy.


    Nazwa RESET_PIN_CONFIG jest tylko przykładem nadającym sens niektórym makrom. Nie wiem czego z tej nazwy nie rozumiesz? Może pomogę Ci i przez analogię stworzymy nową nazwę LED0_PIN_CONFIG. Voilà. Z resztą pójdzie Ci już łatwiej.

    Piotrus_999 napisał:

    Taaa 0xff wyraznie pokazuje który pin został ustawiony.


    No pokazuje wyraźnie. Widzisz jakiś ewidentny błąd w kodzie autora, który by dowodził, że te jego makra nie działają? Nie wiem co miałoby tu pomóc zapisanie tego ala BlueDraco w jednej linii?

    0
  • #12 25 Kwi 2017 21:46
    2675900
    Użytkownik usunął konto  
  • #13 25 Kwi 2017 21:58
    grko
    Poziom 33  

    A kod autora niejednoznacznie ustawia te piny czy jak? Gdzie widzisz błąd? Bo na moje oko jeden i drugi kod realizuje w zasadzie to samo. Jedyna różnica to |= w przypadku kodu autora oraz zwykłe przypisanie w przypadku kodu BD. Czy jakbym użył adresu zamiast DDRA to kod byłby jeszcze bardziej jednoznaczny czy nie?

    Więc albo rzeczywiście autor pomylił piny albo jakimś dziwnym sposobem DDR_OUT jest gdzieś przedefiniowane i konfiguracja pinów wogóle się nie wykonuje (to raczej mało prawdopodobne).

    0
  • #14 26 Kwi 2017 01:55
    2675900
    Użytkownik usunął konto