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

[Atmega 8] [Bascom] mruga pomiar temperatury

yokoon 02 Gru 2008 20:25 4727 27
REKLAMA
  • #1 5810207
    yokoon
    Poziom 29  
    Witam.
    Skompilowałem i wgrałem program pomiar temperatury z DS18B20 do mikrokontrolerów Attiny 2313 i Atmega 8. Przy Attiny 2313 temp. jest wyświetlana prawidłowo natomiast przy Atmedze mruga. Zmienałem częstotliwość oscylatora wewnętrznego na 8 MHz, nic to nie pomogło.
    Program jest ze strony portalu naukowego, wyswietlacz LCD 2 *16.
    Co może być przyczyną ?
  • REKLAMA
  • #2 5810264
    mr.box
    Poziom 15  
    O ile mnie pamięć nie myli ( mogę się mylić ) to w Atmedze wewnętrzny oscylator można ustawić max-ymalnie na 4 Mhz. Może zmieniłeś taktowanie TYLKO programowo, a nie zmieniłeś Fuse Bitów, w efekcie nie zmieniłeś ŻADNEGO taktowania. Najlepiej było by też jak byś zamieścił kod. Być może w pętli programu jest niepotrzebny "Cls" który może powodować "mruganie" wyświetlacza.
    Pozdrawiam
  • #3 5810335
    yokoon
    Poziom 29  
    Panowie to jest ten sam program dla obu mikrokontrolerów, fuse bity ustawione zgodnie z $crystal. Przy Attinie nie mruga.
  • #4 5810416
    wader_669
    Poziom 28  
    moze pokaz pierw program
  • REKLAMA
  • #5 5810494
    yokoon
    Poziom 29  
    wader_669 napisał:
    moze pokaz pierw program


    Myślę, iż nie ma sensu ponieważ był juz na elektrodzie i jest na www.portalnaukowy.edu.pl
  • REKLAMA
  • #6 5810522
    don diego
    Poziom 32  
    Programu napisanego pod ATmege8 nie można bezpośrednio wrzucić na ATtiny i odwrotnie. Pokaż lepiej oba swoje programy, bo link, który podałeś nie działa.

    Dodano po 2 [minuty]:

    Trzeba pewnie przynajmniej zmienić dyrektywę $regfile definiującą typ mikrokontrolera.
  • #7 5810625
    Seba319
    Poziom 24  
    mr.box napisał:
    O ile mnie pamięć nie myli ( mogę się mylić ) to w Atmedze wewnętrzny oscylator można ustawić max-ymalnie na 4 Mhz.


    Niestety pamięć czasem zawodzi ;) Można do 8MHz.

    yokoon -> Bez programu raczej niewiele możemy Ci pomoc bo trudno powiedzieć gdzie tkwi błąd.
  • REKLAMA
  • #8 5811131
    wader_669
    Poziom 28  
    kurde ale nikt nie bedzie szukal kodu zeby ci pomoc. Powinienes jako pierwsze wrzucic kod
  • #9 5813151
    yokoon
    Poziom 29  
    Witam.
    Oto KOD:

    'Jednopunktowy termometr z czujnikiem DS18B20
    'www.portalnaukowy.edu.pl
    'Program na podstawie kursu z książki "Mikrokontrolery dla Początkujących" Pana Piotra Góreckiego
    
    $crystal = 4000000                                          'deklaracja częstotliwości pracy kwarcu
    
    $regfile "attiny2313.dat"                                   'model procesora dla którego jest ten program
    Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32        ' definicja znaki stopnia
    
    
    Config 1wire = Portd.5                                      ' konfiguracja portu PD.5 jako wejścia magistrali 1-wire
    
    Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5
    'Deklaracja wszystkich zmiennych potrzebnych do pracy programu
    
    Do
      1wreset                                                   'reset
      1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                              'dokonaj konwersji
      Waitms 750                                                'przeczekaj czas konwersji
      1wreset                                                   'reset
      1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
      T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt
    
      T1 = T * 0.0625                                           'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single
    
    Napis = Fusing(t1 , "#.#")
      Cls : Cursor Off : Lcd "* Temperatura *"
      Lowerline
      Lcd "Wynik: " ; Napis ; " " ; Chr(1) ; "C"                'wyświetl wynik ze zmiennej Single
    Loop : End
    

    $regfile oczywiście zmieniony.

    Proszę stosować znaczniki [code]
    [zumek]
  • #11 5813193
    yokoon
    Poziom 29  
    wader_669 napisał:
    yokoon napisał:

    
      Cls : Cursor Off : Lcd "* Temperatura *"
    



    i tu masz problem, chodzi dokladniej o to cls


    To dlaczego pracuje na Attinie ?
  • #12 5813201
    wader_669
    Poziom 28  
    bo pewnie masz taka czestotliwosc ze nie widzisz tego mrugania, albo odwrotnie masz taka niska ze mruga co pewien czas ale wtedy tez temperatura bardzo powoli by sie aktualizowala.
  • #13 5813645
    Seba319
    Poziom 24  
    Możesz po prostu zrezygnować z czyszczenia LCD, zamiast tego ustawiać kursor tak aby nowy wynik zastąpił stary. Musisz przy tym uwzględnić możliwość wystąpienia różnej długości wyniku pomiaru.
  • #14 5813852
    wader_669
    Poziom 28  
    koleszka napisał:
    Możesz po prostu zrezygnować z czyszczenia LCD, zamiast tego ustawiać kursor tak aby nowy wynik zastąpił stary. Musisz przy tym uwzględnić możliwość wystąpienia różnej długości wyniku pomiaru.


    czyli to co podalem wczesniej!.
    W sumie moge ci napisac gotowca jak mnie poprosisz
  • #15 5813860
    Seba319
    Poziom 24  
    wader_669 -> tak, tak dokłądnie o to chowdzi. Wtedy nie bedzie migotania bo LCD nie będzie czyszczony.
  • #16 5813935
    yokoon
    Poziom 29  
    Otóż panowie odkryłem jeszcz jedną ciekawostkę : zmniejszyłem czestotliwsć oscylatora wewnętrznego z 8 MHz na 1 MHz i $crystal na 1 MHz i oto taki efekt, wyświetla się temperatura przez około 3 sek. ciągle bez mrugania ginie na 0,5 sek. i powraca. Dlaczego Attina 2313 wyświetla ciągle przy różnych częstotliwościach ?
  • #17 5813951
    wader_669
    Poziom 28  
    ty wogóle wiesz co ty robisz ? wiesz co to jest oscylator ? ile to 8mhz? itp. może pierw poczytaj trochę a później zadawaj pytania

    post raportowany, pisownia poprawiona And!
  • #18 5813967
    yokoon
    Poziom 29  
    wader_669 napisał:
    koleszka napisał:
    Możesz po prostu zrezygnować z czyszczenia LCD, zamiast tego ustawiać kursor tak aby nowy wynik zastąpił stary. Musisz przy tym uwzględnić możliwość wystąpienia różnej długości wyniku pomiaru.


    czyli to co podalem wczesniej!.
    W sumie moge ci napisac gotowca jak mnie poprosisz


    No to Cię proszę.
  • #19 5814008
    wader_669
    Poziom 28  
    
    
    $crystal = 4000000                                          'deklaracja częstotliwości pracy kwarcu
    
    $regfile "attiny2313.dat"                                   'model procesora dla którego jest ten program
    Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32        ' definicja znaki stopnia
    
    
    Config 1wire = Portd.5                                      ' konfiguracja portu PD.5 jako wejścia magistrali 1-wire
    
    Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5
    'Deklaracja wszystkich zmiennych potrzebnych do pracy programu
    
    Cls
    Cursor Off
    
    Do
      1wreset                                                   'reset
      1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                              'dokonaj konwersji
      Waitms 750                                                'przeczekaj czas konwersji
      1wreset                                                   'reset
      1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
      T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt
    
      T1 = T * 0.0625                                           'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single
    
    Napis = Fusing(t1 , "#.#")
    Locate 1 , 1                                                'ustawiam kursors w kolumnie 1 i wierszu 1
    Lcd "* Temperatura *"
    Locate 2 , 1                                                'ustawiam kursors w kolumnie 1 i wierszu 2
    Lcd "Wynik:" ; "     " ; Chr(1) ; "C"                       'wyświetl i przerwa w srodku (sluzy do kasowania)
    Locate 2 , 8
    Lcd Napis                                                   ' ustawienie kursora
                                                                 ' pokazanie temp
    Loop
    End
    


    daj znac jak dziala
    i jak wyglada ta przerwa czy nie jest za duza

    tu masz jeszcze troche lepiej napisany

    
    
    $crystal = 4000000                                          'deklaracja częstotliwości pracy kwarcu
    
    $regfile "attiny2313.dat"                                   'model procesora dla którego jest ten program
    Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32        ' definicja znaki stopnia
    
    
    Config 1wire = Portd.5                                      ' konfiguracja portu PD.5 jako wejścia magistrali 1-wire
    
    Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5
    'Deklaracja wszystkich zmiennych potrzebnych do pracy programu
    
    Cls
    Cursor Off
    
    Locate 1 , 1                                                'ustawiam kursors w kolumnie 1 i wierszu 1
    Lcd "* Temperatura *"
    Locate 2 , 1                                                'ustawiam kursors w kolumnie 1 i wierszu 2
    Lcd "Wynik:" ;
    Locate 2 , 12
    Lcd Chr(1) ; "C"                                            
    Do
      1wreset                                                   'reset
      1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                              'dokonaj konwersji
      Waitms 750                                                'przeczekaj czas konwersji
      1wreset                                                   'reset
      1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
      T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt
    
      T1 = T * 0.0625                                           'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single
    
    Napis = Fusing(t1 , "#.#")
    Locate 2 , 8
    Lcd "    "                                                  ' kasowanie
    Locate 2 , 8
    Lcd Napis                                                   ' ustawienie kursora
                                                                 ' pokazanie temp
    Loop
    End
    


    nastepny kod ktory pokazuje temperature tylko wtedy kiedy ona sie zmieni

    
    Do
    Sprawdz = Napis
      1wreset                                                   'reset
      1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                              'dokonaj konwersji
      Waitms 750                                                'przeczekaj czas konwersji
      1wreset                                                   'reset
      1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
      T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt
    
      T1 = T * 0.0625                                           'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single
    
    Napis = Fusing(t1 , "#.#")
    
    If Sprawdz <> Napis Then
    Locate 2 , 8
    Lcd "    "                                                  ' kasowanie
    Locate 2 , 8
    Lcd Napis                                                   ' ustawienie kursora
    End If
                                                                 ' pokazanie temp
    Loop
    End
    
  • #20 5814016
    yokoon
    Poziom 29  
    wader_669 napisał:
    ty wogule wiesz co ty robisz ? wiesz co to jest oscylator ? ile to 8mhz? itp. moze pierw poczytaj troche a pozniej zadawaj pytania


    wyobraź sobie że wiem, przejęzyczyłem sie z generatorem, 8Mhz to kolego 8MHz i oco ci chodzi bo nie rozumiem ?
  • #21 5814067
    wader_669
    Poziom 28  
    nie, mi chodzi czy wiesz co ty ustawiasz ? (a gdybys wiedzial co ty robisz to by tego tematu nie bylo)

    napisalem ci kod sprawdz czy dobrze napisalem
    poza tym brakuje config lcd
  • #22 5814116
    yokoon
    Poziom 29  
    wader_669 napisał:
    nie mi chodzi czy wiesz co ty ustawiasz ? (a gdybys wiedzial co ty robisz to by tego tematu nie bylo)

    napisalem ci kod sprawdz czy dobrze napisalem
    poza tym brakuje config lcd


    Błędy w Locate co to znaczy Locate 12 , 2 ?
  • #24 5814369
    yokoon
    Poziom 29  
    Tak teraz napisy nie mrugają, ale odczyt temperatury jest błędny od ujemnej do 256.
    Dziękuję za pomoc, spróbuję sam powalczyć.
    pomógł.
  • #25 5814393
    wader_669
    Poziom 28  
    sprawdz czy wszystko dobrze przekopiowalem. Zastanawia mnie ten blad, bo nie wiem z czego moze wynikac. A ktory kod sprawdzales?
  • #26 5814631
    yokoon
    Poziom 29  
    Ten w którym były błedy z Locate.
  • #27 5814912
    wader_669
    Poziom 28  
    we wszystkich 3 mialem bledy. Wydaje mi sie ze 1 uzyles bo reszte pozniej dodalem. Wiec nie wiem gdzie jest blad moze ktos z innych uzytkownikow to znajdzie
  • #28 5816520
    mirley
    Poziom 17  
    Witam

    Ja Odczyt temperatury zrobił bym tak:

     
              ....
              1wwrite &HCC
              1wwrite &HBE
              Lsb = 1wread():
              Msb = 1wread():
    
              Minus = Msb.7
    
              Tempa = Msb * 256
              Tempa = Tempa + Lsb
    
    
              If Minus = 1 Then
                Tempa = Not Tempa
                Tempa = Tempa + 1
              End If
    
              Tempa = Tempa * 10                                  'temperatura *10
              Tempa = Tempa / 16
    
    


    Jest to fragment kodu pozwalający na odczyt ujemnych temperatur w sposób poprawny. Zmienna "Tempa" przchowuje temperaturę pomożoną przez 10 dla zachowania dokładności i nie używania pamięciożernych operacji na liczbach zmiennoprzecinkowych i instrukcji fusing.

    Zmienna bitowa "minus" jest ustawiana na 1 kiedy temperatura jest ujemna. Można wtedy wyświetlać znak - lub wykorzystać to nawet do wyświetlaczy led.

    Zamiast:
    
              Tempa = Tempa * 10                                  'temperatura *10
              Tempa = Tempa / 16
    


    można oczywiście użyć:

    
    T1 = Tempa *0.0625
    


    i dalej tak jak było napisane
REKLAMA