Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[BASCOM][AVR]termometr

yokoon 30 Jul 2008 16:30 3874 11
  • #1
    yokoon
    Level 29  
    Witam.
    Mam problem z programem z książki "Programowanie mikrkontrolerów AVR w języku BASCOM" listing nr 8.19. Przerobiłem z Atmega8 na Attiny2313 ponieważ plik .bin ma pjemność 1,20 kB. Po pierwszym wgraniu na wyswietlaczu wyświetlało się byle co tzn. temperatura ujemna lub brak układu. Zmieniłem w linii :

    Code:
    If temperatura(2) = 0 Then  na If temperatura(2) > 0 Then
    
    Lcd "Temp: " ; Temperatura(1) ; Chro(0);
    "C" - wyświetla temperaturę dodatnią
    i drugą linię :
    Code:
    If temperatura(2) > 0 Then  na If temperatura(2) < 0 Then
    
    Lcd "Temp: - " ; Temperatura(1) ; Chr(0) ; "C"


    Teraz wyświetla 170 stopni C.

    Nie wiem jak włączyć KODE.



    Code:
    'Program  obsługi jednego układu DS1820 dołączonego
    
    'do magistrali 1-Wire

    $regfile = "Attiny2313.dat"                       'informuje kompilator o pliku
          'dyrektyw mikrokontrolera
    $crystal = 4000000                                'informuje kompilator o częstotliwości oscylatora taktującego mikrokontroler
    Config Lcd = 16 * 2                               'konfiguracja typu wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2       'konfiguracja linii
          'mikrokontrolera‚ do których dołączono wyświetlacz LCD
    Config 1wire = Portd.5                            'konfiguracja linii magistrali 1-Wire
    Declare Sub Odcz_temp                             'procedura odczytu temperatury z układu DS1820
    Dim Temperatura(2) As Byte                        'tablica dwóch zmiennych typu Byte do pamiętania wartości temperatury
                                                        'definicja znaku stopnia
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32

    Do                                                'początek pętli programu
     Call Odcz_temp                                   'wywołanie procedury pomiaru temperatury
     Cls
     Cursor Off : Lcd "* Temperatura *"
                                                   'czyszczenie ekranu LCD
     If Temperatura(2) = 0 Then
     Lowerline                                        'jeśli wartość Temperatura(2)= 0, to temperatura dodatnia wyświetla temperatury dodatnie
      Lcd "Temp: " ; Temperatura(1) ; Chr(0) ; "C"
     Else                                             'w przeciwnym razie wyświetla temperatury ujemne
      Lcd "Temp: -" ; Temperatura(1) ; Chr(0) ; "C"
     End If
    Loop                                              'koniec pętli Do...Loop
    End                                               'koniec programu

    Sub Odcz_temp                                     'definicja procedury pomiaru temperatury
     1wreset                                          'reset magistrali 1-Wire
     1wwrite &HCC                                     'opuszczenie zapisu numeru ID
     1wwrite &H44                                     'start pomiaru temperatury
     Waitms 750                                       'opóźnienie na czas pomiaru
     1wreset                                          'reset magistrali 1-Wire
     1wwrite &HCC                                     'opuszczenie zapisu numeru ID
     1wwrite &HBE                                     'komenda odczytu zmierzonej temperatury
     Temperatura(1) = 1wread(2)                       'odczyt zmierzonej temperatury do tablicy Temperatura
     1wreset                                          'reset magistrali 1-Wire
     If Err = 1 Then                                  'jeśli układ dołączony do  magistrali nie odpowiada, to
      Cls                                             'czyszczenie LCD
      Lcd "Brak ukladu"                               'wyświetlenie komunikatu o braku dołączonego układu
      'Do                                              'nieskończona pętla w celu wstrzymania działania programu
      'Loop
     End If
     If Temperatura(2) > 0 Then                       'jeśli zmienna Temperatura(2)> 0, to temperatura ujemna przeliczenie temperatury
          'ujemnej
      Temperatura(1) = 256 - Temperatura(1)
     End If                                           'koniec warunku Temperatura(1) = Temperatura(1) / 2 dalsze przeliczenie odczytanej
          'temperatury dodatniej jak i ujemnej
    End Sub                                           'koniec procedury pomiaru


    Proszę umieszczać listingi programów w znacznikach "Code". Może warto sprawdzić jakie jeszcze możliwości dają przyciski pod tytułem postu.[c_p]
  • #2
    11111olo
    Level 42  
    Tam nic nie trzeba zmieniać. Wystarczyło podłączyć do identycznych linii LCD i DS18B20 i zmienić

    $regfile = "Attiny2313.dat"

    na
    $regfile = "mega8.dat"
  • #3
    yokoon
    Level 29  
    No właśnie ja zmieniłem z Atmega8 na Attiny2313, dlatego iż ten plik w formie .bin mieści się w Attinie.

    Nie wiem czy uruchamiałeś na Atmega8, bo mnie się wydaje, że te linie które zaznaczyłem to były błędy.
  • #4
    11111olo
    Level 42  
    Chyba się nie zrozumieliśmy. W regfile określasz typ procka. BIN to plik już skompilowany - ty musisz ponownie kod źródłowy w Bascomie skompilować.
  • #5
    yokoon
    Level 29  
    11111olo wrote:
    Chyba się nie zrozumieliśmy. W regfile określasz typ procka. BIN to plik już skompilowany - ty musisz ponownie kod źródłowy w Bascomie skompilować.


    Powtarzam, zmieniłem na Attinę dlatego iż plik ten się mieści w Attinie i nie ma potrzeby używać Atmegę. W programie zmieniłem na $regfile2313.dat. Widać w mim poście. Dlaczego wyświetla 170 stopni C ?
  • #6
    cyberdar
    Level 31  
    Witam

    yokoon jak masz zasilanego DSa ? próbowałeś ustawić czas konwersji na 1 sekundę (zamiast 750ms) ? Dziwność tego zjawiska jest zastanawiająca. Powiedzmy, że normą jest wyświetlenia/wyświetlanie 85°C. To jest akurat normalne o czym pisze w nocie katalogowej. U Ciebie jest wartość dwa razy taka. Wygląda na błąd w programie.

    --
    pozdrawiam
  • #7
    yokoon
    Level 29  
    Spróbuję zmienić czas konwersji, DS zasilany standardowo DQ podciągnięte przez 4,7K

    W dalszym ciągu to samo 170 stopni C.
  • #8
    cyberdar
    Level 31  
    Witam

    Spróbuj podłączyć go normalnie tzn. tak aby był zasilany z 5V a nie w trybie pasożtniczym.

    --
    pozdrawiam
  • #10
    yokoon
    Level 29  
    To była pomyłka, przecież w programie widać $regfile = "Attiny2313.dat"

    Powróciłem do wersji oryginalnej i dalej lipa.

    Czy ktoś z kolegów uruchomił ten program ?
  • Helpful post
    #11
    levy^
    Level 16  
    mnie sie udalo uruchomic ten program, chociaz z bascomem mam do czynienia od jakichs 2 godzin to znalazlem blad :)

    twoja wersja

    Code:

    If Temperatura(2) > 0 Then                       'jeśli zmienna Temperatura(2)> 0, to temperatura ujemna przeliczenie temperatury
          'ujemnej
      Temperatura(1) = 256 - Temperatura(1)
     End If                                           'koniec warunku Temperatura(1) = Temperatura(1) / 2 dalsze przeliczenie odczytanej
          'temperatury dodatniej jak i ujemnej
    End Sub                                           'koniec procedury pomiaru


    poprawiona wersja
    Code:

    If Temperatura(2) > 0 Then                       'jeśli zmienna Temperatura(2)> 0, to temperatura ujemna przeliczenie temperatury
          'ujemnej
      Temperatura(1) = 256 - Temperatura(1)
     End If                                           'koniec warunku
    Temperatura(1) = Temperatura(1) / 2 dalsze przeliczenie odczytanej
          'temperatury dodatniej jak i ujemnej
    End Sub                                           'koniec procedury pomiaru


    wynik nie byl dzielony przez 2, u mnie pokazywalo 58 stopni, teraz juz jest ok
  • #12
    yokoon
    Level 29  
    Witam.
    Dzięki za podpowiedź, ja popełnilem wtedy błąd nie zwracając uwagi na czujnik DS 'a. Ja miałem DS18B20 a w programie jest DS1820. Inaczej się przelicza temperaturę.