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.

Program do termo - zegarka [atmega8][bascom]

Komar91 11 Mar 2011 15:45 1495 2
  • #1 11 Mar 2011 15:45
    Komar91
    Poziom 18  

    Witam

    Ostatnio złożyłem z książki Marcina Wiązani-"Programowanie_mikrokontrolerow_AVR_w_jezyku_Bascom" dwa układy zegarka i termometru. Próbowałem połączyć te dwa układ i napisałem taki program

    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config 1wire = Portb.0

    Config Pinb.1 = Input                                       'linia PB1 jako wejściowa
    Config Pinb.2 = Input                                       'linia PB2 jako wejściowa
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
    Config Timer1 = Timer , Prescale = 256
          'konfiguracja Timer1 jako timer
          'z podziałem preskalera przez
          '256
    Dim Dsid1(8) As Byte

    Dim I1 As Integer , Ss As String * 6

    Cursor Off

     Dsid1(1) = 1wsearchfirst()


     Do
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)




       1wreset
       1wwrite &HCC
       1wwrite &H44
    Wait 1

    '****Jeśli pracujesz z wyświetlaczem innym niż 2x20 to tutaj trzeba wprowadzić zmiany w LOCATE********

       I1 = I1 * 10
       I1 = I1 / 16
       'If I1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 2 , 1                                             'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd "Zew" ; Ss ; Chr(0) ;
    Loop
    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

    i jest tak, że wyświetla mi się miejsce na zegar ale nie odlicza czasu i linijkę niżej pokazuje dobrze temperaturę. I tu moje pytanie jak przerobić program aby była pokazywana temperatura i godzina?

    dodaję poglądowy schemat układu
    Program do termo - zegarka [atmega8][bascom]

    Proszę pamiętać o używaniu znaczników code. - arnoldziq

    0 2
  • #2 11 Mar 2011 17:49
    bogdan_p
    Poziom 39  

    Po pierwsze to uporządkuj program na początku konfiguracje , deklaracje zmiennych , ustawienia portów itp , potem właściwy program , Programy przekopiowałeś tworząc dwie pętle DO -LOOP pierwsza się wykona ( pomiar temperatury ) ale druga już nie .

    0
  • #3 12 Mar 2011 09:43
    Komar91
    Poziom 18  

    Teraz poprawiłem ten program lecz znów nie działa.

    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config 1wire = Portb.0
    Config Timer1 = Timer , Prescale = 256
    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32
    Dim Dsid1(8) As Byte
    Dim I1 As Integer , Ss As String * 6
    Dim Sekundy As Byte
    Dim Minuty As Byte
    Dim Godziny As Byte
    Dim Nowa_w As Bit
    Dim Wart_bcd As Byte
    S1 Alias Pinb.2
    S2 Alias Pinb.1
    Cursor Off
    Do
    Dsid1(1) = 1wsearchfirst()
    1wreset
    1wwrite &H55
    1wverify Dsid1(1)
    1wwrite &HBE
    I1 = 1wread(2)
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    I1 = I1 * 10
    I1 = I1 / 16
    'If I1 > 0 Then Cls
    Ss = Str(i1)
    Ss = Format(ss , " 0.0")
    Locate 2 , 1
    Lcd "Zew" ; Ss ; Chr(0) ;
    Declare Sub Wysw_czas
    On Timer1 Odmierz_1s
    Enable Interrupts
    Enable Timer1
    Counter1 = 34286
    Set Nowa_w
    Set Portb.1
    Set Portb.2
    Call Wysw_czas
    If S1 = 0 Then
    Waitms 25
    If S1 = 0 Then
    Incr Minuty
    Sekundy = 0
    If Minuty = 60 Then
    Minuty = 0
    End If
    Set Nowa_w
    Call Wysw_czas
    Waitms 200
    End If
    End If
    If S2 = 0 Then
    Waitms 25
    If S2 = 0 Then
    Incr Godziny
    If Godziny = 24 Then
    Godziny = 0
    End If
    Set Nowa_w
    Call Wysw_czas
    Waitms 200
    End If
    End If
    Sub Wysw_czas
    If Nowa_w = 1 Then
    Cls
    Wart_bcd = Makebcd(godziny)
    Lcd Bcd(wart_bcd) ; ":"
    Wart_bcd = Makebcd(minuty)
    Lcd Bcd(wart_bcd) ; ":"
    Wart_bcd = Makebcd(sekundy)
    Lcd Bcd(wart_bcd) ;
    Reset Nowa_w
    End If
    End Sub
    Odmierz_1s:
    Counter1 = Counter1 + 34286
    Incr Sekundy
    Set Nowa_w
    If Sekundy = 60 Then
    Sekundy = 0
    Incr Minuty
    If Minuty = 60 Then
    Minuty = 0
    Incr Godziny
    If Godziny = 24 Then
    Godziny = 0
    End If
    End If
    End If
    Return
    Loop

    Ja jestem w programowaniu zielony zaczynam się uczyć a taki układ mi jest potrzebny

    0