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

[AT89C2051][ATTINY2313][BASCOM] Przerobienie kodu bascom.

marcin1828881 06 Lut 2011 16:32 3800 12
REKLAMA
  • #1 9112235
    marcin1828881
    Poziom 10  
    Witam
    Zrobiłem ten termometr: http://mirley.firlej.org/termometr_domowy?page=1#comment-12504
    Jednak programowanie AT89C2051 nie należy do najłatwiejszych, więc chciałbym prosić o pomoc w "przerobieniu" tego kodu pod kontroler ATTINY2313. Zrobiłem już programator pod ATTINY2313 więc to byłaby najprostsza droga.
    Proszę o pomoc.

    Oto kod pod AT89C2051:
    Config Timer0 = Timer , Gate = Internal , Mode = 2            'okres Timera0 250*12*Tosc=250us
    Load Timer0 , 250
    On Timer0 Przerwanie
    Enable Interrupts
    Enable Timer0
    Start Timer0
     
    P1 = 255
    P3 = 255
    Config 1wire = P3.5
    '*******************************************************************************
                                      'Zmienne
    '*******************************************************************************
    Dim Lsb As Byte
    Dim Msb As Byte
    Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
    Dim Wysw As Byte , Wysw1 As Byte , Wysw10 As Byte
    Dim Tempa As Byte
    Dim Mux As Byte
    Dim Autooff As Word
    Dim Przycisk As Byte
     
    Dim Zezw_przyc As Bit , Zezw_wysw As Bit
    Dim Pomiar_odczyt As Bit
    Dim Minus As Bit
    Dim Pokaz As Bit
    Dim Przyc As Bit
    '*******************************************************************************
                                      'wartosci
    '*******************************************************************************
    Reset Pomiar_odczyt
    Set Pokaz
    Autooff = 1500
    '*******************************************************************************
                                      'Petla glowna
    '*******************************************************************************
    Do
     
    If Zezw_wysw = 1 Then                                         'wyswietlanie
      Reset Zezw_wysw
      '*****************************************      'co 4ms
      If P3.4 = 0 Then
        Incr Przycisk
        If Przycisk = 200 Then
          Przycisk = 0
          Set Przyc
        End If
      Else
        Przycisk = 180
        Reset Przyc
      End If
     
      If P3.7 = 0 Then
     
       If Przyc = 1 Then
        Reset Przyc
        Pokaz = Not Pokaz
       End If
     
      Else
     
       If Przyc = 1 Then
        Reset Przyc
        Set Pokaz
        Autooff = 1500
       End If
     
       If Autooff > 0 Then
        Decr Autooff
       Else
        Reset Pokaz
       End If
     
      End If
     
      If Pokaz = 1 Then
        Wysw = Tempa
        Gosub Przelicz
        Gosub Wyswietl
      Else
        P1 = 255
      End If
     
      '*****************************************
    End If
     
    Loop
    End
    '*******************************************************************************
                                      'Przerwanie Timera
    '*******************************************************************************
    Przerwanie:                                                   'co 250us
     Incr Co4ms
     If Co4ms = 16 Then
       Co4ms = 0
       '***************************************  co 4ms
       Set Zezw_wysw
       Incr Co100ms
       If Co100ms = 25 Then
         Co100ms = 0
         '*************************************** co 100 ms
         Set Zezw_przyc
         Incr Co1s
         If Co1s = 10 Then
           Co1s = 0
           '*************************************** co 1s
           Pomiar_odczyt = Not Pomiar_odczyt
     
           Disable Interrupts
           1wreset
     
           If Pomiar_odczyt = 1 Then
            1wwrite &HCC
            1wwrite &H44
           Else
            If Err = 0 Then
     
              1wwrite &HCC
              1wwrite &HBE
              Lsb = 1wread():
              Msb = 1wread():
     
              If Msb = 0 Then
                Reset Minus
                Tempa = Lsb / 2
              Else
                Set Minus
                Lsb = Not Lsb
                Tempa = Lsb / 2
                Tempa = Tempa + 1
              End If
     
            Else
              Tempa = 255                                         'Er wyswietli wyswietlacz potem
            End If
           End If
     
           Enable Interrupts
           '***************************************
         End If
         '***************************************
       End If
       '***************************************
     End If
    Return
    '*******************************************************************************
    Przelicz:
     If Wysw < 100 Then
       Wysw1 = Wysw Mod 10
       Wysw1 = Lookup(wysw1 , Tabela)
       If Wysw > 9 Then
         Wysw10 = Wysw / 10
         Wysw10 = Lookup(wysw10 , Tabela)
       Else
         Wysw10 = 255                                             ' znika 0 na pierwszym miejscu
       End If
     Else
       Wysw1 = 175                                                'r
       Wysw10 = 134                                               'E
     End If
     
    Return
    '*******************************************************************************
    Wyswietl:
      Incr Mux
      If Mux = 4 Then Mux = 0
     
      Select Case Mux
        Case 0:
         Set P3.0
     
         If Minus = 1 Then
           If Wysw10 = 255 Then
            P1 = 255
           Else
            P1 = 191
           End If
         Else
           P1 = 255
         End If
     
         Reset P3.3
        Case 1:
         Set P3.3
     
         If Minus = 1 Then
           If Wysw10 = 255 Then
            P1 = 191
           Else
            P1 = Wysw10
           End If
         Else
          P1 = Wysw10
         End If
     
         Reset P3.2
        Case 2:
         Set P3.2
     
         P1 = Wysw1
     
         Reset P3.1
        Case 3:
         Set P3.1
     
         P1 = 70
     
         Reset P3.0
      End Select
     
    Return
    '*******************************************************************************
                               'Tabela do wyswietlania na wyswietlaczu
    '*******************************************************************************
    Tabela:
        Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    'znak:    0     1     2     3     4     5     6     7     8     9
    '*******************************************************************************


    Spróbowałem własnymi siłami zmienić ten kod, ale nie dałem rady(błędy kompilacji). Wklejam jeszcze ten kod po błędnym poprawieniu(błędy zaznaczone strzałkami). Proszę o sprawdzenie.
    $regfile = "attiny2313.dat"
    $crystal = 12000000
    
    Config Portb = &B11111111 : Portb = &B11111111
    Config Portd = &B11111111 : Portd = &B11111111
    
    Config Timer0 = Timer , Prescale = 64            'okres Timera0 250*12*Tosc=250us
    Load Timer0 , 250
    
    Enable Interrupts
    Enable Timer0 : On Timer0 Przerwanie
    Start Timer0
     
    P1 = 255
    P3 = 255
    Config 1wire = Pind.5
    '*******************************************************************************
                                      'Zmienne
    '*******************************************************************************
    Dim Lsb As Byte
    Dim Msb As Byte
    Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
    Dim Wysw As Byte , Wysw1 As Byte , Wysw10 As Byte
    Dim Tempa As Byte
    Dim Mux As Byte
    Dim Autooff As Word
    Dim Przycisk As Byte
     
    Dim Zezw_przyc As Bit , Zezw_wysw As Bit
    Dim Pomiar_odczyt As Bit
    Dim Minus As Bit
    Dim Pokaz As Bit
    Dim Przyc As Bit
    '*******************************************************************************
                                      'wartosci
    '*******************************************************************************
    Reset Pomiar_odczyt
    Set Pokaz
    Autooff = 1500
    '*******************************************************************************
                                      'Petla glowna
    '*******************************************************************************
    Do
     
    If Zezw_wysw = 1 Then                                         'wyswietlanie
      Reset Zezw_wysw
      '*****************************************      'co 4ms
      If Portd.4 = 0 Then
        Incr Przycisk
        If Przycisk = 200 Then
          Przycisk = 0
          Set Przyc
        End If
      Else
        Przycisk = 180
        Reset Przyc
      End If
     
      If Portd.6 = 0 Then
     
       If Przyc = 1 Then
        Reset Przyc
        Pokaz = Not Pokaz
       End If
     
      Else
     
       If Przyc = 1 Then
        Reset Przyc
        Set Pokaz
        Autooff = 1500
       End If
     
       If Autooff > 0 Then
        Decr Autooff
       Else
        Reset Pokaz
       End If
     
      End If
     
      If Pokaz = 1 Then
        Wysw = Tempa
        Gosub Przelicz
        Gosub Wyswietl
      Else
        P1 = 255
      End If
     
      '*****************************************
    End If
     
    Loop
    End
    '*******************************************************************************
                                      'Przerwanie Timera
    '*******************************************************************************
    Przerwanie:                                                   'co 250us
     Incr Co4ms
     If Co4ms = 16 Then
       Co4ms = 0
       '***************************************  co 4ms
       Set Zezw_wysw
       Incr Co100ms
       If Co100ms = 25 Then
         Co100ms = 0
         '*************************************** co 100 ms
         Set Zezw_przyc
         Incr Co1s
         If Co1s = 10 Then
           Co1s = 0
           '*************************************** co 1s
           Pomiar_odczyt = Not Pomiar_odczyt
     
           Disable Interrupts
           1wreset
     
           If Pomiar_odczyt = 1 Then
            1wwrite &HCC
            1wwrite &H44
           Else
            If Err = 0 Then
     
              1wwrite &HCC
              1wwrite &HBE
              Lsb = 1wread():
              Msb = 1wread():
     
              If Msb = 0 Then
                Reset Minus
                Tempa = Lsb / 2
              Else
                Set Minus
                Lsb = Not Lsb
                Tempa = Lsb / 2
                Tempa = Tempa + 1
              End If
     
            Else
              Tempa = 255                                         'Er wyswietli wyswietlacz potem
            End If
           End If
     
           Enable Interrupts
           '***************************************
         End If
         '***************************************
       End If
       '***************************************
     End If
    Return
    '*******************************************************************************
    Przelicz:
     If Wysw < 100 Then
       Wysw1 = Wysw Mod 10
       Wysw1 = Lookup(wysw1 , Tabela)
       If Wysw > 9 Then
         Wysw10 = Wysw / 10
         Wysw10 = Lookup(wysw10 , Tabela)
       Else
         Wysw10 = 255                                             ' znika 0 na pierwszym miejscu
       End If
     Else
       Wysw1 = 175                                                'r
       Wysw10 = 134                                               'E
     End If
     
    Return
    '*******************************************************************************
    Wyswietl:
      Incr Mux
      If Mux = 4 Then Mux = 0
     
      Select Case Mux
        Case 0:
         Set Portd.0
     
         If Minus = 1 Then
           If Wysw10 = 255 Then
            P1 = 255
           Else
            P1 = 191
           End If
         Else
           P1 = 255
         End If
     
         Reset Portd.3
        Case 1:
         Set Portd.3
     
         If Minus = 1 Then
           If Wysw10 = 255 Then
            P1 = 191
           Else
            P1 = Wysw10
           End If
         Else
          P1 = Wysw10
         End If
     
         Reset Portd.2
        Case 2:
         Set Portd.2
     
         P1 = Wysw1
     
         Reset Portd.1
        Case 3:
         Set Portd.1
     
         P1 = 70
     
         Reset Portd.0
      End Select
     
    Return
    '*******************************************************************************
                               'Tabela do wyswietlania na wyswietlaczu
    '*******************************************************************************
    Tabela:
        Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    'znak:    0     1     2     3     4     5     6     7     8     9
    '*******************************************************************************
  • REKLAMA
  • #2 9138185
    modelarztt01
    Poziom 16  
    Na tej stronie z linku na dole znalazłem taki kod:
    '****************************
               'Konfiguracja
    '****************************
    $regfile = "attiny2313.dat"
    $crystal = 12000000
    
    Config Portb = &B11111111 : Portb = &B11111111
    Config Portd = &B11111111 : Portd = &B11111111
    
    Config 1wire = Pind.5
    
    Config Timer0 = Timer , Prescale = 64
    Enable Timer0 : On Timer0 Przerwanie0
    
    
    Enable Interrupts
    '****************************
          'Zmienne
    '****************************
    Dim Lsb As Byte
    Dim Msb As Byte
    Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
    Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
    Dim Wysw_pomoc As Word
    Dim Tempa As Word
    Dim Mux As Byte
    
    Dim Zezw_wysw As Bit
    Dim Pomiar_odczyt As Bit
    Dim Minus As Bit
    Dim Ur As Bit
    '****************************
          'Wartosci Poczatkowe
    '****************************
    Reset Pomiar_odczyt
    Reset Ur
    Wysw1 = 191
    Wysw10 = 191
    Wysw100 = 191
    '****************************
          'Petla glowna
    '****************************
    Do
    
    If Zezw_wysw = 1 Then
      Reset Zezw_wysw                                           'co 4ms
      Wysw = Tempa
    
      If Ur = 1 Then Gosub Przelicz
      Gosub Wyswietl
    End If
    
    Loop
    End
    '****************************
          'Przerwanie timer0
    '****************************
    Przerwanie0:
    Timer0 = 5
    Incr Co4ms
     If Co4ms = 3 Then
       Co4ms = 0
       '***************************************  co 4ms
       Set Zezw_wysw
       Incr Co100ms
       If Co100ms = 25 Then
         Co100ms = 0
         '*************************************** co 100 ms
         'ew flaga obslugi przyciskow
         Incr Co1s
         If Co1s = 7 Then
           Co1s = 0
           '*************************************** co 1s
           Pomiar_odczyt = Not Pomiar_odczyt
    
           Disable Interrupts
           1wreset
    
           If Pomiar_odczyt = 1 Then
            1wwrite &HCC
            1wwrite &H44
           Else
            If Err = 0 Then
    
              1wwrite &HCC
              1wwrite &HBE
              Lsb = 1wread():
              Msb = 1wread():
    
              Minus = Msb.7
    
              Tempa = Msb * 256
              Tempa = Tempa + Lsb
    
    
              If Minus = 1 Then
                Tempa = Not Tempa
                Tempa = Tempa + 1
              End If
    
              Tempa = Tempa * 10                                'temperatura *10
              Tempa = Tempa / 16
    
              If Ur = 0 Then Ur = 1
    
            Else
              Tempa = 10000                                     'Er wyswietli wyswietlacz potem
            End If
           End If
    
           Enable Interrupts
           '***************************************
         End If
         '***************************************
       End If
       '***************************************
     End If
    
    Return
    '****************************
          'Inne Etykiety
    '****************************
    Przelicz:
     If Wysw < 1000 Then
       Wysw_pomoc = Wysw Mod 10
       Wysw1 = Wysw_pomoc
       Wysw = Wysw / 10
       Wysw_pomoc = Wysw Mod 10
       Wysw10 = Wysw_pomoc
       Wysw = Wysw / 10
       Wysw_pomoc = Wysw Mod 10
       Wysw100 = Wysw_pomoc
    
       If Wysw100 = 0 Then Wysw100 = 10                         'wygaszenie zera wiodącego
    
       Wysw1 = Lookup(wysw1 , Tabela)
       Wysw10 = Lookup(wysw10 , Tabela2)
       Wysw100 = Lookup(wysw100 , Tabela)
    
     Else
       Wysw1 = 175                                              'r
       Wysw10 = 175                                             'r
       Wysw100 = 134                                            'E
     End If
    
    Return
    
    
    Wyswietl:
    
      Incr Mux
      If Mux = 3 Then Mux = 0
    
      Portd.6 = Not Minus
    
      Select Case Mux
        Case 0:
         Set Portd.0
          Portb = Wysw100
         Reset Portd.2
    
        Case 1:
         Set Portd.2
          Portb = Wysw10
         Reset Portd.1
    
        Case 2:
         Set Portd.1
         Portb = Wysw1
         Reset Portd.0
      End Select
    
    Return
    
    '****************************
    
    '****************************
    
    
    '*******************************************************************************
                               'Tabele do wyswietlania na wyswietlaczu
    '*******************************************************************************
    Tabela:
        Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
    'znak:    0     1     2     3     4     5     6     7     8     9     pusty
    
    Tabela2:
        Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
    'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
    '*******************************************************************************
    
    '*******************************************************************************. 
    Który wystarczyło ściągnąć i otworzyć w Bascomie.
  • REKLAMA
  • #3 9138422
    marcin1828881
    Poziom 10  
    To jest akurat kod z projektu "Termometr uniwersalny", a ja zrobiłem projekt "Termometr Domowy". Oba termometry są podobne, ale niestety nie takie same.
    Czy nie ma na tym forum osoby, która może pomóc?
  • #4 9139382
    sp3ots
    Poziom 38  
    Witam !
    Marcin, w przerobionym przez Ciebie kodzie nie przerobiłeś takich linii:
    P1 = 255
    P3 = 255
    napisz je tak:
    PortB = 255
    PortD = 255


    P1 - to jest PORTB w ATTInyy2313
    P3 - to jest PORTD w ATTInyy2313

    Pozmieniaj te linie.
    Jeśli dobrze policzyłem masz jeszcze 11 linii do poprawki.
    Pozdrawiam. Stefan
    ps. Czy po tych zmianach program będzie działał poprawnie ? nie mam pojęcia, ale się kompiluje.
  • REKLAMA
  • #5 9139411
    zumek
    Poziom 39  
    marcin1828881 napisał:
    ...Spróbowałem własnymi siłami zmienić ten kod, ale nie dałem rady(błędy kompilacji)...

    Aby to zrobić bezbłędnie, należy znać oba proce na "tip-top" :D
    Ja zrobiłbym to tak:
    
    'Termometr Domowy'
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    
    'Config Timer0 = Timer , Gate = Internal , Mode = 2            'okres Timera0 250*12*Tosc=250us
    Config Timer0 = Timer , Prescale = 8 , Clear Timer = 1
    
    'Load Timer0 , 250
    Ocr0a = 249
    
    On Oc0a Przerwanie       'On Timer0 Przerwanie
    Enable Oc0a       'Enable Timer0
    Enable Interrupts
    'Start Timer0
    
    P1 Alias Portb
    P3 Alias Portd
    Pp3 Alias Pind
    
    P1 = 255
    P3 = &B01011111       '255
    
    Config P1 = Output
    Config P3 = &B00001111
    
    
    Config 1wire = Portd.5       'p3.5
    '*******************************************************************************
                                      'Zmienne
    '*******************************************************************************
    

    W pętli głównej, poprawić linie kodu odpowiedzialne za odczyt pinów. Poza tym, fusebity skonfigurować na wew. oscylator 8MHz, wyłączyć CKDIV8 i... tyle.
  • #6 9139940
    Marcin1828
    Poziom 11  
    sp3ots:
    Rzeczywiście bez twoich poprawek nie kompilował się, teraz kompiluje, ale nie działa tak jak powinien. Wyświetla temp. 0 st.

    zumek:
    Dlaczego na wew. oscylator? W projekcie mam osobny kwarc 12MHz.
    I czy fuse bity mogę ustawić odpowiednio w programie BascomAVR?
  • REKLAMA
  • #7 9140088
    sp3ots
    Poziom 38  
    Dlaczego na wew. oscylator?
    Bo do odczytu temperatury ta opcja wystarczy.
    Rezonator na pewno nie zaszkodzi.
  • #8 9140177
    Marcin1828
    Poziom 11  
    Ale rezonator w takiej sytuacji jest do czegoś potrzebny? Jest używany?
  • #9 9140202
    piotrva
    VIP Zasłużony dla elektroda
    jeśli w fusebitach zaprogramowałeś na wewnętrzny oscylator, to kwarc jest zupełnie niepotrzebny, a w tiny2313 piny pod które jest podpięty mogą funkcjonować jako zwykłe piny i/o
  • #10 9141457
    marcin1828881
    Poziom 10  
    Chciałem sprawdzić przerobiony program i napotkałem problem. BascomAVR nie może zidentyfikować attiny2313. Da się odczytać ROM, ale nie da się zapisać do procka. Oto zdjęcie:
    [AT89C2051][ATTINY2313][BASCOM] Przerobienie kodu bascom.

    Mam 2 programatory:
    -prosty kabel programujacy
    -stk200

    Błąd pojawia się w przypadku obu programatorów. Tydzień temu wszystko grało, ale wczoraj przeinstalowałem win xp sp3. Może to jest przyczyną.
    Wrzucam jeszcze zdjęcia ustawień LPT z BIOSu:
    [AT89C2051][ATTINY2313][BASCOM] Przerobienie kodu bascom.

    i ustawień programatora w BascomAVR:
    [AT89C2051][ATTINY2313][BASCOM] Przerobienie kodu bascom.
  • #11 9141574
    sp3ots
    Poziom 38  
    Parallel port mode ustaw - EPP + ECP
    Jeśli przedtem fuse bity miałeś ustawione na zewnętrzny rezonator i być może usunąłeś go z układu to programator nie będzie Tiny widział.
  • #12 9141582
    piotrva
    VIP Zasłużony dla elektroda
    dokładnie, układ wtedy nie będzie miał źródła taktowania, więc podłącz rezonator ponownie
  • #13 9141817
    marcin1828881
    Poziom 10  
    Nie pomogło, pojawia się błąd, tylko o innym id.
REKLAMA