Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega 8] [Bascom] mruga pomiar temperatury

02 Gru 2008 20:25 4574 27
  • Poziom 28  
    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ą ?
  • 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
  • Poziom 28  
    Panowie to jest ten sam program dla obu mikrokontrolerów, fuse bity ustawione zgodnie z $crystal. Przy Attinie nie mruga.
  • Poziom 28  
    moze pokaz pierw program
  • Poziom 28  
    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
  • 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.
  • 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.
  • Poziom 28  
    kurde ale nikt nie bedzie szukal kodu zeby ci pomoc. Powinienes jako pierwsze wrzucic kod
  • Poziom 28  
    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
    Code:

    $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]
  • Poziom 28  
    yokoon napisał:

    Code:

      Cls : Cursor Off : Lcd "* Temperatura *"



    i tu masz problem, chodzi dokladniej o to cls

    zrob cos takiego
    Code:

    cls
    do

    locate 1, 1
    lcd "cos tam"
    locate 1,2
    lcd" cos tam ponizej"

    loop
    end



    i po problemie
  • Poziom 28  
    wader_669 napisał:
    yokoon napisał:

    Code:

      Cls : Cursor Off : Lcd "* Temperatura *"



    i tu masz problem, chodzi dokladniej o to cls


    To dlaczego pracuje na Attinie ?
  • 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.
  • 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.
  • 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
  • Poziom 24  
    wader_669 -> tak, tak dokłądnie o to chowdzi. Wtedy nie bedzie migotania bo LCD nie będzie czyszczony.
  • Poziom 28  
    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 ?
  • 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!
  • Poziom 28  
    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ę.
  • Poziom 28  
    Code:


    $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

    Code:


    $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

    Code:

    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
  • Poziom 28  
    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 ?
  • 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
  • Poziom 28  
    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 ?
  • Pomocny post
    Poziom 28  
    no masz racje sorry
    zamien 12 z 2
    bo locate dziala tak:
    Code:

    locate y, x

    a ja myslalem ze odwrotnie
    (juz jest poprawione)
  • Poziom 28  
    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ł.
  • Poziom 28  
    sprawdz czy wszystko dobrze przekopiowalem. Zastanawia mnie ten blad, bo nie wiem z czego moze wynikac. A ktory kod sprawdzales?
  • Poziom 28  
    Ten w którym były błedy z Locate.
  • 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
  • Poziom 17  
    Witam

    Ja Odczyt temperatury zrobił bym tak:

    Code:
     
    
              ....
              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:
    Code:

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


    można oczywiście użyć:

    Code:

    T1 = Tempa *0.0625


    i dalej tak jak było napisane