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.

[Atmega 8] [Bascom] mruga pomiar temperatury

yokoon 02 Gru 2008 20:25 4481 27
  • #1 02 Gru 2008 20:25
    yokoon
    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ą ?

    -1 27
  • #2 02 Gru 2008 20:35
    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

    0
  • #3 02 Gru 2008 20:48
    yokoon
    Poziom 28  

    Panowie to jest ten sam program dla obu mikrokontrolerów, fuse bity ustawione zgodnie z $crystal. Przy Attinie nie mruga.

    0
  • #4 02 Gru 2008 21:00
    wader_669
    Poziom 28  

    moze pokaz pierw program

    0
  • #5 02 Gru 2008 21:11
    yokoon
    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

    0
  • #6 02 Gru 2008 21:18
    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.

    0
  • #7 02 Gru 2008 21:34
    koleszka
    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.

    0
  • #8 02 Gru 2008 22:51
    wader_669
    Poziom 28  

    kurde ale nikt nie bedzie szukal kodu zeby ci pomoc. Powinienes jako pierwsze wrzucic kod

    0
  • #9 03 Gru 2008 16:25
    yokoon
    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]

    0
  • #10 03 Gru 2008 16:29
    wader_669
    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

    0
  • #11 03 Gru 2008 16:34
    yokoon
    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 ?

    0
  • #12 03 Gru 2008 16:35
    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.

    0
  • #13 03 Gru 2008 18:10
    koleszka
    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.

    0
  • #14 03 Gru 2008 18:56
    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

    0
  • #15 03 Gru 2008 18:58
    koleszka
    Poziom 24  

    wader_669 -> tak, tak dokłądnie o to chowdzi. Wtedy nie bedzie migotania bo LCD nie będzie czyszczony.

    0
  • #16 03 Gru 2008 19:16
    yokoon
    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 ?

    0
  • #17 03 Gru 2008 19:19
    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!

    1
  • #18 03 Gru 2008 19:22
    yokoon
    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ę.

    0
  • #19 03 Gru 2008 19:30
    wader_669
    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

    0
  • #20 03 Gru 2008 19:31
    yokoon
    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 ?

    0
  • #21 03 Gru 2008 19:39
    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

    0
  • #22 03 Gru 2008 19:48
    yokoon
    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 ?

    0
  • Pomocny post
    #23 03 Gru 2008 19:49
    wader_669
    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)

    0
  • #24 03 Gru 2008 20:33
    yokoon
    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ł.

    0
  • #25 03 Gru 2008 20:36
    wader_669
    Poziom 28  

    sprawdz czy wszystko dobrze przekopiowalem. Zastanawia mnie ten blad, bo nie wiem z czego moze wynikac. A ktory kod sprawdzales?

    0
  • #26 03 Gru 2008 21:21
    yokoon
    Poziom 28  

    Ten w którym były błedy z Locate.

    0
  • #27 03 Gru 2008 22:06
    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

    0
  • #28 04 Gru 2008 13:16
    mirley
    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

    -1