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.

Prosty program "mruganie diodą" nie do końca działa jak powinien.

Adi162 06 Lip 2017 12:10 978 7
  • #1 06 Lip 2017 12:10
    Adi162
    Poziom 10  

    Witam
    Ostatnio zacząłem programować w C. Program niżej
    Po wgraniu go do uC guzik(PC1) nie jest wciśnięty a więc dioda nie mruga. Jeżeli wcisnę guzik to dioda zaczyna mrugać więc program działa tak jak powinien, natomiast gdy guzik zostaje puszczony to wtedy dioda dalej mruga. Nie rozumiem tego zjawiska ponieważ wewnętrznie dioda jest podciągnięta do VCC. Testowo podpiąłem od PC1 rezystor 10k do VCC i teraz program działa tak jak zakładałem. Czy jest to spowodowane złym napisaniem programu ? Z góry dziękuję za pomoc.


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 7
  • #2 06 Lip 2017 12:19
    dondu
    Moderator Mikrokontrolery Projektowanie

    Wpisując coś do rejestru za pomocą operatora przypisania = zerujesz przy okazji wcześniej ustawione tam inne bity.
    Jeśli więc włączyłeś rezystor pull-up na bicie 0x02, a w pętli głównej ustawasz:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    to jednocześnie wyłączasz pull-up zerując bit 0x02.
    Ponieważ wyłączyłeś rezystor pull-up to pin z przyciskiem nie działa prawidłowo. Dlatego też dołączenie zewnętrznego rezystora pomogło.

    Zamiast operatora = powinieneś stosować:
    - ustawianie bity: |=
    - zerowanie bitu: &=~
    - zmiana bitu na stan przeciwny: ^=

    Szczegóły w kursie C: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html

    Zaglądnij także do spisu treści powyższej strony.

    0
  • #3 07 Lip 2017 17:25
    Adi162
    Poziom 10  

    Witam znowu
    Zastosowałem się do sposobu pisania jaki poradziłeś i mój kod wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jednak nie mogę go skompilować ponieważ wyskakuje błąd: Ivalue required as left operand of assignment.
    Błąd wskazuje na te trzy linijki:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Używam programu AVR Studio

    0
  • #4 07 Lip 2017 17:41
    landy13
    Poziom 29  

    #define zm_led1 PORTC ^= led1 oznacza, że preprocesor zamiast zm_led1 wstawi PORTC ^= led1


    Czyli: linia PORTC |= zm_led1; zostanie rozwinięta do: PORTC |= PORTC ^= led1;

    Chyba nie tego chciałeś.

    0
  • #5 07 Lip 2017 18:11
    JacekCz
    Poziom 36  

    landy13 napisał:
    #define zm_led1 PORTC ^= led1 oznacza, że preprocesor zamiast zm_led1 wstawi PORTC ^= led1


    Czyli: linia PORTC |= zm_led1; zostanie rozwinięta do: PORTC |= PORTC ^= led1;

    Chyba nie tego chciałeś.

    Zgadza się.

    W programowaniu z użyciem #define trudno mówić o naprawdę dobrym stylu (przynajmniej o poczuciu kontroli, bezpieczeństwa podstawień, typów etc, etc jak mają nowsze języki), można mówić o najmniej złym.

    Mniej zła wersja
    Kod: c
    Zaloguj się, aby zobaczyć kod

    to coś w rodzaju

    Kod: c
    Zaloguj się, aby zobaczyć kod


    a) zwyczajowo makra piszemy wielkimi literami
    b) czytelniejsze makro typu proceduralnego piszemy z nawiasami (choćby pustymi)
    c) część algorytmiczną piszemy w klamrowych, aby kompilator lepiej przypilnował. Wyjadacze C zaproponują znacznie bardziej udoskonalaną wersję(z if albo do ) ale w moim odczuciu należy od tego uchodzić, a nie ulepszać.
    Triki b) oraz c) mogą nieco pomóc z tym l-value (kompilator czytelnie zasygnalizuje problem). L-value to jest właśnie 'takie coś' co jest dozwolone z lewej strony podstawienia.

    Od zaledwie 20 lat kompilatory C mają funkcje inline, a NAWET jakby nie miało, GCC stojące za AVR studio bardzo skutecznie optymalizuje narzut zw wywołaniem funkcji. Nie piszesz która wersja tego Studio. Bardzo polecam wydzielać do normalnych funkcji C

    Aha, jeszcze jedno. Ja nieodmiennie stoję na stanowisku: najpierw nauka C jako takiego (na pececie), potem wyprawa na mikroprocesory. Nie da się skutecznie uczyć dwóch rzeczy na raz, to się nie układa w głowie w prawidłowe koncepcje, najwyżej zlepek słabo rozumianych fragmentarycznych pomysłów, co jest syntaktyką i semantyką C, co jest specyfiką mikroprocesora

    EDIT: złe (a jest ich wiele) przykładów w języku C od producenta procesora nie powoduje, że zły przykład staje się dobrym.

    0
  • #6 12 Lip 2017 13:48
    Adi162
    Poziom 10  

    Witam.
    Ostatnio cały czas myślę o małym problemie który mnie spotkał mianowicie postawiłem sobie za zadanie mruganie trzema diodami tylko że każda na innym porcie. Wszystko (no prawie) działa bez zarzutu. Problem tkwi w tym że jedna dioda jest na PB1 a guzik na PB0. gdy przytrzymam guzik wtedy diody na PC0 i PD5 mrugają a na PB1 nie. Gdy zmieniłem PB1 na PB6 dla testu to dioda działa. Nie mam pojęcia co jest nie tak z 15-stą nóżką atmegi328 że nie działa bo funkcje dla niej to: PCINT1, OC1A i PWM

    0
  • #8 12 Lip 2017 18:28
    Adi162
    Poziom 10  

    Sprostowanie
    Błąd wykryty program działa, za fatygę dziękuję. oto program:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Mam jeszcze małe pytanie do wszystkich którzy znają się na programowaniu dłuższy czas jak według was wygląda program w dobrym stylu bo zacząłem się zastanawiać po wypowiedzi JackaCz.

    0