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.

[ATmega8][Bascom] zegarek na PCF8583 - Menu nie działa

MICHAŁ6201 26 Sie 2013 21:28 3303 22
  • #1 26 Sie 2013 21:28
    MICHAŁ6201
    Poziom 16  

    Witam wszystkich
    Zacząłem tworzyć mój pierwszy tak rozbudowany program - zegarek na pcf8583, atmega 8 z wewnętrznym taktowaniem zegara 1MHz.

    Problem w tym, iż nie działa menu, które próbuję uruchomić. Bez menu mogę zmieniać godziny i minuty za pomocą 2 przycisków. Jak dołożę menu moje, to nie działa zmienianie czasu.

    Wygląda to tak, że wchodzę w podprogram zmiany czasu i wszystko się zatrzymuje. Nie ma możliwości zmiany czasu ani powrotu do podstawowego trybu pracy czyli wyświetlania czasu i temperatur.

    W załączeniu przesyłam kod mojego programu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Czemu tak się blokuje program?
    Jak można zrobić takie menu? Proszę Was o dokładne wytłumaczenie jak się robi takie menu.
    Z góry dziękuję.
    Pozdrawiam

    0 22
  • #2 28 Sie 2013 11:18
    yokoon
    Poziom 28  

    Witam.

    Masz podprogram Sub Ustaw(),ale nie widzę byś z niego korzystał.

    Wywołuje się go chyba przez polecenie CALL Ustaw().


    Kolego, zapomniałeś o "Debounce" - regulamin p.3.1.11
    [zumek]


    Nie rozumiem co ma wspólnego wywołanie podprogramu z "Debounce".

    0
  • #3 28 Sie 2013 16:45
    emarcus
    Poziom 35  

    MICHAŁ6201 napisał:
    Witam wszystkich


    Wygląda to tak, że wchodzę w podprogram zmiany czasu i wszystko się zatrzymuje. Nie ma możliwości zmiany czasu ani powrotu do podstawowego trybu pracy czyli wyświetlania czasu i temperatur.

    W załączeniu przesyłam kod mojego programu:
    Code

    $regfile = "m8def.dat"
    $crystal = 1000000
    $hwstack = ?
    $swstack = ?
    $framesize =?

    ................

    Do
    ..................

    Debounce K3 , 0 , Ustaw , Sub
    ..................

    Sub Ustaw()
    Tryb_pracy = 1
    Gosub Czysc_ekran
    Do
    Gosub Czysc_ekran
    Gosub Ustawienie_zegara
    Waitms 25
    If K1 = 0 Then
    Waitms 50 : Bitwait K1 , Set : Gosub Zapis_minut
    End If
    If K2 = 0 Then
    Waitms 50 : Bitwait K2 , Set : Gosub Zapis_godzin
    End If
    Waitms 25
    If K3 = 0 Then
    Wait 1
    If K3 = 0 Then
    Tryb_pracy = 0

    'tu dodaj exit Do
    End Sub


    Czemu tak się blokuje program?
    Jak można zrobić takie menu? Proszę Was o dokładne wytłumaczenie jak się robi takie menu.
    Z góry dziękuję.
    Pozdrawiam


    Pierwsze co rzuca się w oczy to stosujesz zbyt dużo niepotrzebnych 'gosub'.
    Każdy 'gosub' powoduje odłożenie na stack co najmniej adresu powrotu. Nie byłoby w tym wiele złego gdyby to było doraźne "tam i z pwrotem", wtedy stack jest zwrócony....itd., ale ty stosujesz wielostopniowy 'nesting' , a wtedy stack rozrasta się. Jeżeli nie masz w opcjach przeznaczone odpowiedniej ilosci RAMu na SWstack, HWstack to może prowadzic do sytuacji, że odłożone tam wartości są nadpisywane przez kolejne [], co w przypadku powrotu z subrutyny wiedzie program w złe miejsce i nastąpi 'crash"(zawieszenie).
    Inna przyczyna to zwróc uwagę na twoją "Sub Ustaw()"
    Bez problemu wchodzisz w niej w nieskończoną pętlę 'Do/Loop', Robisz z niej 'gosuby' (nesting, o czym wyżej), ale nie masz możliwości wyjśc z tej pętli i zakończyc 'Sub' , a w konsekwencji powrócic do programu głównego.

    e marcus

    0
  • #4 28 Sie 2013 17:31
    zumek
    Poziom 39  

    yokoon napisał:

    Nie rozumiem co ma wspólnego wywołanie podprogramu z "Debounce".


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    A teraz :?: Rozumiesz :?:

    0
  • #5 29 Sie 2013 16:38
    yokoon
    Poziom 28  

    Tak.
    źle to odczytałem.

    0
  • #6 01 Wrz 2013 13:25
    MICHAŁ6201
    Poziom 16  

    OK. Zlikwidowałem skakanie do "gosub", ale nadal nie wiem jak się robi menu.

    Czy Ktoś z Was potrafi mi wytłumaczyć krok po kroku jak to zrobić najprościej?

    Nie chodzi mi o to, aby ktoś zrobił mi gotowca, bo nie robię tego dla sztuki, tylko po to aby się nauczyć i poszerzyć wiedzę.

    Jakoś nie potrafię sobie tego wyobrazić jak to ma wyglądać. Nie prosiłbym o to tutaj gdyby ktokolwiek w internecie czy jakiejkolwiek książce opisał to. Mam książki z wydawnictwa BTC i również tam nie ma nigdzie opisane jak zrobić menu.

    A może ktoś z Was nauczy mnie tego za odpłatnością?

    Dodano po 1 [godziny] 5 [minuty]:

    [quote="yokoon"]Witam.

    Masz podprogram Sub Ustaw(),ale nie widzę byś z niego korzystał.

    Wywołuje się go chyba przez polecenie CALL Ustaw().

    A gdzie to CALL Ustaw() wstawia się w programie?

    Jak to wygląda?

    0
  • #7 01 Wrz 2013 18:22
    emarcus
    Poziom 35  

    MICHAŁ6201 napisał:
    OK. Zlikwidowałem skakanie do "gosub", ale nadal nie wiem jak się robi menu.

    Czy Ktoś z Was potrafi mi wytłumaczyć ......

    .................

    Jak to wygląda?


    Mniej, wiecej tak jak zacząłeś. Chodzi o to abyś mógł powrócic do programu z uruchomionej subrutyny stanowiącej twoje menu lub jego częśc .
    Normalnie, powrót z subrutyny jest dokonany poprzez 'Return' lub 'End SUB' lecz jeżeli w subrutynie masz umieszczoną petlę nieskończoną "Do/Loop" to do tych komend nie dochodzisz i potrzebujesz gdzieś w niej wstawic Exit do i wtedy dojdziesz do Return np:


    Sub Ustaw()
    Do
    '...................
    '.................
    IF K3 = 0 then
    Tryb_pracy = 0
    '..........
    exit do
    end if
    Loop
    porównaj z tym przykładem:
    https://www.elektroda.pl/rtvforum/topic2554551.html#12244870

    Cytat:


    A gdzie to CALL Ustaw() wstawia się w programie?


    Normalnie wstawiasz gdziekolwiek; lecz jednak wtedy gdy potrzebujesz wywołac tę subrutyne. Może to byc w Do/Loop albo w innej części programu np:.

    Do
    ............

    If K3=0 then
    Call Ustaw
    ....
    end if
    .....
    Loop
    W nowszej versji kompilatora Bascom pomija się słowo "Call" - wystarcza wpis tylko nazwy np;
    ustaw
    lecz w części nagłówkowej/konfiguracyjnej programu winno byc umieszczone:
    Config Submode = New

    U ciebie masz to w "DEBOUNCE" co w efekcie jest to samo.


    e marcus

    0
  • #8 10 Wrz 2013 20:34
    MICHAŁ6201
    Poziom 16  

    Menu udało mi się zrobić jako skok do podprogramu i tam wszystko ustawiam, po czym wracam do głównej pętli i jest ok.

    Zrobiłem regulację jasności podświetlenia LCD za pomocą PWM. Regulacja ta jest zrobiona w zakresie od 0 do 250. Chciałbym to ustawienie zapisywać w eepromie 24C02. Tylko nie bardzo wiem jak to ma wyglądać. Czy to będzie tak samo zrobione jak ustawienie i zapis godziny w pcf?

    Dla 24C02 adresy to będą 172 i 173?

    0
  • #10 11 Wrz 2013 08:55
    zumek
    Poziom 39  

    MICHAŁ6201 napisał:
    ... Chciałbym to ustawienie zapisywać w eepromie 24C02.

    A co jest powodem tego, że nie chcesz wykorzystać pamięci eeprom w ATMegaósemce :?:

    0
  • #11 11 Wrz 2013 19:19
    MICHAŁ6201
    Poziom 16  

    Powód jest prosty :)
    Cały czas się uczę bascoma i chcę dowiedzieć się jak najwięcej. Wiem że można to zrobić zapisując w eepromie procka ale chciałby wiedzieć jak to się zapisuje do eepromu zewnętrznego.

    Przypuśćmy że są takie układy w których bardzo często zapisuje się nowe ustawienia i wtedy najlepszym rozwiązaniem jest zapis do pamięci zewnętrznej, którą łatwiej wymienić niż procek zwłaszcza jeśli jest to obudowa smd.

    Wie ktoś z Was jakie są adresy zapisu i odczytu 24C02?
    W PCF8583 mam adresy 160 161.

    Jednak nie działa program z 24c02 i PCF. Chyba coś jest namieszane z adresami ale niestety w tych notach katalogowych nigdzie nie widzę jakie to ma adresy zapisu i odczytu. Użyłem adresów 172 i 173 DLA 24C02 ale blokuje działanie zegarka.

    0
  • #13 11 Wrz 2013 20:50
    MICHAŁ6201
    Poziom 16  

    Piny A0,A1,A2,WP mam podciągnięte do masy.
    To jakie mogą być adresy, żeby nie kolidowało to z PCF8583?

    Dla PCF8583 z pinem A0 podpiętym do masy mam adresy 160 i 161.

    A jakie będą adresy kostki np. 24C02 Z pinami A0,A1,A2 podpiętymi do masy?
    Może być też dowolna inna pamięć 24CXX.

    Z tego datadcheeta nie potrafię niestety odczytać tych adresów.

    0
  • #15 11 Wrz 2013 21:14
    MICHAŁ6201
    Poziom 16  

    Ale problem w tym, że nie rozumiem tego rysunku. Patrzę na to i nic mi to nie mówi. Gdybym wiedział jak to doczytać z tych rysunków, to bym nie pytał tutaj.

    Adresy PCF8583 znalazłem w necie, ktoś opisał to na swojej stronie i stąd je mam. Natomiast opisu adresów tych eepromów nie znalazłem.

    Zrozum mnie, nie jestem ani elektronikiem, ani inżynierem. Jestem samoukiem, więc sporo rzeczy nie rozumiem, takich jak np. te rysuneczki na stronie 11.

    Albo zróbmy tak:

    Wytłumacz mi najprościej jak się da, jak odczytać te adresy z takich dziwnych rysunków, a ja sam spróbuję odczytać i powiesz mi czy dobrze:)

    0
  • Pomocny post
    #16 11 Wrz 2013 21:25
    piotrva
    Moderator na urlopie...

    No właśnie chcę żebyś zrozumiał - wiesz jak raz zrozumiesz to potem wszystko będziesz dał radę zrobić sam i chyba satysfakcja też większa ;)

    Ja też, patrząc na mnie całkiem na zimno, jestem samoukiem ;) Też zaczynałem od różnych pytań - możesz sam sobie poczytać i pośmiać się z moich pierwszych postów na forum.

    A więc ten rysunek pokazuje poszczególne bity adresu.
    Pamięć AT24C02 ma 2Kb, więc interesuje nas pierwszy rysunek

    Code:

    [ 1][ 0][ 1][ 0][A2][A1][A0][RW]

    Wartości pierwszych bitów są stałe - więc początek jest jasny.
    Następnie wszystkie piny A2-A0 masz podpięte do masy, więc mamy:
    Code:

    [ 1][ 0][ 1][ 0][ 0][ 0][ 0][RW]

    Dalej bit RW przyjmuje 1 dla adresu do odczytu i 0 dla adresu do zapisu, zatem w notacji binarnej mamy następujące adresy:
    10100000(2) = 160(10) - zapis
    10100001(2) = 161(10) - odczyt

    Czyli źle - zegarek ma taki sam adres. W związku z tym podepnijmy A2 do VCC, natomiast A1 i A0 do GND

    Code:

    [ 1][ 0][ 1][ 0][ 1][ 0][ 0][RW]


    Teraz mamy:
    10101000(2) = 168(10) - zapis
    10101001(2) = 169(10) - odczyt

    Czyli fajnie - nie ma konfliktu adresu z zegarkiem PCF8583.

    Podobny rysunek jest też gdzieś w nocie zegarka - na jego podstawie możesz w podobny sposób wyliczyć adresy dla połączenia pinu A0 zegarka do masy lub zasilania - jeśli możesz to zrób to w ramach podziękowania za wyjaśnienie ;)

    0
  • #17 11 Wrz 2013 21:33
    MICHAŁ6201
    Poziom 16  

    Bardzo Ci dziękuję za przejrzyste wyjaśnienie jak czytać te rysunki i wreszcie wszystko jasne :)

    Co do PCF8583, to:

    Dla pinu A0 podciągniętego do VCC

    ZAPIS - 162
    ODCZYT - 163

    Dla pinu A0 podciągniętego do GND

    ZAPIS - 160
    ODCZYT - 161

    0
  • #18 11 Wrz 2013 21:38
    piotrva
    Moderator na urlopie...

    No i o to chodziło ;)
    Teraz widzisz, że albo możesz zmienić połączenie pinów adresowych pamięci AT24C02, albo pinu adresowego zegarka PCF8583, aby uniknąć konfliktu.

    Dodam tylko, jeśli kiedyś byś zmieniał pamięci na większe z tej serii - zauważ, że potem w przypadku pamięci AT24C04/08/16 piny adresowe tracą swoją funkcjonalność - zamiast tego te bity adresu wykorzystywane są do adresowania "stron" w pamięci. Można to interpretować jako kilka układów AT24C02 zamkniętych w jednej obudowie, w których odpowiednie piny podpięte są na zmianę do VCC i GND - przez to w przypadku pamięci 24C16 nie da się uniknąć konfliktu z zegarkiem PCF8583 - wtedy warto zastosować inne modele pamięci, które funkcje adresowania kolejnych bloków pamięci mają zrealizowaną za pomocą wysyłania na początku transmisji 2 zamiast 1 bajta adresu.

    0
  • #19 12 Wrz 2013 10:29
    MICHAŁ6201
    Poziom 16  

    Jeszcze jedno mam pytanie:

    Zapis ustawienia jasności podswietlenia będę robił przy wyjściu z menu.
    A gdzie zrobić odczyt ustawionej wartości? Na poczatku głownej pętli programu? Bo myślałem też o tym, aby zrobić odczyt ustawionej wartości przed glówną pętlą, ale wtedy żeby zaczytała się nowo ustawiona wartość, musiałbym resetować procka. Dobrze rozumuję? Więc pozostaje odczytanie nowo ustawionej wartości pwm w głównej pętli?

    Rozumiem, że wartość w zakresie 0 - 250 z pwm zmieści się do AT24C02?

    0
  • #20 12 Wrz 2013 10:53
    piotrva
    Moderator na urlopie...

    Zapis rób przy wyjściu z menu, odczyt przed pętlą główną, a bieżące zmiany od razu podczas pracy menu ładuj do PWM - nie ma sensu robić czegoś takiego: Nastawa->EEPROM; EEPROM->PWM. Zamiast tego: Nastawa->PWM i zaraz potem Nastawa->EEPROM;

    Pamięci AT24CXX zorganizowane są bajtami - w jednej komórce zatem przechowasz 1 bajt.

    0
  • #21 12 Wrz 2013 20:30
    MICHAŁ6201
    Poziom 16  

    Nie wiem co źle robię, ale nie zapisuje się ustawienie do pamięci.

    Przed główną pętlą zrobiłem w następujący sposób odczyt:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    A zapisywanie ustawień w menu zrobiłem tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Co zrobiłem źle?

    Układ zachowuje się tak samo z 24c02 jak i bez tego scalaka. Tak jakby go nie było. Może coś z tymi adresami jest pomotane?

    A2 podciągnąłem do vcc, a A1,A0,WP podciągnąłem do GND

    0
  • #23 12 Wrz 2013 21:36
    MICHAŁ6201
    Poziom 16  

    Zamieniłem adresy, ale niestety bez zmian.
    Coś musi być źle, ale co?

    Co zauważyłem, to za każdym razem program ustawia max wartość pwm1a czyli 250.
    Może ja coś źle w kodzie zrobiłem?

    A może wartości pwm nie da się zapisać w eepromie? Bo próbowałem na różne sposoby i za każdym razem to samo - nie pamięta ustawienia zewnętrzny eeprom.

    0