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.

Zegarek na atmega8 + termometr jak połaczyć programy ?

22 Lut 2010 23:17 2964 4
  • Poziom 21  
    Witam. Mam z książki Marcina Wiązani listing do zegarka na atmega8. Chciałbym włączyc jeszcze do tego projektu termometr ( możne być DS18B20 lub LM35). Jak to technicznie wykonać?


    listing zegara



    Code:
    'Program zegara wykorzystującego przerwania od Timer1
    
    'Przerwanie przepełnienia Timer1 jest generowane co 1 s
    '8 MHz/256/31250 = 1 s
    'Przycisk S1 ustawia minuty, a S2 godziny

    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
          'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
          'o częstotliwości oscylatora
          'taktującego mikrokontroler
    Config Pinb.1 = Input                                       'linia PB1 jako wejściowa
    Config Pinb.2 = Input                                       'linia PB2 jako wejściowa
    Config Lcd = 16 * 2                                         'konfiguracja typu wyświetlacza
          'LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'konfiguracja linii
          'mikrokontrolera, do których
          'dołączono wyświetlacz
          'LCD
    Config Timer1 = Timer , Prescale = 256
          'konfiguracja Timer1 jako timer
          'z podziałem preskalera przez
          '256

    Declare Sub Wysw_czas                                       'procedura wyświetlająca czas na
          'LCD w formacie gg:mm:ss
    On Timer1 Odmierz_1s                                        'przerwanie od przepełnienia
          'Timer1 o etykiecie Odmierz_1s

    Dim Sekundy As Byte                                         'zmienna zliczająca sekundy
    Dim Minuty As Byte                                          'zmienna zliczająca minuty
    Dim Godziny As Byte                                         'zmienna zliczająca godziny
    Dim Nowa_w As Bit                                           'flaga zezwolenia aktualizacji
          'czasu na LCD
    Dim Wart_bcd As Byte                                        'zmienna pomocnicza, w której
          'jest zapisywana wartość BCD
          'czasu

    S1 Alias Pinb.2                                             'przypisanie nazwie Pinb.2
          'nazwy S1
    S2 Alias Pinb.1                                             'przypisanie nazwie Pinb.1
          'nazwy S2

    Enable Interrupts                                           'odblokowanie globalnego systemu
          'przerwań
    Enable Timer1                                               'odblokowanie przerwania od
          'przepełnienia Timer1
    Counter1 = 34286                                            'wartość początkowa wpisywana do
          'Timer1 (65536 - 31250 = 34286)

    Set Nowa_w                                                  'zezwolenie na wyświetlenie
          'aktualnego czasu
    Set Portb.1                                                 'dołączenie do linii PB1
          'rezystora podciągającego
    Set Portb.2                                                 'dołączenie do linii PB2
          'rezystora podciągającego
    Do                                                          'pętla główna programu
     Call Wysw_czas                                             'wywołanie procedury
          'wyświetlającej aktualny czas
     If S1 = 0 Then                                             'jeśli przyciśnięty S1, to
      Waitms 25                                                 'opóźnienie dla eliminacji drgań
          'styków
      If S1 = 0 Then                                            'sprawdzenie, czy przycisk S1
          'dalej naciśniety, jeśli tak, to
       Incr Minuty                                              'zwiększenie wartości minut
       Sekundy = 0                                              'wyzerowanie zmiennej Sekundy
       If Minuty = 60 Then                                      'jeśli wartość Minuty = 60, to
        Minuty = 0                                              'zerowanie wartości Minuty
       End If
       Set Nowa_w                                               'zezwolenie na wyświetlenie
          'czasu
       Call Wysw_czas                                           'wywołanie procedury
          'wyświetlenia aktualnego czasu
       Waitms 200                                               'opóźnienie 200 ms
      End If                                                    'koniec instrukcji warunkowej
     End If
     If S2 = 0 Then                                             'jeśli przyciśnięty S2, to
      Waitms 25                                                 'opóźnienie dla eliminacji drgań
          'styków
      If S2 = 0 Then                                            'sprawdzenie czy przycisk S2
          'dalej naciśniety, jeśli tak, to
       Incr Godziny                                             'zwiększenie wartości Godziny
       If Godziny = 24 Then                                     'jeśli wartość Godziny = 24, to
        Godziny = 0                                             'wyzerowanie wartości Godziny
       End If
       Set Nowa_w                                               'zezwolenie na wyświetlenie
          'czasu
       Call Wysw_czas                                           'wywołanie procedury
          'wyświetlenia aktualnego czasu
       Waitms 200                                               'opóźnienie 200 ms
      End If                                                    'koniec instrukcji warunkowej
     End If
    Loop
    End                                                         'koniec programu


    Sub Wysw_czas                                               'procedura wyświetlająca czas
     If Nowa_w = 1 Then                                         'jeśli flaga Nowa_w = 1, to
      Cls                                                       'czyszczenie LCD
      Wart_bcd = Makebcd(godziny)                               'zamiana wartości Godziny na
          'wartość w kodzie BCD
      Lcd Bcd(wart_bcd) ; ":"                                   'wyświetlenie wartości godzin
          'w kodzie BCD zamienionych na
          'tekst oraz znaku :
      Wart_bcd = Makebcd(minuty)                                'zamiana wartości Minuty na
          'wartość BCD
      Lcd Bcd(wart_bcd) ; ":"                                   'wyświetlenie wartości minut
          'w kodzie BCD zamienionych na
          'tekst oraz znaku :
      Wart_bcd = Makebcd(sekundy)                               'zamiana wartości Sekundy na
          'wartość w kodzie BCD
      Lcd Bcd(wart_bcd) ;                                       'wyświetlenie wartości sekund
          'w kodzie BCD zamienionych na
          'tekst
      Reset Nowa_w                                              'zerowanie flagi Nowa_w
     End If
    End Sub                                                     'koniec procedury

    Odmierz_1s:                                                 'podprogramu obsługi przerwania
          'przepełnienia od Timer1
     Counter1 = Counter1 + 34286                                'wpisanie wartości początkowej
          'licznika
     Incr Sekundy                                               'zwiększenie o 1 wartości
          'Sekundy
     Set Nowa_w                                                 'zezwolenie na wyświetlenie
          'czasu
     If Sekundy = 60 Then                                       'jeśli Sekundy = 60, to
      Sekundy = 0                                               'wyzerowanie wartości Sekundy
      Incr Minuty                                               'zwiększenie o 1 wartości Minuty
      If Minuty = 60 Then                                       'jeśli Minuty = 60, to
       Minuty = 0                                               'zerowanie wartości Minuty
       Incr Godziny                                             'zwiększenie o 1 wartości
          'Godziny
       If Godziny = 24 Then                                     'jeśli Godziny = 24, to
        Godziny = 0                                             'zerowanie wartości Godziny
       End If                                                   'koniec warunków
      End If
     End If
    Return                                                      'powrót z przerwania



    Jak dodać funkcję termo?



    znalazłem projekt z zegarkiem dcf. Tylko ja nie chcę dcfa tylko żeby działał na zew kwarcu 8hmz

    Cytat:
    'Zegar DCF77
    $regfile = "m8def.dat"
    $crystal = 8000000
    $lib "dcf77.lib"
    'Sygnał z odbiornika DCF podłączony do Portb.2
    Config Dcf77 = Pinb.2 , Debug = 1 , Inverted = 0 , Check = 1 , Update = 0 , Updatetime = 0 , Secondticks = 50 , Timer1sec = 1 , Powerlevel = 1 , Timer = 1 , Gosub = Sectic
    'Config Dcf77 = Pinb.2 , Debug = 1 , Inverted = 0 , Check = 1 , Update = 0 , Updatetime = 0 , Switchpower = 0 , Secondticks = 50 , Timer1sec = 1 , Powerlevel = 1 , Timer = 1 , Gosub = Sectic
    'Config Dcf77 = Pinb.1 , Debug = 1 , Inverted = 0 , Check = 2 , Update = 0 , Updatetime = 0 , Switchpower = 0 , Secondticks = 50 , Timer1sec = 1 , Powerlevel = 1 , Timer = 1 , Gosub = Sectic
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 20 * 4
    Config 1wire = Portb.0 'deklaracja portu na którym będ? podpięte DS18b20
    Klmode Alias Portb.3
    Klup Alias Portb.4
    Kldown Alias Pinb.5
    Set Klmode
    Set Klup
    Set Kldown

    Dim Flaga1 As Bit
    Dim I1 As Integer , Ss1 As String * 6
    Dim I2 As Integer , Ss2 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 Byte 'deklaracja zmiennej do odczytu ilo?c czujników

    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32 'znak stopnia Celsjusza
    Cls
    Lcd " " ; 'ekran startowy (pojawia się tylko podczas wł?czania urz?dzenia)
    Cursor Off
    Locate 1 , 17
    Lcd " termometr "
    Wait 5
    Cls

    W = 1wirecount()
    Dsid1(1) = 1wsearchfirst() 'Znajd? pierwszy czujnik podpięty do portu
    Dsid2(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu

    Enable Interrupts
    Config Date = Dmy , Separator = /

    Do
    If Flaga1 = 1 Then
    Flaga1 = 0

    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)
    '--------konwersja temp dla wszystkich dsow
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1

    I1 = I1 * 10
    I1 = I1 / 16
    If I1 > 0 Then Cls 'korekta przesuniecia znaku st C przy przej?ciu z temp ujemnej na dodatni?
    Ss1 = Str(i1)
    Ss1 = Format(ss1 , " 0.0")

    I2 = I2 * 10
    I2 = I2 / 16
    If I2 > 0 Then Cls
    Ss2 = Str(i2)
    Ss2 = Format(ss2 , " 0.0")
    'Cls
    Locate 1 , 1
    Lcd Time$ ; " ";
    If Pinb.2 = 0 Then Lcd "Rcvr" Else Lcd " "
    Locate 2 , 1
    Lcd Date$
    Locate 2 , 17 'Pozycja wy?wietlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
    Lcd "ZEW:" ;
    Locate 2 , 23
    Lcd Ss1 ; Chr(0) ;
    Locate 1 , 17
    Lcd "WEW:" ;
    Locate 1 , 23
    Lcd Ss2 ; Chr(0) ;
    Locate 2 , 1
    Lcd Date$
    End If
    ' klawisz 1
    ' klawisz 2
    ' klawisz 3
    Loop
    Sectic:
    Set Flaga1
    Return

    End
  • Poziom 26  
    Przecież w tej książce jest dokładnie opisane jak obsłużyć magistralę 1-wire. Nie możesz połączyć obu kodów w jedną całość?
  • Poziom 21  
    Cytat:
    Nie możesz połączyć obu kodów w jedną całość?


    Tak, tylko nie chcę DCF a normalny zegar na kwarcu

    Dodano po 4 [minuty]:

    p.s
    jestem laikiem i zaczynam sie dopiero bawic w AVR
  • Poziom 28  
    Jak sie zaczynasz bawic i chcesz sie nauczyc, to napewno nie pomoze ci jak damy tobie gotowca. Wiec ksiazka help i do roboty
  • Poziom 42  
    wader_669 napisał:
    Jak sie zaczynasz bawic i chcesz sie nauczyc, to napewno nie pomoze ci jak damy tobie gotowca. Wiec ksiazka help i do roboty


    Święta racja, i ucz się małymi kroczkami pisać takie programy a nie sklejać fregmenty kodu, których nie rozumiesz. To nie ta droga żeby się nauczyć programować