Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

BASCOM AVR obsługa wyświetlacza LCD + DS18B20 + PCF8583

mateusz19955 23 Mar 2013 13:24 3633 16
  • #1
    mateusz19955
    Level 13  
    Witam!

    Uczę się programowania w BASCOM i mam problem z procedurami.
    Chciałem sobie napisać procedurę tak jak w kodzie, który podałem niżej aby zwiększać wartość zmiennej A.
    Program działa, zmienna się zwiększa ale wyświetlacz jakoś dziwnie mruga.
    Gdy procedurę wyjmę z pętli to jest dobrze z wyświetlaczem, ale za to zmienną A zlicza tylko od zera do jednego.

    Co jest źle napisane?

    Code: basic4gl
    Log in, to see the code
  • #3
    mateusz19955
    Level 13  
    Dzięki, wyświetlacz już nie mruga, ale za to koło zmiennej na wyświetlaczu pojawiają się taki białe prostokąty.
    Co zrobić aby ich nie było?

    Dodano po 2 [minuty]:

    Ok, niema już problemu z niczym.
    Dzięki za pomoc.

    Dodano po 20 [minuty]:

    Jednak jeszcze jest jeden problem.
    Gdy zwiększam zmienną A to ma być ona zliczona do 24.
    Jeżeli wartość jest większa niż 24 to ma być zero.
    Ok, to działa.
    Ale gdy chcę zmniejszać zmienną A i gdy ona dojdzie do zera to ma się na tym zerze zatrzymać.
    A tu jest problem bo ona gdy dojdzie już do zera zaczyna zliczać 95, 93... itd.
    Co zrobić aby tak nie zliczała?

    Code: basic4gl
    Log in, to see the code
  • Helpful post
    #4
    M. S.
    Level 34  
    Trzeba dopisać warunek co ma uC zrobić jak zmienna osiągnie "0".

    Mikroprocesorowi musisz wskazać jak się ma zachować w każdej z możliwych sytuacji bo on niestety nie chce myśleć za Ciebie.
  • Helpful post
    #5
    User removed account
    User removed account  
  • #7
    mateusz19955
    Level 13  
    Witam ponownie,

    Może mi ktoś poweidzieć co jest źle, bo mryga mi cały czas napis z tej linijki:
    Lcd "0" ; Chr(1) ; "C 10" ; Chr(1) ; "C 20" ; Chr(1) ; "C 30".
    Jeżeli nikt nie będzie wiedział o co chodzi w tym programie to jutro dodam filmik z tego programu.

    Code: basic4gl
    Log in, to see the code

    Pozdrawiam
    Mateusz.
  • #8
    emarcus
    Level 38  
    mateusz19955 wrote:
    Witam ponownie,

    Może mi ktoś poweidzieć co jest źle, bo mryga mi cały czas napis z tej linijki:
    Lcd "0" ; Chr(1) ; "C 10" ; Chr(1) ; "C 20" ; Chr(1) ; "C 30".


    Chodzi tu zapewne o graficzne przedstawienie na alfanumerycznym LCD wartości "Wart_temp" (temperatura(?)
    Pomysł nie jest wcale zły, ale gorzej z jego realizacją.
    Ogólnie brak jest poprawnej synchronizacji położenia suwaka z legendą przedstawioną w linii drugiej. Pomijam tu ujemne wartości opisu legendy (brak liniowości).
    W pierwszej części programu masz warunek:
    If Wart_temp >= 0 then..........

    natomiast druga częśc zawiera:
    If Wart_temp > 30 Then..........
    który praktycznie jest spełniony również w warunku poprzednim, dlatego te wyswietlenia są pomieszane ze sobą.
    Spróbuj zmienic pierwszy warunek na:

    If Wart_temp >= 0 And Wart_temp < 30 Then
    a drugi na:

    Elseif Wart_temp > 30 Then

    Dobrym przykładem do przestudiowania może byc program na ADC ze strony:
    http://www.avrprojects.net/attachments/ad_convertor.bas

    e marcus
  • #9
    mateusz19955
    Level 13  
    Mam jeszcze problem z multipleksowaniem wyświetlaczy 7-seg.
    Napisałem sobie taki program żeby co sekundę zwiększała mi się wartość zmiennej "wysw" i zmienna ta zwiększa swoją wartość.
    Tylko jest taki problem, że wyświetlacze zachowują się dziwnie.
    Wyświetlacz jedności działa normalnie a wyświetlacz dziesiątek strasznie słabo świeci (praktycznie wcale go nie widać). Cyferki zmieniają się na nim ale do tego, że słabo bardzo świeci to jeszcze mruga jak na wyświetlaczu jedności zmienia się cyfra.
    Co może być źle napisane?

    Oto kod:
    Code: basic4gl
    Log in, to see the code
  • #10
    sp3ots
    Level 38  
    Witam !
    Jak usuniesz te linie:
    Incr Wysw
    Wait 1
    Gosub Wyswietlanie
    czy wyświetlanie jest poprawne (00) ?, zera nie pulsują ?
    Zastanów się nad "wait 1" czy to zamienić ?
    Pozdrawiam. Stefan
  • #12
    emarcus
    Level 38  
    mateusz19955 wrote:
    Jak to usunę to jest tak samo.

    zamiast wait 1 sec;
    W przerwaniu od timera0 icrementuj zmienną np "S" i gdy ona osiągnie S=250 postaw flagę Fsec, wyzeruj zmienną S.
    W do....Loop
    If Fsec =1 , wyzeruj tą flagę i incrementuj 'Wysw'.
    Dalej, przenieś wszystkie rachunki i 'lookups' do petli głównej pozostawiając w subrytynie 'wyswietlanie' tylko multiplexing z porawnie kluczowanymi wyjściami B0 i B1. W obecnym programie masz momenty że ta sama data jest podawana na obie cyfry równocześnie, co właśnie jest przyczyną błędów.

    e marcus
  • #13
    mateusz19955
    Level 13  
    Witam,

    Chciałem sobie napisać program do obsługi PCF8583 i DS18B20.
    Popróbowałem trochę i wyszło mi coś takiego:

    Code: basic4gl
    Log in, to see the code


    Termometr DS18B20 działa ale PCF8583 nie mogę sprawdzić bo jeszcze go nie kupiłem.
    Może mi ktoś sprawdzić czy ten kod jest poprawnie napisany?
    Oczywiście nie chodzi mi o to aby ktoś specjalnie programował procesor tylko o to aby przeczytał ten kod i powiedział czy jest dobrze napisany, a jeżeli nie to powiedzieć dlaczego.
    BASCOM kompiluje go bez żadnych błędów.

    Pozdrawiam.
  • #14
    emarcus
    Level 38  
    mateusz19955 wrote:
    Witam,

    Chciałem sobie napisać program do obsługi PCF8583 i DS18B20.
    Popróbowałem trochę i wyszło mi coś takiego:

    Code: basic4gl
    Log in, to see the code



    Może mi ktoś sprawdzić czy ten kod jest poprawnie napisany?
    Oczywiście nie chodzi mi o to aby ktoś specjalnie programował procesor tylko o to aby przeczytał ten kod i powiedział czy jest dobrze napisany, a jeżeli nie to powiedzieć dlaczego.
    BASCOM kompiluje go bez żadnych błędów.

    Pozdrawiam.

    Kod nie jest poprawny.
    Z listingu powyżej pozostawiłem tylko znaczące tytuły do których odnosi się moja opinia.
    Masz tam kilka "SUB" i subrytyn (labels) do których nie ma w programie odwołań, inaczej mówiąc nie są one w żaden sposób uruchamiane. Bascom je pomija tak samo jak 'rem' i dlatego nie zwraca 'errors' przy kompilowaniu.
    Jedyne wywołanie ostatniej label 'wyswietlanie' masz wykorzystane przy wyświetleniu temperatury, ale już nie nastąpi wywołanie z sub odczyt bo nawet tam nie masz wejścia./

    e marcus
  • #15
    mateusz19955
    Level 13  
    Kolego emarcus, mógłbyś mi ten kod doprowadzić do poprawnej postaci i wystawić tu na elektrodzie?
    Przeanalizował bym sobie swoje błędy i później może bym ich nie popełniał przy pisaniu następnych programów.
  • #16
    emarcus
    Level 38  
    mateusz19955 wrote:
    Kolego emarcus, mugłbyś mi ten kod doprowadzić do poprawnej postaci i wystawić tu na elektrodzie?


    Nie ma takiej potrzeby...
    Ten przykad (zasadnicza częśc, z którą masz problem), masz gotowy na twoim komputerze...... (o czym pewnie nie wiesz).
    Poszukaj, (jeżeli Win7) :
    C:\Program Files (x86)\MCS Electronics\BASCOM-AVR\SAMPLES\I2C\clock.bas
    albo
    C:\users\.........\Documents\MCS Electronics\BASCOM-AVR\Samples\I2C\clock.bas

    e marcus
  • #17
    mateusz19955
    Level 13  
    Witam,

    A czy ten kod jest poprawnie napisany?

    Code: basic4gl
    Log in, to see the code


    Jeżeli nie to niech ktoś poprawi, bo ja nie wiem co tu jeszcze poprawiać.
    Kod działa, zajmuje 2,5kB pamięci.

    Pozdrawiam.