Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATTINY2313/AT90S2313][Bascom] Zegar nie działa pod ATTINY.

abduls 08 Jul 2008 11:29 3282 6
  • #1
    abduls
    Level 10  
    Witam.
    Korzystając z płytki testowej zaprogramowałem układ AT90S2313 tak by pełnił funkcje najprostszego zegara i tak sie stało. Jednak gdy to samo chciałem zrobić z układem ATTINY2313 korzystając z tego samego kodu układ odmówił posłuszeństwa, a konkretnie obraz zaczął migać i czas był opóźniony o kilka sekund. Można to zrobić zwiększając częstotliwość przerywań ale nie jestem pewien czy nie zmieni to dokładności. Proszę o odpowiedzi dlaczego ten sam kod nie działa w AT90... i w ATTINY oraz czym te dwa układy się różnią. Pozdrawiam Artur.


    
    Dim Mili As Byte
    Dim Mili1 As Byte
    Dim Jedmin As Byte
    Dim Dziemin As Byte
    Dim Jedh As Byte
    Dim Dzieh As Byte
    Dim Ktory As Byte
    Dim Minz As Byte
    Dim Hz As Byte
    Config Portb = 255
    Portb = 255
    Config Portd = 124
    Portd = 127
    Config Timer0 = Timer , Prescale = 64
    Enable Interrupts
    Enable Timer0
    Jedmin = 0
    Dziemin = 0
    Jedh = 0
    Dzieh = 0
    On Timer0 Co4ms
    
    Do
    Loop
    End
    
    Co4ms:
    Timer0 = 6
    If Pind.1 = 0 Then 'początek zmiany minuty
    If Minz = 0 Then
    Minz = 1
    Incr Jedmin
    If Jedmin = 10 Then
    Jedmin = 0
    Incr Dziemin
    If Dziemin = 6 Then Dziemin = 0
    End If
    End If
    Else
    Minz = 0
    End If 'koniec zmiany minuty
    If Pind.0 = 0 Then 'zmiana godzin
    If Hz = 0 Then
    Hz = 1
    Incr Jedh
    If Dzieh = 2 And Jedh = 4 Then
    Dzieh = 0
    Jedh = 0
    Else
    If Jedh = 10 Then
    Jedh = 0
    Incr Dzieh
    If Dzieh = 10 Then Dzieh = 0
    End If
    End If
    End If
    Else
    Hz = 0
    End If 'koniec zmiany godzin
    Incr Mili
    If Mili = 250 Then
    Mili = 0
    Incr Mili1
    If Mili1 = 60 Then
    Mili1 = 0
    Incr Jedmin
    If Jedmin = 10 Then
    Jedmin = 0
    Incr Dziemin
    If Dziemin = 6 Then
    Dziemin = 0
    Incr Jedh
    If Dzieh = 2 And Jedh = 4 Then
    Dzieh = 0
    Jedh = 0
    Else
    If Jedh = 10 Then
    Jedh = 0
    Incr Dzieh
    If Dzieh = 10 Then Dzieh = 0
    End If
    End If
    End If
    End If
    End If
    End If
    Incr Ktory
    If Ktory = 4 Then Ktory = 0
    Portd = 127
    Select Case Ktory
    Case 0:
    Portb = Lookup(jedmin , Tabela)
    Portd.3 = 0
    Case 1:
    Portb = Lookup(dziemin , Tabela)
    Portd.4 = 0
    Case 2:
    Portb = Lookup(jedh , Tabela)
    Portd.5 = 0
    Portb.7 = 0
    Case 3:
    Portb = Lookup(dzieh , Tabela)
    Portd.6 = 0
    End Select
    Return
    
    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    
  • #4
    abduls
    Level 10  
    Witam ponownie.
    Panowie znajdźcie lepszy sposób na bicie postów. Niestety mój angielski jest za słaby żeby zrozumieć różnice, a i jestem zbyt zielony by bawić się z fusbitami (jeżeli taki jest mój problem). Trochę zmodyfikowałem mój kod i wszystko działa tak jak powinno, lecz nadal nie wiem czemu potrzebne są takie zmiany.

    
    Dim Mili As Byte
    Dim Mili1 As Byte
    Dim Jedmin As Byte
    Dim Dziemin As Byte
    Dim Jedh As Byte
    Dim Dzieh As Byte
    Dim Ktory As Byte
    Dim Minz As Byte
    Dim Hz As Byte
    Config Portb = 255
           Portb = 255
    Config Portd = 124
           Portd = 127
    Config Timer0 = Timer , Prescale = 8                 'zmiana
    Enable Interrupts
    Enable Timer0
    Jedmin = 0
    Dziemin = 0
    Jedh = 0
    Dzieh = 0
    On Timer0 Co4ms
    
    Do
    Loop
    End
    
    Co4ms:
       Timer0 = 6
       If Pind.1 = 0 Then    'początek zmiany minuty
          If Minz = 0 Then
             Minz = 1
             Incr Jedmin
             If Jedmin = 10 Then
                Jedmin = 0
                Incr Dziemin
                If Dziemin = 6 Then Dziemin = 0
             End If
          End If
        Else
          Minz = 0
       End If                'koniec zmiany minuty
       If Pind.0 = 0 Then    'zmiana godzin
          If Hz = 0 Then
             Hz = 1
             Incr Jedh
             If Dzieh = 2 And Jedh = 4 Then
                   Dzieh = 0
                   Jedh = 0
              Else
                If Jedh = 10 Then
                   Jedh = 0
                   Incr Dzieh
                   If Dzieh = 10 Then Dzieh = 0
                End If
             End If
          End If
        Else
          Hz = 0
       End If                'koniec zmiany godzin
       Incr Mili
       If Mili = 250 Then
          Mili = 0
           Incr Mili1
           If Mili1 = 120 Then           'zmiana
             Mili1 = 0
             Incr Jedmin
             If Jedmin = 10 Then
                Jedmin = 0
                Incr Dziemin
                If Dziemin = 6 Then
                   Dziemin = 0
                   Incr Jedh
                   If Dzieh = 2 And Jedh = 4 Then
                         Dzieh = 0
                         Jedh = 0
                    Else
                      If Jedh = 10 Then
                         Jedh = 0
                         Incr Dzieh
                         If Dzieh = 10 Then Dzieh = 0
                      End If
                   End If
                End If
             End If
          End If
       End If
       Incr Ktory
       If Ktory = 4 Then Ktory = 0
       Portd = 127
       Select Case Ktory
          Case 0:
             Portb = Lookup(jedmin , Tabela)
             Portd.3 = 0
          Case 1:
             Portb = Lookup(dziemin , Tabela)
             Portd.4 = 0
          Case 2:
             Portb = Lookup(jedh , Tabela)
             Portd.5 = 0
             Portb.7 = 0
          Case 3:
             Portb = Lookup(dzieh , Tabela)
             Portd.6 = 0
       End Select
    Return
    
    Tabela:
       Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    
  • #5
    ZbeeGin
    Level 39  
    Nie nabijamy sobie postów tylko staramy się wskazać drogę którą BĘDZIESZ MUSIAŁ podążyć by zacząć poważnie myśleć nad dalszym programowaniem. Nie chcesz - to zapomnij o dalszym pisaniu programów i zajmij się czym innym.
    Ale jeśli jednak chcesz dalej kontynuwać to od j. angielskiego nie uciekniesz, zatem warto poświęcić czas na jego nauke czym prędzej. Nie zawsze znajdzie się forum i troskliwi ludzie, którzy napiszą coś za Ciebie lub program poprawią. A tu ich raczej nie znajdziesz.

    Walka z fusebitami jest konieczna, gdyż twój (a w zasadzie P. Góreckiego) program zegarka nie będzie działał tak jak powinien. Nie dość, że procesor wogóle nie korzysta z podłączonego kwarcu to jeszcze jest taktowany częstotliwością 1MHz z małym "ale". A dowiedziałbyś się tego właśnie z FAQ i z danych katalogowych, które ci pod nos podstawiliśmy.
    Mimo, że przestawiłeś preskaler to w dalszym ciągu zegarek nie będzie chodził poprawnie. Ale nie będę uprzedzał faktów i cierpliwie poczekam(y) aż zadasz to drugie pytanie.

    I jeszcze jedno. W programie znajduje się dość poważny błąd z racji braku dwóch dyrektyw kompilatora, które to zawsze powinny znaleźć się na początku programu.
  • Helpful post
    #6
    perceuse
    Level 2  
    Witam, miałem ten sam problem. Prawdopodobnie wykonujesz projekt wedlug mikroprocesorowej oslej laczki. Nie sprawdzalem tego jak jest w AT902313 na bazie ktorego pisany byl kurs(dziwne że nic o tym nie pisza w kursie) ale w Attinie faktycznie musisz przestawic fusebity bo domyslnie masz taktowanie 1MHz.
    W bascomie robi sie to bardzo prosto:Program-->send to chip-->manual program
    dalej na zakladce Lock and Fuse Bits zmieniasz FUSEBIT C na opcje disabled i FUSEBIT KLA987 na jakis dla 4MHz i CKSEL=1101.
    I to tyle, u mnie zadziałało. Wcześniej żaden stoper i zegar nie działał prawidłowo.
    Panom przemądrzalskim radze nie pisać nic jeśli nie chcą pomóc a nie zgrywać alfe i omege. Każdy kiedyś zaczynał i ma prawo czegoś nie wiedzieć lub nie potrafić znaleźć.
  • #7
    abduls
    Level 10  
    Wielkie dzięki. Pierwsza forma programu działa nawet na Attinie. Zgadza się wykonuje kurs, lecz tu zalecane było napisanie programu samemu, a o fusebitach nie ma słowa (przynajmniej do tego momentu).