logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega8] - Jak zaprogramować diodę, aby migała tylko 3 razy po naciśnięciu przycisku?

12 Gru 2015 22:00 1140 18
  • #1 15235020
    Konto nie istnieje
    Konto nie istnieje  
  • #2 15235084
    szczywronek
    Poziom 28  
    Cześć!
    1. Nie definiuj F_CPU w kodzie programu tylko w ustawieniach projektu. Lekturka.
    2. Na początku programu nie musisz zerować bitów rejestrów portów - one są wyzerowane po resecie.
    3. Nie podałeś informacji o konfiguracji sprzętowej - gdzie są podłączone diody, przycisk. Bez tego trzeba domyślać się z kodu a czasem w kodzie są pomylone wyprowadzenia - bez schematu forumowicze tego nie wyłapią ;)
    4. Zamiast tego wewnętrznego warunku (jeśli bit był ustawiony to go wyczyść, jeśli nie to ustaw), możesz zastosować operację:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    która spowoduje zanegowanie aktualnego stanu bitu.
    5. Piszesz o trzech mignięciach - jak realizujesz to w programie? Po co w ogóle jest zmienna tmp?
    6. Poczytaj o eliminacji drgań styków: klik.
    7. Zegar RTC nie jest Ci potrzebny.
    8. Masz właściwie problem z czasem migania diody (jak wynika z tytułu), czy ilością mignięć (jak wynika z treści posta)?
  • #3 15235124
    Konto nie istnieje
    Konto nie istnieje  
  • #4 15235332
    szczywronek
    Poziom 28  
    nor222 napisał:
    Wzorowalem sie na podobnym programie znalezionym kiedys na necie
    Wierz lub nie, ale to prawie nigdy się dobrze nie kończy ;) Po co jest ten warunek?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Najprostszy sposób na trzy mignięcia:
    - zapal diodę
    - poczekaj chwilę
    - zgaś diodę
    - poczekaj chwilę
    - zapal diodę
    - poczekaj chwilę
    - zgaś diodę
    - poczekaj chwilę
    - zapal diodę
    - poczekaj chwilę
    - zgaś diodę

    Jak już to będzie działało, to pomyślimy jak można zrobić bardziej elegancko ;)
  • #5 15235687
    Konto nie istnieje
    Konto nie istnieje  
  • #6 15235892
    szczywronek
    Poziom 28  
    :spoko:

    Te trzy mignięcia to mają być tylko jeden raz po włączeniu układu, czy po każdym naciśnięciu przycisku?

    W ramach "bardziej elegancko": zrób funkcję, która będzie odpowiedzialna za jedno mignięcie (czyli zapali, poczeka, zgasi, poczeka). Potem wyrzuć ten długaśny kawałek odpowiedzialny za trzy mignięcia i zamiast niego, trzy razy, wywołaj swoją funkcję.
    W kolejnym kroku - zamień trzy wywołania funkcji na małą pętelkę (np. opartą o wyrażenie for), która trzy razy wywoła Twoją funkcję.
  • #7 15235967
    Konto nie istnieje
    Konto nie istnieje  
  • #9 15236039
    Konto nie istnieje
    Konto nie istnieje  
  • #10 15236240
    Konto nie istnieje
    Poziom 1  
  • #11 15236279
    Konto nie istnieje
    Konto nie istnieje  
  • #12 15236307
    Konto nie istnieje
    Poziom 1  
  • #13 15236338
    Konto nie istnieje
    Konto nie istnieje  
  • #15 15236699
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #16 15236734
    szczywronek
    Poziom 28  
    Tzn. chciałeś "przypisać" zmiennej x operację PORTB ^= 1<<PB0? Jeśli tak to: pomysł sensowny, ale niestety gwałcący zasady języka C ;) Mignięcie diody miało być w funkcji, która będzie kilka razy wywoływana w pętli, czyli chodziło mi o coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zdecydowanie powinieneś pogłębić wiedzę na temat C, jeśli nie chcesz działać na "chybił trafił!
  • #17 15236819
    Konto nie istnieje
    Konto nie istnieje  
  • #18 15236897
    szczywronek
    Poziom 28  
    Pudło. To są "dodatkowe" nazwy typów zmiennych występujących w języku C. Np.:

    uint8_t: u - unsigned (bez znaku), int - integer (liczba całkowita), 8 - rozmiar (8 bitów)
    int32_t: liczba całkowita (ze znakiem, bo na początku nie ma "u"), rozmiar 32 bity

    Chodzi m.in. o to, aby uzyskać zmienną o konkretnym rozmiarze. W GCC dla AVR typ int ma 2B (16 bitów), ale już dla ARMa to będą 4B (64 bity). Stosując te symboliczne nazwy (np. uint32_t) masz gwarancję, że rozmiar zmiennej będzie taki jak zaplanowałeś, bez względu na sprzęt i kompilator. Kod jest bardziej uniwersalny i od razu widać jakiej wielkości jest zmienna.

    Lekturka na wieczór: pierwszy link z googli po wyszukaniu "uint8_t".
  • #19 15239330
    dondu
    Moderator na urlopie...
    nor222 napisał:
    Wiem musze bardziej sie przylozyc :)

    Przyłóż się najpier do czytania i stosowania tego co podpowiadając ci forumowicze:

    szczywronek napisał:
    1. Nie definiuj F_CPU w kodzie programu tylko w ustawieniach projektu. Lekturka.

    ... bo bez sensu jest Ci podpowiadać, skoro nie stosujesz się do zaleceń.

    nor222 napisał:
    A co wlasnie tutaj chodzi z tym uint8_t ? bo za bardzo nie wiem do czego to sluzyc ? wiem ze 8 to cos powiazenego z Atmega8, tak ?

    Kursy C z kompilatorem online CManiak: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html
    kurs AVR: http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html
    i reszta w spisie treści powyższej strony.
REKLAMA