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.

[atmega8][bascom] zegar i termometr w jednym

*zaba* 20 May 2009 17:17 6322 7
  • #1
    *zaba*
    Level 13  
    Witam jest to mój pierwszy {większy} program oczywiście przeszedłem kursy bascoma z zapalaniem diódek.
    Przychodząc do tematu to z zasobów internetu i własnych umiejętności napisałem program dla zegara i dla termometru i chciałbym teraz te dwie funkcje połączyć w całość. Owszem zrobiłem efekt jest bardzo fajny i wszystko działa ale pod względem w programie sam widzę ze jest coś nie tak a mianowicie pętla Do ... Loop jest pusta wszystkie warunki są napisane na timerze ale jak dam je do tej pętli to mi coś nie działa. Naprawdę próbowałem wiele nawet z funkcja stop\start timer ale też nic.
    Prosiłbym bardziej doświadczonych ode mnie o porady. Dzięki:)
    Code:
     $regfile = "m8def.dat"                                     'Dyrektyway dla kompilatora.
    

     $crystal = 1000000
     Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32


     Config 1wire = Portc.5
       Config Portb.0 = Input
       Portb.0 = 1
       Config Portd.7 = Input
       Portd.7 = 1
       Config Portd.6 = Input
       Portd.6 = 1
       Config Portd.5 = Input
       Portd.5 = 1
           Config Portb.1 = Output                              '
       Portb.1 = 0

     Config Lcd = 16 * 2


     Config Timer1 = Timer , Prescale = 64 : Enable Interrupts : Enable Timer1
    On Timer1 Sek Nosave


    Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5
    Dim G As Byte                                               '
    Dim M As Byte
    Dim S As Byte
    Dim X As Byte
    G = 0
    M = 0
    S = 0

    Cls
    Cursor Off
    Lcd "zegarek "
    Lowerline
    Lcd "by FrOg"

    Do





    Loop
    End

    Sek:
     Load Timer1 , 15625
      If Pind.7 = 0 Then
       1wreset
      1wwrite &HCC
      1wwrite &H44
      Waitms 750
      1wreset
      1wwrite &HCC
      1wwrite &HBE
        Odczyt(1) = 1wread(2)
      T = Odczyt(2)
      Shift T , Left , 8
      T = T + Odczyt(1)
      T1 = T * 0.0625

      Napis = Fusing(t1 , "#.#")
      Cls
      Lcd "temp --->" ; Napis
      Wait 3
      End If



    If Pinb.0 = 0 Then
    Incr X
    End If
    If X = 2 Then
    X = 0
      End If
     If Pinb.0 = 0 And X = 1 Then
        Cls

        Lcd "       czas        "
        Lowerline
        Lcd "zatrzymany"
         Wait 1
        End If
     If Pinb.0 = 0 And X = 0 Then
     Cls
     Lcd "      czas      "
     Lowerline
     Lcd "wznowiony "
     Wait 1
     End If



     If Pind.6 = 0 Then
     Waitms 50
     Incr M
     End If
     If Pind.5 = 0 Then
     Waitms 50
     Incr S
     End If

    If X = 0 Then

    Incr S
    End If
    If S = 60 Then
    S = 0
    Incr M
    End If
    If M = 60 Then
    M = 0
    Incr G
    End If
    If G = 24 Then
    G = 0
    End If
    Cls
    If G < 10 Then Lcd "0"
    Lcd G ; ":"
    If M < 10 Then Lcd "0"
    Lcd M ; ":"
    If S < 10 Then Lcd "0"
    Lcd S

    Return
  • #2
    mirekk36
    Level 42  
    Zapomnij o takim pasaniu programów - w obojętnie jakim języku programowania. Przerwania są po to aby umieszczać tam króciutkie fragmenty kody, które zabierają bardzo mało czasu - na prawdę bardzo mało czasu. A ty cały swój program umieściłeś w obsłudze przerwania Timera - czyli wszystko postawiłeś do góry nogami i się dziwisz, że coś ci nie działa w pętli głównej.

    Proponuję ci jakąś książkę o Bascomie , żebyś przypatrzył się kilku różnym programom jak się je pisze w taki podstawowy sposób , żebyś później miał wzrór - a nie to co tu wyczyniasz

    powodzenia
  • #3
    wader_669
    Level 28  
    jak chcesz czytac temp co sekunde to dodaj jedna zmienna, pozniej w petli glownej zrob zapis sekund to tej zmiennej, po czym jak ta zmienna i sekundy sie roznia to wchodzi do nastepnej petli, gdzie odczytuje temperature, a wychodzi jak temperatura jest rozna. W przerwaniach powinno byc jak najmniej rzeczy.
    Jak bede w domu postaram sie ci dalej pomoc. Narazie przeczytalem post bradzo szybko i szybko ci odpowiedzialem.
  • #4
    *zaba*
    Level 13  
    O dziękuje bardzo będę kombinował dalej :) już w głowie mam kilka pomysłów aby w przerwaniu było jak najmniej rzeczy. A jeśli chodzi o książkę to właśnie zbieram kasę i raczej w wakacje będę miał jakąś a jak dotąd to moim jedynym źródłem nauki jest internet i oczywiście to forum któremu zawdzięczam to że wogóle zacząłem się tym interesować
    Wielkie Dzięki
  • #5
    *zaba*
    Level 13  
    witam ponownie zrobiłem tak aby program w timerze był jak najkrótszy wszystko fajnie działa tylko że jak nastawiam godziny lub minuty to tylko do 8 później się zacina i nie da się nic zrobić.
    Czy mógłby ktoś zerknąć na mój kod i powiedzieć co ma źle.


    Code:

     $regfile = "m8def.dat"                                     'Dyrektyway dla kompilatora.

     $crystal = 4000000
       Config Portb.0 = Input
       Portb.0 = 1
       Config Portd.7 = Input
       Portd.7 = 1
       Config Portd.6 = Input
       Portd.6 = 1
       Config Portd.5 = Input
       Portd.5 = 1
           Config Portb.1 = Output                              '
       Pinb.1 = 0

     Config Lcd = 16 * 2


     Config Timer1 = Timer , Prescale = 64 : Enable Interrupts : Enable Timer1
    On Timer1 Sek Nosave


    Dim G As Byte
    Dim M As Byte
    Dim S As Byte
    Dim X As Byte
    Dim Z As Byte
    Dim H As Byte
    Dim I As Byte


    Cls
    Cursor Off
    Lcd "zegarek "
    Lowerline
    Lcd "by FrOg"

    Do
       'USTAWIENIE ZAGARA'
       If Pind.7 = 0 Then                                       'jesli pd7=0 to x=1
         X = 1
         Waitms 200                                             'opoznienie
         Incr Z                                                 'zwieksz z
       End If                                                   'koniec warunku

       If Z = 3 Then                                            'jesli z=4 to wyzeruj z
         Z = 0                                                  'koniec warunku
       End If


       If Z = 1 Then                                            'jesli z=1 to
         Cls                                                    'wyczysc ekran
         Lcd "godziny " ; G                                     'napisz Godziny i wyswietl liczbe godzin
         Waitms 100                                             'opoznienie
         If Pinb.0 = 0 Then                                     'jesli pb0=0 to
         Waitms 100                                             'zwieksz g-godziny
         Incr G                                                 'konic warunkow
         End If
       End If

       If Z = 2 Then                                            'jesli z=2 to
         Cls                                                    'wyczysc ekran
         Lcd "minuty " ; M                                      'napisz minuty i wyswietl liczbe minut
         Waitms 100                                             'opoznienie
        If Pinb.0 = 0 Then                                      'jesli pb0=0 to
         Waitms 100                                             'zwieksz m-minuty
         Incr M                                                 'koniec warunkow
        End If
       End If




                 If Pind.6 = 0 Then
       Waitms 25
       X = 0
       Z = 0

       End If




    'ODLICZANIE CZASU'
      If Z = 0 Then
       Cls
       Locate 1 , 5
       Lcd "zegarek"
       Locate 2 , 5
       If G < 10 Then Lcd "0"
       Lcd G ; ":"
       If M < 10 Then Lcd "0"
       Lcd M ; ":"
       If S < 10 Then Lcd "0"
       Lcd S
       Waitms 500
       Cls
      End If


       If S = 60 Then
       S = 0
       Incr M
       End If
       If M = 60 Then
       M = 0
       Incr G
       End If
       If G = 24 Then
       G = 0
       End If


      'TERMOMETR'  'jeszcze nie ma'


    Loop
    End



    'timer'

    Sek:

     If X = 0 Then
     Load Timer1 = 62500
    Incr S
      End If
     Return





    Za wszelką odpowiedź dziękuje.
    w załączniku filmik pokazujący mój problem
    Attachments:
  • #6
    wader_669
    Level 28  
    ok dobra, napisze ci przykladowy kod, bo juz nie moge patrzec na twoje kody.

    Code:

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

    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Portb.1 = 1
    Portb.2 = 1

    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 Timer1 = Timer , Prescale = 256
    On Timer1 1sekunda

    Dim Sekundy As Byte
    Dim Minuty As Byte
    Dim Godziny As Byte

    Dim Wart_bcd As Byte

    Dim X As Bit
    X = 1

    Dim Odczyt(2) As Byte
    T As Integer
    T1 As Single
    Napis As String * 5

    Declare Sub Wyswietl

    Enable Interrupts
    Enable Timer1

    Counter1 = 34286

    Cls

    Do
    If X = 1 Then Wyswietl

    If Pinb.1 = 0 Then
    Waitms 45
    If Pinb.1 = 0 Then

       X = 1
       Incr Minuty
       If Minuty = 60 Then Minuty = 0

    End If
    End If

    If Pinb.2 = 0 Then
    Waitms 45
    If Pinb.2 = 0 Then

       X = 1
       Incr Godziny
       If Godziny = 24 Then Godziny = 0

    Loop

    Sub Wyswietl
    X = 0
    Cls
    Locate 0 , 0
       Wart_bcd = Makebcd(godziny)
          Lcd Bcd(wart_bcd) ; ":"

       Wart_bcd = Makebcd(minuty)
          Lcd Bcd(wart_bcd) ; ":"

       Wart_bcd = Makebcd(sekundy)
          Lcd Bcd(wart_bcd) ; ":"

    Locate 1 , 0
       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       Odczyt(1) = 1wread(2)
       T = Odczyt(2)
       Shift T , Left , 8
       T = T + Odczyt(1)
       T1 = T * 0.0625

       Napis = Fusing(t1 , "#.#")
          Lcd Napis

    End Sub

    1sekunda:

    Counter1 = Counter1 + 34286
    Incr Sekundy
    X = 1

    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




    Przyklad jest spisany z ksiazki Marcina Wiazania
    Dopasuj kod na twoje tam wymagania, czyli przestaw zegarek i timer1. Masz odswiezanie wyswietlacza co sekunde, chyba ze wcisniesz przycsk. Przyciskiem dodajesz godzine, a 2 minuty.
  • #7
    *zaba*
    Level 13  
    O dzięki wielkie na pewno skorzystam a mógłbyś mi napisać co ogólnie jest źle w tym moim kodzie przydałoby się to aby ewentualnie w następnym tych błędów nie robić
  • #8
    wader_669
    Level 28  
    odliczanie czasu w przerwaniu. Poczytaj o zapisie liczby w formacie bcd. Gdy uzywasz przyciskow musisz przeczekac chwile, zeby procek nie regowal na drgania przyciskow.
    Totalnie nie wiem o co chodzi z ta zmienna "Z" ?

    Dodano po 14 [minuty]:

    Jeszcze przeczytaj tego posta.
    Gdybys chcial ulepszyc swoj kod:
    https://www.elektroda.pl/rtvforum/topic1320071.html