logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega8][bascom] zegar i termometr w jednym

*zaba* 20 Maj 2009 17:17 6508 7
  • #1 6553307
    *zaba*
    Poziom 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:)
     $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 6553462
    mirekk36
    Poziom 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 6553474
    wader_669
    Poziom 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 6554268
    *zaba*
    Poziom 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 6569133
    *zaba*
    Poziom 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.


    
     $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
    Załączniki:
  • #6 6570008
    wader_669
    Poziom 28  
    ok dobra, napisze ci przykladowy kod, bo juz nie moge patrzec na twoje kody.

    
    $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 6571228
    *zaba*
    Poziom 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 6571402
    wader_669
    Poziom 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
REKLAMA