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

Termometr lcd atmega8-dziwne znaczki

rambo83 07 Lis 2011 23:03 9303 43
  • #1 10114863
    rambo83
    Poziom 12  
    Witam

    Jakiś czas temu zrobiłem sobie na w/w układzie termometr mierzący dwie temperatury do auta. Zdarza się czasem, iż po znaku stopnia celsjiusza pojawiają się jakieś literki. Załączam zdjęcie w celu ukazania problemu.Czy może to mieć związek z zakłóceniami na przewodach?

    Termometr lcd atmega8-dziwne znaczki
  • #2 10115079
    Konto nie istnieje
    Konto nie istnieje  
  • #3 10115710
    rambo83
    Poziom 12  
    Kod i schemat by Duch zaczerpnięty z elektrody :

    https://www.elektroda.pl/rtvforum/topic811706.html

    Nie zdarza się to często, lecz losowo- raz pojawi się a raz długo nie. Zdarza się też czasem że zewnętrzna temperatura pokazuje 0.0 - czy to oznacza że mam gdzieś zwarice?
  • #4 10115877
    arktik1
    Poziom 27  
    Myślę że jest to kwestia połączeń.
  • #5 10118954
    WOBI
    Poziom 19  
    Podaj swój kod, tam w poście jest kilka różnych kodów i nikt nie jest duchem by domyślać sie który używasz, tak ciężko wkleić kod, jeśli chcesz pomocy to podaj kod.

    Uważam że masz błąd w swoim programie z pozycjonowaniem napisów na LCD a to częsty błąd przy pisaniu programów.
  • #6 10119611
    manekinen
    Poziom 29  
    Moja wróżba: W skutek zakłóceń do wyświetlacza wpisują się na krótką chwilę jakieś głupoty, potem trafiają poprawne dane, ale że nie czyścisz lub nie nadpisujesz ostatniego znaku, to te krzaczki nie mają jak później zniknąć. Po znaku celcjusza wysyłaj jeszcze spację i problem powinien zniknąć.

    0.0 dla temperatury zewnętrznej wskazywałoby na jakieś zawilgocenie przewodów przy czujniku.

    Nie wiem też po co to dzielenie przez 16 w kodzie, przecież wystarczy przesunąć zmienną o 4 bity w prawo, a kod zmaleje w oczach :)

    //edit

    albertb - oops, nie spojrzałem na typ zmiennej :oops:
  • #7 10119657
    Konto nie istnieje
    Konto nie istnieje  
  • #8 10120361
    WOBI
    Poziom 19  
    Zmień fragment kodu programu na:

     
    *
    *
       Locate 1 , 1
       Lcd "Temp.wew: " ; Ss ; Chr(0) ; "C " 
    
    *
    *
    *
    
       Locate 2 , 1 
       Lcd "Temp.zew: " ; Ss ; Chr(0) ; "C " 
    
    


    lub tak będzie u Ciebie:

     
    *
    *
       Locate 1 , 1
       Lcd " Temp.wew " ; Ss ; Chr(0) ; " " 
    
    *
    *
    *
    
       Locate 2 , 1 
       Lcd " Temp.zew " ; Ss ; Chr(0) ; " " 
    
    





    dodałem spacje czyli znak 20hex do znaku C co jest na końcu wyświetlacza, znak spacji będzie wykasowywał te przypadkowe znaki, bo tam masz puste pole i powinna tam byc wpisywana spacja.

    Dokładnie masz wyświetlacz 2x16 znaków, a wpisujesz, używasz do niego tylko 15 znaków, kursor pozostaje na 16 znaku i jak przychodzą zakłócenia to tam właśnie sie pojawia to o czym piszesz czyli przypadkowe znaki. Spacja za każdym razem ustawi kursor poza 16 widzialnym obszarem i nie będzie juz tego problemu choć zakłócenia zostaną ;)

    Dlatego pisałem pokaz ten fragment kodu to by sie okazało że nie piszesz juz nic do LCD po Chr(0),. Czy mam rację ??
  • #9 10154994
    rambo83
    Poziom 12  
    Witam

    Ostatnimi czasy nie miałem jak sprawdzić kodu (nie pamiętam który kod wsadziłem do atmegi ), a ponieważ urządzenie jest zamontowane w aucie-trzeba je wpierw zdemontować - w weekend się tym zajmę i sprawdzę jak zachowuje się w domu. Poza tym poczytałem trochę jak prawidłowo podłączać atmegę (zasilanie, filtry) i chyba tego nie zrobiłem co także może wpływać na zakłócenia (może się mylę).

    Czy istnieje możliwość odczytu procka do postaci kodu (kod był bascom)?
  • #10 10158087
    Konto nie istnieje
    Konto nie istnieje  
  • #11 10158732
    WOBI
    Poziom 19  
    Cytat:
    Czy istnieje możliwość odczytu procka do postaci kodu (kod był bascom)?
    Cytat:


    Odczytaj plik z Atmegi i zapisz go na dysku a potem porównaj z plikami wynikowymi z bascoma, ten który będzie taki sam z odczytanym, wskaże który program wpisałeś do procka.

    Tak jak pisałem dodaj spacje po znaku C bo tam stoi kursor i zakłócenia tam sie pokazują, widać to na Twoim zdjęciu LCD, że program używa 15 znaków.
  • #12 10158981
    Konto nie istnieje
    Konto nie istnieje  
  • #13 10171663
    rambo83
    Poziom 12  
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Znalazłem kod który siedział w atmedze. Na dodatek urządzenie (płytka) jest bez jakichkolwiek filtrów ani na zasilaniu ani na atmedze, piny wolne też pewnie nie są zaprogramowane, brak połączenia z masą nieużywanych pinów lcd. Jak w kodzie podciągnąć piny pod "1" - czytałem że dobrze jest to zrobić wtedy nieużywane piny nie ściągają zakłóceń. Reszta nieużywanych pinów lcd do masy też dać?
  • #14 10172439
    Konto nie istnieje
    Konto nie istnieje  
  • #15 10174381
    WOBI
    Poziom 19  
    Teraz widać że nie pozycjonujesz napisów na LCD

    ma być tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    wprowadź to do programu i zaprogramuj procesor a sie przekonasz.
  • #16 10175358
    rambo83
    Poziom 12  
    Witam

    Pojawił się problem, ponieważ po ponownym zaprogramowaniu proca, lcd wyswietla mi tylko jedną górną linię (problem był opisywany w postach by Duch, ale nie podali sensownego rozwiązania). Dodam że kiedyś tez mi się to zdarzyło i chyba wtedy coś nie łączyło, ale teraz mam wszystko podłączone. Może być źle zaprogramowana atmega?
  • #17 10175611
    Konto nie istnieje
    Konto nie istnieje  
  • #18 10176387
    WOBI
    Poziom 19  
    Poprawiłem kod, cos mi sie wydaje że to nie jest ten co był w procesorze i dlatego nie wyświetla drugiej linijki.

    Podaj jaki numer wersji Bascoma używasz?

    Sprawdzilem na mojej płytce prototypowej i wszystko działa.
    Wykasowałem to co było niepotrzebne a ta pętla next nie działała bo źle jest napisana, trzeba inaczej ostrzeżenie o śliskości ułożyć. na razie jest bez niej.

    Poprawiłem wszystkie napisy na LCD wyśrodkowanie i wypozycjonowane dla LCD 2x16 znaków. Dodałem tez pierwszą konwersję by pierwszy wynik pomiaru był juz wyświetlany prawidłowo.

    
    $regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
    $crystal = 1000000 'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
    'Deklaracja portów od wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
    
    Config Lcd = 16 * 2                                         'ustawiamy typ wyświetlacza
    
    '*************************************WAŻNE**********************************************
    'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
    Config 1wire = Portd.5 'deklaracja portu na którym będą podpięte DS18b20
    
    Dim I1 As Integer 
    Dim I2 As Integer
    Dim Ss As String * 6
    
    
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim B As Byte 'deklaracja zmiennej do odczytu kodów ID
    Dim W As Word 'deklaracja zmiennej do odczytu ilośc czujników
    
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32 'znak stopnia Celsjusza
    
    Cursor Off 
    Cls 
    
    Lcd "GOLF III 1.9 TDI"                                     'ekran startowy (pojawia się tylko podczas włączania urządzenia)
    Lowerline
    Lcd "  WITAJ SZEFIE  "
    Wait 5
    Cls
    W = 1wirecount()
    Lcd "Ilosc czujek: " 'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
    Waitms 500
    Lcd W
    Wait 2
    Cls 'Znajdź pierwszy czujnik podpięty do portu
    Dsid1(1) = 1wsearchfirst() 'Znajdź kolejny czujnik podpięty do portu
    Dsid2(1) = 1wsearchnext() 'Znajdź kolejny czujnik podpięty do portu
    
    '*******************Odczyt numerów ID czujników temperatury*********************
    
    If Dsid1(8) = Crc8(dsid1(1) , 7) Then 'ta opcja pojawia się tylko przy włączaniu urządzenia
    Locate 1 , 1
    Lcd " OK Czujnik 1 ID"
    
    Locate 2 , 1
    For B = 1 To 8
    Lcd Hex(dsid1(b))
    Next
    End If
    Wait 2
    
    Cls
    
    If Dsid2(8) = Crc8(dsid2(1) , 7) Then
    Locate 1 , 1
    Lcd " OK Czujnik 2 ID"
    
    Locate 2 , 1
    For B = 1 To 8
    Lcd Hex(dsid2(b))
    Next
    End If
    wait 2
    
    Cls
    
    '*******************koniec odczytu ID czujników temperatury*********************
    
    Do
    
    1wreset
    1wwrite &HCC   
    1wwrite &H44    '--------konwersja temp dla wszystkich dsow
                           '  pierwsza konwersja po wlaczeniu zasilana DS daje 85st, by wynik był prawidłowy, musi byc pierwsza
    Wait 1
    
    1wreset
    1wwrite &H55
    1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika
    1wwrite &HBE
    I1 = 1wread(2)
    '---------------------------------
    1wreset
    1wwrite &H55
    1wverify Dsid2(1) 'wysylam adres drugiego czujnika
    1wwrite &HBE
    I2 = 1wread(2)
    
    I1 = I1 * 10
    I1 = I1 / 16
    
    Ss = Str(i1)
    Ss = Format(ss , " 0.0")
    Locate 1 , 1
    Lcd " TEMP Zew " ; Ss ; Chr(0) ; "  "
    
    
    I2 = I2 * 10
    I2 = I2 / 16
    
    Ss = Str(i2)
    Ss = Format(ss , " 0.0")
    Locate 2 , 1
    Lcd " TEMP Wew " ; Ss ; Chr(0) ; "  "
    
    
    Loop
    
    
  • #19 10178851
    Konto nie istnieje
    Konto nie istnieje  
  • #20 10178918
    rambo83
    Poziom 12  
    Witam

    Kod wyżej jest mój ale nie ja go zmieniałem. Wczoraj nie mogłem nawet zaprogramować atmegi(chyba jedną uwaliłem bo wyświetla mi monit -couldn't find ... FFFFFF). Teraz też już wiem że instrukcja for byłą źle napisana i już przerabiałem na if. Dziś rano udało mi się wgrać kod do drugiej atmegi, ale nadal miałem tylko jedną linię wyświetlaną. Jak wrócę z roboty to posiedzę nad Twoimi informacjami i dodam to co mówiłeś , żeby dodać (konfiguracja lcd, wejścia itp). Dam znać oczywiście co i jak.


    Pozdrawiam
  • #21 10179211
    Konto nie istnieje
    Konto nie istnieje  
  • #22 10179230
    excray
    Poziom 41  
    Tudzież wtedy jeszcze można "skoczyć" do kogoś kto ma programator równoległy. Mu fusebity niegroźne.
  • #23 10179332
    modymat
    Poziom 13  
    Dlaczego ustawiony pin reset jako port to aż taki wielki problem?
  • #24 10179347
    dondu
    Moderator na urlopie...
    modymat napisał:
    Dlaczego ustawiony pin reset jako port to aż taki wielki problem?

    O ile dobrze pamiętam, funkcję pinu RESET ustawia się to fusebitami, a programator szeregowy ISP potrzebuje ten pin do programowania jako pin RESET. Innymi słowy jeżeli wyłączysz fusebitami pin RESET to ISP nie będzie mógł już programować tego układu, tylko programator równoległy.

    Cytat:
    When programming the RSTDISBL Fuse Parallel Programming has to be used to change fuses or perform further programming.
  • #25 10179425
    WOBI
    Poziom 19  
    Tu masz fragment z prawidłowym pozycjonowaniem temperatury, położenie stC i pozycja przecinka będzie w stałym miejscu bo w twoim kodzie zależnie od ilości cyfr i czy jest temperatura dodatnia lub ujemna cały napis przesuwa sie w twoim kodzie i jedna pozycje to w prawo to w lewo. Tu jeż będzie na stałej pozycji.

    Pomysł z wyświetlaniem "ślisko nie jest dobry bo nie będziesz miał odczytu temperatury jak będzie ujemna. To trzeba zrobić by ostrzeżenie wyswietlało się na przemian z temperaturą lub tak jak koledzy radzą zastosowac diodę LED czerwoną do ostrzegania, ale to już pomyśl sam ja zrobić

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #26 10179545
    Konto nie istnieje
    Konto nie istnieje  
  • #28 10180026
    excray
    Poziom 41  
    dondu napisał:
    Czas na zmiany ... C
    :)

    Z ASM na C w celu oszczędzania pamięci to trochę jak z samochodu na rower się przesiadać i jeździć po autostradzie. :P
  • #29 10180158
    dondu
    Moderator na urlopie...
    excray napisał:
    Z ASM na C w celu oszczędzania pamięci to trochę jak z samochodu na rower się przesiadać i jeździć po autostradzie. :P

    Autor wspominał o BASCOM + ASM i nazwał to rzeźnią.
    Ten sam kod ASM można wstawić w C i już rzeźni nie będzie. :)
    Dodatkowo jest spore prawdopodobieństwo, że C się wyrobi bez wstawek ASM.
  • #30 10180684
    WOBI
    Poziom 19  
    Można robic pozycjonowanie na 100 różnych sposobów to był tylko przykład i jeśli to wystarczy i nie trzeba nic dodawać do programu to tak jak wyżej też może być.

    Ale dla tych co lubią mieć mniej kodu to przykład pozycjonowania bez Format.

    Ech zawsze kręcą nosem a sami nic konkretnego nie napiszą...

    Kod: text
    Zaloguj się, aby zobaczyć kod
REKLAMA