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.

[ATmega8][Bascom] Zegarek "Low level, Rising or Falling

mkpl 01 Maj 2009 21:26 2603 7
  • #1 01 Maj 2009 21:26
    mkpl
    Poziom 37  

    Witam
    Przerobiłem program znaleziony gdzieś w internecie aby pracował z lampami NIXI i mam problem ponieważ nie chce mi się kompilować.
    Wywala bład 212 "Low level, Rising or Falling expected [TIMER] w lini

    Code:
    Config Int0 = Timer , Prescale = 128  


    Prosił bym o wmiare łopatologiczne tłumaczenie ponieważ dopiero się uczę :D

    Reszta programu
    Code:
    ' Zegar, termometr, budzik NIXIE 74141
    
    $crystal = 8000000

    Dim Sekjed As Byte
    Dim Sekdzies As Byte
    Dim Minjed As Byte
    Dim Mindzies As Byte
    Dim Godzjed As Byte
    Dim Godzdzies As Byte
    Dim Multi As Byte
    Dim Miganie As Bit
    Dim Wlaczeniebudzika As Bit
    Dim Ustawianie As Byte
    Dim Trybustawianiabudzika As Bit
    Dim Trybustawianiaczasu As Bit
    Dim Uniwers As Byte
    Dim Maxi As Byte
    Dim Minjedb As Byte
    Dim Mindziesb As Byte
    Dim Godzjedb As Byte
    Dim Godzdziesb As Byte
    Dim Alarm As Bit


    Dim Odczyttemp As Bit
    Dim Ulamek As Byte
    Dim Jednosci As Byte
    Dim Dziesiatki As Byte
    Dim Tmp As Single
    Dim Temp As Byte
    Dim Odczyt(2) As Byte
    Dim T As Integer
    Dim Liczba As Byte


    Config Portb = &B11111111
    Config Portc = &B11110111
    Config Portd = &B11111111

    Config 1wire = Pinc.4
    Config Int0 = Timer , Prescale = 128
    Config Timer0 = Timer , Prescale = 8
    Enable Interrupts
    Enable Int0
    Enable Timer0
    On Timer0 2ms
    On Int0 1s

    Sekjed = 0 : Sekdzies = 0 : Minjed = 0 : Mindzies = 0 : Godzjed = 0 : Godzdzies = 0
    Uniwers = 4 : Alarm = 0 : Wlaczeniebudzika = 0 : Trybustawianiabudzika = 0
    Trybustawianiaczasu = 0


    Do

    If Odczyttemp = 1 Then
    Disable Interrupts

    'odczytaj temperaturę


        1wreset                                                 'reset
      1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                              'dokonaj konwersji
      Waitms 750                                                'przeczekaj czas konwersji




      1wreset                                                   'reset
      1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20

       Odczyt(1) = 1wread(2)
       T = Odczyt(2)
       Shift T , Left , 8
       T = T + Odczyt(1)
       Tmp = T / 16
       Liczba = Int(tmp)
       'oblicz ułamek
      Tmp = Frac(tmp)
      Tmp = Tmp * 10
      Ulamek = Int(tmp)


      Temp = Makebcd(liczba)
      Jednosci = Temp And &B00001111
      Shift Temp , Right , 4
      Dziesiatki = Temp

    Enable Interrupts
    End If

     Loop : End

    1s:
    Incr Sekjed

    Toggle Miganie
    Return

    If Pinc.2 = 0 Then
    Incr Ustawianie
    Else
    Ustawianie = 0
    End If

    If Wlaczeniebudzika = 1 Then
        If Godzdzies = Godzdziesb And Godzjed = Godzjedb And Mindzies = Mindziesb And Minjed = Minjedb Then
          Alarm = 1
    End If
        End If

     If Alarm = 1 Then                                          'alarm gra 1 sek i nie gra 1 sek
       Toggle Portb.5
       Else
              Portb.5 = 1
    End If : Return



    2ms:

    If Pinb.4 = 0 Then
      Odczyttemp = 1
      Else
      Odczyttemp = 0
      End If

     If Pinb.0 = 1 And Pinb.1 = 1 Then
     Maxi = 100 : Uniwers = 4
     End If

         If Ustawianie = 0 Then
    Toggle Trybustawianiabudzika                                '  Wybieranie trybu ustawiania budzika po przytrzymaniu <1s
    End If

    If Ustawianie = 5 Then                                      'Wybieranie ustawiania czasu po przytrzymaniu ok 5s
    Toggle Trybustawianiaczasu
    End If

    If Pinb.3 = 0 Then
       Toggle Wlaczeniebudzika
    End If



    If Trybustawianiabudzika = 1 Then
        If Pinb.0 = 0 Then
            Decr Uniwers
            End If
           If Uniwers = 0 Then
               Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
               End If                                           'coraz szybciej
            Incr Minjedb
             If Minjedb = 10 Then
                Minjedb = 0 : Incr Mindziesb
             End If
             If Mindziesb = 6 Then
                Mindziesb = 0 : Incr Godzjedb
             End If
             If Godzjedb = 10 Then
                Godzjedb = 0 : Incr Godzdziesb
             End If
             If Godzdziesb = 2 And Godzjedb = 4 Then
                Godzdziesb = 0 : Godzjedb = 0
             End If
         If Pinb.1 = 0 Then
            Decr Uniwers
            End If
           If Uniwers = 0 Then
               Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
               End If                                           'coraz szybciej
               Incr Godzjedb
               If Godzjedb = 10 Then
                Godzjedb = 0 : Incr Godzdziesb
                End If
              If Godzdziesb = 2 And Godzjedb = 4 Then
                Godzdziesb = 0 : Godzjedb = 0
              End If


    If Trybustawianiaczasu = 1 Then
     Miganie = 1

      If Pinb.0 = 0 Then
            Decr Uniwers
            End If
           If Uniwers = 0 Then
               Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
               End If                                           'coraz szybciej
            Incr Minjed : Sekjed = 0 : Sekdzies = 0
           End If
      If Pinb.1 = 0 Then
            Decr Uniwers
            End If
           If Uniwers = 0 Then
               Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
               End If                                           'coraz szybciej
               Incr Godzjed

    End If


    If Miganie = 1 Then                                         'Część o świeceniu diody
    Portd = &B00001111
    Else
    Portd = &B00001111
    End If

    If Sekjed = 10 Then                                         'Procedury liczenia czasu
       Sekjed = 0 : Incr Sekdzies
    End If

    If Sekdzies = 6 Then
       Sekdzies = 0 : Incr Minjed
    End If

    If Minjed = 10 Then
       Minjed = 0 : Incr Mindzies
    End If

    If Mindzies = 6 Then
       Mindzies = 0 : Incr Godzjed
    End If

    If Godzjed = 10 Then
       Godzjed = 0 : Incr Godzdzies
    End If

    If Godzdzies = 2 And Godzjed = 4 Then
       Godzdzies = 0 : Godzjed = 0
    End If


    Incr Multi
    If Multi = 4 Then
       Multi = 0
    End If

    If Trybustawianiabudzika = 0 Then

    Portb = &B11111111

    Select Case Multi
    Case 0:
           Portb = Lookup(godzdzies , Tabela) : Portd = &B01011111
    Case 1:
           Portb = Lookup(godzjed , Tabela) : Portd = &B01101111
    Case 2:
           Portb = Lookup(mindzies , Tabela) : Portd = &B00101111
    Case 3:
           Portb = Lookup(minjed , Tabela) : If Wlaczeniebudzika = 1 Then Portd = &B00001111 : Portd = &B00011111
    End Select
    Else
     If Miganie = 1 Then
     Select Case Multi
    Case 0:
           Portb = Lookup(godzdziesb , Tabela) : Portd = &B01011111
    Case 1:
           Portb = Lookup(godzjedb , Tabela) : Portd = &B01101111
    Case 2:
           Portb = Lookup(mindziesb , Tabela) : Portd = &B00101111
    Case 3:
           Portb = Lookup(minjedb , Tabela) : If Wlaczeniebudzika = 1 Then Portd = &B00001111 : Portd = &B00011111
    End Select
    End If
    End If

    If Odczyttemp = 1 Then

      Select Case Multi
    Case 0:
           Portb = Lookup(godzdziesb , Tabela) : Portd = &B01011111
    Case 1:
           Portb = Lookup(dziesiatki , Tabela) : Portd = &B01101111
    Case 2:
           Portb = Lookup(jednosci , Tabela) : Portd = &B00001111 : Portd = &B00101111
    Case 3:
           Portb = Lookup(ulamek , Tabela) : Portd = &B00011111
    End Select
    End If : Return

    Tabela:
    Data &B00110000 , &B11111001 , &B01010010 , &B11010000 , &B10011001 , &B10010100 , &B00010100 , &B11110001 , &B00010000 , &B10010000

    0 7
  • #2 01 Maj 2009 21:29
    Logan
    Poziom 30  

    "Timer" odnosi się do konfiguracji pracy licznika T/C, natomiast INT0 to przerwanie zewnetrzne ! Radzę poczytać HELP'a.

    0
  • #3 01 Maj 2009 21:56
    mkpl
    Poziom 37  

    Czyli jak to powinno wyglądać ? Bo się pogubiłem

    0
  • #4 01 Maj 2009 22:29
    janbernat
    Poziom 38  

    1.Możesz powiedzieć CO chciałeś uzyskać jako wynik działania INT0?
    Jak napisał Logan-to jest przerwanie zewnętrzne-od zewnętrznego przycisku np.
    2.Czy kompilowałeś ten program w miarę pisania czy napisałeś cały i dopiero potem skompilowałeś?

    0
  • #5 01 Maj 2009 22:55
    mkpl
    Poziom 37  

    Program nie jest mój. Znalazłem go w diy gdzieś na naszym forum i był dołączony do zegarka na zwyklych wyświetlaczach led. Moja ingerencja to tylko zmiana sposobu wyświetlania tak aby wyświetlać na NIXI przez 74141. Oryginalny program tez w tym miejscu utyka

    0
  • #6 02 Maj 2009 00:05
    dawid512
    Poziom 32  

    Wg. mnie powinno tam być timer1 czyli np.

    Code:
    Config Timer1 = Timer , Prescale = 128 

    0
  • #7 02 Maj 2009 06:33
    emarcus
    Poziom 35  

    dawid512 napisał:
    Wg. mnie powinno tam być timer1 czyli np.
    Code:
    Config Timer1 = Timer , Prescale = 128 


    Timer1 nie ma podzielnika o wartosci 128.
    Owszem, jest on dla Timer2, ale ta opcja nie wyglada ze jest wykorzystana w projekcie.

    e marcus

    0
  • #8 02 Maj 2009 09:01
    ZbeeGin
    Poziom 38  

    Wszystko staje się proste i zrozumiałe jak słowo INT0 zmieni się na TIMER2:
    1. Licznik Timer2 ma preskaler 128 i możliwośc taktownia z dodatkowego rezonatorka 32,768kHz. Właśnie po podzieleniu tej częstotliwości przez 128 (z preskalera) i 256 (z licznika) otrzymamy dokładnie okres przerwań 1s. Oczywiście rezonator trzeba dołączyć do TOSCx.
    2. Brakuje jeszcze magicznego słowa Async = On, które trzeba koniecznie dopisać w utworzonym CONFIG TIMER2, by punkt 1 zadziałał.

    I jeszcze jedno. Brakuje w programie $regfile.

    0