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

[M32][Bascom] Minutnik do jajek - prośba o sprawdzenie programu

Antystatyczny 28 Cze 2012 22:06 1916 7
  • #1 11052901
    Antystatyczny
    Poziom 16  
    Witam.

    Napisałem taki oto program, który generalnie działa, choć nie ma jeszcze obsługi alarmu dzwiękowego. Bardzo proszę o zerknięcie i stwierdzenie, czy jest napisany optymalnie.
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam.

    Dodano po 1 [godziny] 17 [minuty]:

    Teraz mam w miarę gotowy kod:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Po odliczeniu ustawionego czasu włacza się buzzer. Generalnie jestem zadowolony z programu, nadal proszę o odpowiedzi w kwestii optymalizacji kodu. Jak rozwiązujecie sprawę migania dwukropka?
  • #2 11053621
    FastProject
    Poziom 28  
    Samo wykorzystanie M32 do minutnika jajek jest już nieekonomiczne, ale zakładam, że taki masz procesor na stanie.

    Po pierwszej nie używaj takich warunków...

    Kod: text
    Zaloguj się, aby zobaczyć kod


    zrób:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    ..stosowanie And w instrukcjach If generuje więcej kodu.

    Po 2 odliczanie czasy i odejmowanie sekund można zrobić na po cosekundowym przerwaniu. Musisz odpowiednio ustawić któryś z timerów (Timere1 np) jego prascaler.

    Multiplex wydaje mi się dziwny, ale nie widzę schematu i nie wiem gdzie masz podłączone wyświetlacze.

    Cytat:
    Jak rozwiązujecie sprawę migania dwukropka?

    Ja zazwyczaj dwukropek też robię w multipleksie (gdy nie mam wolnych pinów uP) łącząc go z pinem sterującym kropką wyświetlaczy i włączam podczas wyświetlania wyświetlacza, w którym ta kropka nie jest wykorzystywana.

    Ty możesz to zrobić na dowolnym pinie bo z M32 zostało ci kupę wolnych pinów.
  • #3 11055584
    Antystatyczny
    Poziom 16  
    Bardzo dziękuję za krytykę.

    Zamiast operatora AND mam zbudować zagnieżdżone pętle. Wykorzystuję timer2, bo w M32 mam możliwość taktowania go zewnętrznym kwarcem (w moim przypadku 32768), ale docelowo będzie to pracowało w M8, więc program będę musiał delikatnie skorygować. Co do przerwania cosekundowego:
    -nie znalazłem metody na uzyskanie takowego, bo: 8MHz/1024/256=30, czyli 30 przepełnień na sekundę.
    -obecne rozwiązanie załatwia dwie sprawy, tzn. mutipleks i odliczanie sekund.

    Wyświetlacz mam ze wspólną anodą. Anody są podłączone do portu PC7-4, a katody do portu PA0-7.

    W sprawie dwukropka chodziło mi o jego miganie z częstotliwością np. 1Hz. Obecnie świeci się światłem ciągłym. Dwukropek mam wbudowany w wyświetlacz i jest multipleksowany jak reszta segmentów.
  • #4 11055610
    FastProject
    Poziom 28  
    Zrób tak jak napisałem i porównaj wynik kompilacji przed i po zmianie If.

    Owszem Timer2 posiada funkcje RTC ale twoja realizacja z Goto nie zapewnie timerowi właściwej dokładności.

    Nie wiem co ty tu liczysz " 8MHz/1024/256=30, czyli 30 przepełnień na sekundę. " ale policz to:
    - timer1
    - prescaler 256
    - kwarc 8MHz
    - włączone przerwania
    - w przerwaniu ładujesz do timera wartość 34286

    Co ile masz wtedy przerwanie?

    Nie dałeś schematu, niecałkowicie opisałeś cały twój układ wiec nie widzę sensu ani chęci na dalszą pomoc.
  • #5 11055705
    Antystatyczny
    Poziom 16  
    Schematu nie posiadam, bo nie opanowałem jak dotąd obsługi programu Eagle (mam za sobą dopiero dwie marne próby). Odnośnie obliczenia:

    8MHz - aktualna prędkość procesora
    256 - ilość kroków timera do momentu wystąpienia przepełnienia
    1024 - preskaler
    Pisząc tę odpowiedź zrozumiałem, że popełniam błąd, bo timer2 jest 16 bitowy.
    Oczywiście zastosuję proponowane zmiany. Dziękuję za udzieloną pomoc :)
  • #6 11055731
    FastProject
    Poziom 28  
    Antystatyczny napisał:

    Pisząc tę odpowiedź zrozumiałem, że popełniam błąd, bo timer2 jest 16 bitowy.


    No właśnie jesteś w błędzie...Timer2 jest timerem 8-bitowym.
  • #7 11055789
    Antystatyczny
    Poziom 16  
    Zerknąłem w PDF i faktycznie, 16 bitowy jest jedynie timer1

    Jak zatem wpisać w timer2 liczbę przewyższającą wartość 255? Skoro jest 8 bitowy...

    Dodano po 2 [minuty]:

    Zakręcony dziś jestem. Przecież była mowa o timer1!

    Dodano po 38 [minuty]:

    Nie mogę tego zrobic na timer1, bo on nie umożliwia taktowania go z zewnętrznego kwarcu. Zarówno M32 jak i M8 mają jedynie timer2 przystosowany do pracy z zewnętrznym kwarcem.
    Czy zastosowanie do until zamiast goto etykieta zwiekszy dokładność odmierzania czasu?

    Dodano po 3 [minuty]:

    timer2 sterowany kwarcem 32768:
    preskaler 128
    32768/256/128=1

    Dobrze to liczę?
    Wyszło, że mam przepełnienie co sekundę
  • #8 11058831
    Antystatyczny
    Poziom 16  
    Zamykam w związku z brakiem zainteresowania
REKLAMA