AVT3008 89C4051 -> Attiny2313 - konwersja kodu


Witem forumowiczów.
Mam taki oto problem. Brat kiedyś kupił kit AVT-3008, jest to przedwzmacniacz na układzie TDA8425, sterowany mikrokontrolerem Atmela 89C4051. Po złożeniu okazało się, że nie działa. Jakoś tak ostatnio zainteresowałem się programowaniem mikrokontrolerów i z jakimś tam doświadczeniem postanowiłem uruchomić ten wzmacniacz. Niestety programatora do tego procka nie mam, bo bawię się rodziną procków AVR. Postanowiłem zamienić użyty w tym projekcie procek na Attiny2313. Problemem dla mnie jest przerobienie kodu, tak aby dało się go skompilować. Czy mógłby ktoś mi powiedzieć co trzeba zmienić, oprócz nazw portów. Niżej zamieszczam kod:

$large
Config Lcd = 16 * 2
Config Timer1 = Timer , Gate = Internal , Mode = 1
Config Sda = P3.1
Config Scl = P3.0
Dim Licz As Byte
Dim I As Byte
Dim Nast(5) As Byte
Dim St As String * 7
Dim W_reg As Integer
Dim Wielk1 As Byte
Dim Wielk2 As Byte
Dim X As Byte
Dim Value As Byte
Dim Adres As Byte
Dim S As Byte
Dim We As Bit
Dim A As Byte
Dim C As Byte
Dim Flaga1 As Bit
Dim Kod As Byte
Dim Vp As Byte
Dim Vl As Byte
Dim Xxx As Byte
Deflcdchar 0 , 1 , 2 , 2 , 4 , 4 , 2 , 2 , 1
Deflcdchar 1 , 5 , 10 , 18 , 20 , 20 , 18 , 10 , 5
Deflcdchar 2 , 16 , 8 , 8 , 4 , 4 , 8 , 8 , 16
Deflcdchar 3 , 20 , 10 , 9 , 5 , 5 , 9 , 10 , 20
S1 Alias P3.7
S2 Alias P3.5
S3 Alias P3.4
Declare Sub Zmien()
Declare Sub Regul
Declare Sub Wys(st As String * 8)
Declare Sub Przedz
Declare Sub Wyslij(kod As Byte , Adres As Byte , Value As Byte)
Declare Sub Warunk(a As Byte , C As Byte)
Declare Sub Read_i(adres As Byte , Value As Byte)
Declare Sub Up
Declare Sub Down
Declare Sub Wejscie
On Timer1 Timer1_int
On Int1 Mute
Enable Int1
Enable Timer1
Enable Interrupts
 
'Poczatek programu
Cursor Off Noblink
Counter1 = 4150
Licz = 0
Cls
Lcd "** Ver. 1.00 **"
Wait 2
Cls
Set S1
Set S2
Set S3
Set P3.2
Set P3.3
Call Read_i 15 , Value                                        ' odczyt danych z eeprom
If Value = 60 Then
  Call Read_i 2 , Value
  Nast(1) = Value
  Call Read_i 3 , Value
  Nast(2) = Value
  Call Read_i 5 , Value
  Nast(3) = Value
  Call Read_i 6 , Value
  Nast(5) = Value
  Call Read_i 8 , Value
  S = Value
 Else                                                         'jezeli brak pamieci to ponizsze parametry zmiennych
  Nast(1) = 6                                                 'bass
  Nast(2) = 6                                                 'treble
  Nast(3) = 10                                                'baland
  Nast(4) = 1                                                 'efekty
  Nast(5) = 40                                                'volume
  S = &B11001110
End If
 
Nast(4) = S And &B00011000                                    ' odpowiednie ustawienie rodzaju efektu
Rotate Nast(4) , Right , 3
 
Vl = 0                                                        ' odpowiednie ustawienia balansu
Vp = 0
If Nast(3) >= 10 Then
   Vp = Nast(3) - 10
  Else
   Vl = 10 - Nast(3)
End If
 
I = 5
 
Call Zmien                                                    ' wywolanie procedury wpisujacej dane do eeprom i procesora dzwieku
Counter1 = 4150
 
Do                                                            'petla glowna programu
   While S.5 = 1                                              ' jezeli s.5=1 to wyswietl mute
     Lcd "MUTE"
   Wend
   Waitms 220
   If S1 = 0 Then                                             ' przycisk mode
     Incr I
    If I = 6 Then
     I = 1
    End If
    Call Zmien
    Bitwait S1 , Set
   End If
   If S3 = 0 Then                                             'przycisk down
    Decr Nast(i)
    Call Zmien
   End If
   If S2 = 0 Then                                             ' przycisk up
    Incr Nast(i)
    Call Zmien
   End If
   If P3.2 = 0 Then                                           ' przycisk wejscie
    Call Wejscie
    Bitwait P3.2 , Set
   End If
Loop
End
 
Sub Zmien
   If I <> 5 Then
    Licz = 0
    Start Timer1                                              ' uruchamia timer
   End If
   Cls
   We = S.0
   Wielk2 = 1
   If I = 1 Then                                              ' bass
    Wielk1 = 12
    Call Przedz
    Call Wys( "Bass:")
    Call Przelicz
    Call Regul
   Elseif I = 2 Then                                          ' treble
    Wielk1 = 11
    Call Przedz
    Call Wys( "Treble:")
    Call Przelicz
    Call Regul
   Elseif I = 3 Then                                          ' balans
    Vl = 0
    Vp = 0
    Wielk1 = 20
    Wielk2 = 0
    Call Przedz
    Call Wys( "Balans:")
    If Nast(3) >= 10 Then
      Vp = Nast(3) - 10
     Else
      Vl = 10 - Nast(3)
    End If
    Lowerline
    Lcd "      " : Lcd Vl : Lcd "-" : Lcd Vp
   Elseif I = 4 Then                                          ' effect
    Wielk1 = 4
    Wielk2 = 255
    Call Przedz
    Call Wys( "Effect:")
    Waitms 50
    Lowerline
    If Nast(4) = 0 Then
       Lcd "Mono"
       Reset S.3
       Reset S.4
    Elseif Nast(4) = 1 Then
       Lcd "Liniowe St"
       Reset S.4
       Set S.3
    Elseif Nast(4) = 2 Then
       Lcd "Pseud St"
       Set S.4
       Reset S.3
    Elseif Nast(4) = 3 Then
       Lcd "Przest St"
       Set S.3
       Set S.4
    End If
   Elseif I = 5 Then                                          ' volume
    Wielk1 = 64
    Stop Timer1                                               ' zatrzymanie timera
    Counter1 = 4150
    Call Warunk(21 , 28)
    Call Warunk(27 , 20)
    Call Warunk(19 , 20)
    Call Przedz
    Call Wys( "Volume:")
    Call Przelicz
    W_reg = Nast(5) - 60                                      ' przelicza wartosci binarne na odpowiadajace im wartosci dB
    W_reg = W_reg * 2
    Locate 2 , 1 : Lcd "Input: " : Lcd We : Lcd "    "
    If Nast(4) = 0 Then
     Lcd Chr(0) : Lcd Chr(2)
    Elseif Nast(4) = 1 Then
     Lcd Chr(1) : Lcd Chr(3)
    Elseif Nast(4) = 2 Then
     Lcd "-" : Lcd Chr(1) : Lcd Chr(3) : Lcd "-"
    Elseif Nast(4) = 3 Then
     Lcd "+" : Lcd Chr(1) : Lcd Chr(3) : Lcd "+"
    End If
    Call Regul
   End If
   W_reg = Nast(5) - 27                                       ' obliczanie odpowiednio balansu
   If Vl = 9 Then
    A = 0
   Else
    A = 10 - Vl
   End If
   W_reg = W_reg * A
   Xxx = W_reg / 10
   A = Xxx + 27
   W_reg = Nast(5) - 27
   If Vp = 9 Then
    C = 0
   Else
    C = 10 - Vp
   End If
   W_reg = W_reg * C
   Xxx = W_reg / 10
   C = Xxx + 27
   For Kod = 130 To 160 Step 30                               ' zapis danych do pamieci i procesora dzwieku
    Call Wyslij Kod , 2 , Nast(1)
    Call Wyslij Kod , 3 , Nast(2)
    Call Wyslij Kod , 0 , C
    Call Wyslij Kod , 1 , A
    Call Wyslij Kod , 8 , S
   Next Kod
   Call Wyslij 160 , 5 , Nast(3)
   Call Wyslij 160 , 6 , Nast(5)
   Call Wyslij 160 , 15 , 60
End Sub
 
Sub Wys (st As String * 8)                                    ' wyswietla na wyswietlaczu zmienna st
  Cls
  Lcd St
End Sub
 
Sub Regul                                                     ' dba o odpowiednie wyswietlanie ujemnych i dodatnich liczb
   If W_reg < -9 Then
      X = 12
   Elseif W_reg < 0 Then
      X = 13
   Elseif W_reg > 9 Then
      X = 13
   Elseif W_reg >= 0 Then
      X = 14
   End If
   Locate 1 , X : Lcd W_reg : Lcd "dB"
End Sub
 
Sub Przelicz                                                  ' przelicza wartosci binarne  bass i treble na odpow. im wart. w dB
  W_reg = Makedec(w_reg)
  If I = 1 Or I = 2 Then
   W_reg = Nast(i) * 3
   W_reg = W_reg - 18
  End If
End Sub
 
Sub Przedz                                                    ' okresla zakresy wyswietlanych liczb
  If Nast(i) = Wielk1 Then
    Nast(i) = Nast(i) - 1
  End If
  If Nast(i) = Wielk2 Then
    Nast(i) = Wielk2 + 1
  End If
End Sub
 
Sub Warunk(a As Byte , C As Byte )                            ' warunek dba o wyswietlanie odpowiednich wartosci glosnosci
  If Nast(i) = A Then
    Nast(i) = C
  End If
End Sub
 
Sub Wejscie                                                   ' przelacza wejscia 0 na 1 i odwrotnie
  If S.0 = 1 Then
    Reset S.0
  Else
    Set S.0
  End If
  Call Zmien
End Sub
 
Mute:                                                         ' przerwanie funkcji mute
 If S.5 = 0 Then
   Set S.5
 Else
   Reset S.5
 End If
 Call Zmien
 Bitwait P3.3 , Set
 Waitms 250
Return
 
Sub Wyslij (kod As Byte , Adres As Byte , Value As Byte)      ' wysyla dane przez i2c
   I2cstart
   I2cwbyte Kod
   I2cwbyte Adres
   I2cwbyte Value
   I2cstop
   Waitms 10
End Sub
 
Sub Read_i(adres As Byte , Value As Byte)                     ' odbiera dane i2c
   I2cstart
   I2cwbyte 160
   I2cwbyte Adres
   I2cstart
   I2cwbyte 161
   I2crbyte Value , 9
   I2cstop
End Sub
 
Timer1_int:                                                   ' dba o odpowiednie odliczenie czasu po ostatnim nacisnieciu przycisku
   Counter1 = 4150
   If Licz = 75 Then
     I = 5
   Call Zmien
   End If
   Incr Licz
   Start Timer1
Return

Bascom krzyczy, że nie wie o co chodzi przy konfiguracji timera, jak to wykomentuję, to ma też problem z którąś funkcją, że niby nie jest zadeklarowana. Ja ogólnie nie orientuję się na bascomie, bo do tej pory kodowałem w C.
Proszę o pomoc, może być nawet skompilowany wsad do procka :) Dziękuję.




Portret użytkownika matrix

Re: AVT3008 89C4051 -> Attiny2313 - konwersja kodu

Co do konfiguracji timera to napisz tak:

CONFIG TIMERx = TIMER , PRESCALE = y

gdzie x to numer timera a y podział (może być 1, 8, 64, 256, 1024)
Co do deklaracji czegoś tam to musisz podać dokładnie ocb?

Portret użytkownika MrDoctor

Z tego co się dopatrzyłem w

Z tego co się dopatrzyłem w dokumentacji 89C4051, a w zasadzie nie dopatrzyłem się to on nie ma dzielników do licznika, więc ustawię PRESCALE = 1.
Dalej kompilator zgłasza takie błędy:
"TYPE expected [STRING*8]" dla linii

Declare Sub Wys(ST As String * 8) 

oraz "SUB or FUNCTION not DECLARED [READ_I 15 , VALUE]" dla linii
Call Read_i 15 , Value                                      ' odczyt danych z eeprom

to jest pierwsze wywołanie tej procedury.

Portret użytkownika matrix

Re: AVT3008 89C4051 -> Attiny2313 - konwersja kodu

Co ile ma być wywoływane przerwanie od timera? Podam Ci co trzeba wpisać.
Ogólnie dla mnie niezrozumiale jest napisanie np czegoś takiego:

Declare Sub Wyslij(kod As Byte , Adres As Byte , Value As Byte)

W życiu czegoś takiego nie widziałem i nie wiem jaką ma pełnić funkcję?

Portret użytkownika MrDoctor

Dokładnie to nie wiem co ile

Dokładnie to nie wiem co ile ma być to przerwanie od timera, jedyne czym dysponuję to opis kitu z avt i kod który ściągnąłem ze strony edw. Ta procedura którą cytujesz służy do obsługi scalaka TDA8425 po magistrali I2C. Mirley opisał nawet jego obsługę. Mi na razie staje kompilator na wcześniej wymienionych błędach i nie mam pojęcia o co mu chodzi.
Jakbyś mógł to wrzucić u siebie w bascoma i zobaczyć czy da się to skompilować to byłbym bardzo wdzięczny matrix0606 albo ktokolwiek :)

Portret użytkownika matrix

W ogóle jest sporo rzeczy do

W ogóle jest sporo rzeczy do zmiany. Na przykład w bascom avr nie konfiguruje się portów w ten sposób bo będzie wywalać błędy:

Config Sda = P3.1
Config Scl = P3.0

Trzeba napisać konkretnie, na przykład
Config Sda = portb.1
Config Scl = portb.0

Tak samo nie można napisać:
S1 Alias P3.7
S2 Alias P3.5
S3 Alias P3.4

Trzeba napisać konkretnie:
S1 Alias pind.7
S2 Alias pind.5
S3 Alias pind.4

Oczywiście wszystko to przykład bo całość czyli konfiguracja pinów będzie zależeć od tego gdzie co podepniesz. Jak nie poczytasz o bascom avr to nic z tego nie będzie, bo oznaczało by to napisanie dla Ciebie prawie od nowa kodu do obsługi tego przedwzmacniacza.

Poza tym co tylko usunę jeden błąd to kompilator wywala następny. Tak czy siak pewnie trzeba będzie napisać kod od nowa.

Portret użytkownika MrDoctor

O pinach to akurat wiem, i

O pinach to akurat wiem, i pozmieniałem numery tak, żeby wszystkie wyprowadzenia były w odpowiednich miejscach. Czy u Ciebie też wywala te same błędy o których wcześniej wspomniałem? Mam namyśli deklarację procedury wysyłającej dane na wyświetlacz i to wywołanie tej drugiej procedury.

Portret użytkownika matrix

Re: AVT3008 89C4051 -> Attiny2313 - konwersja kodu

Wywala dokładnie te same błędy. Musisz dobrze przestudiować obsługę którą podał Mirek i zmienić tak żeby to działało.

Portret użytkownika MrDoctor

Rozumiem też, że nie wiesz

Rozumiem, że nie wiesz jak je skorygować ;/
Ja myślę, że tu nie chodzi o samą implementację obsługi tego TDA, tylko o składnie kodu, która trochę się różni między rdzeniami '51 i AVR. W końcu po to są jeżyki wysokiego poziomu, żeby kod był przenośny.

Portret użytkownika matrix

Re: AVT3008 89C4051 -> Attiny2313 - konwersja kodu

Ciężko powiedzieć czy nie wiem, bo nie bardzo chce mi się do tego zasiadać. U mnie zawsze wszystko wychodzi w praniu. Wiem że sporo zmian będzie.

Portret użytkownika mirley

Re: konwersja kodu

Takie działanie nie ma sensu... program i tak nie zmieści się w tiny2313, bo w 89C4051 zajmował grubo ponad 2k

Radził bym zająć się napisaniem prostszej wersji tego programu w oparciu o to co napisalem na stronie. Popatrz na mój przedwzmacniacz cyfrowy, tam jest prawie cały program tylko trzeba by dopisac LCD

instrukcje declare sub to deklaracja podprogramu.... ponieważ sam miałem problemy żeby skompilować kod z podprogramami to osobiście zawsze używam etykiet gosub

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rysiek55

Czy program na mikrokontroler 89C4051 ma jakiś błąd?

Wcześniej też próbowałem przenieść kod z kości 89C4051 na Attiny3213, i dostawałem te same błędy kompilacji podane wcześniej przez innych. Ale jak Mirek wspomniał, że nie ma sensu przenosić ten kod na kość Attiny3213, bo i tak nie zmieści się w jej pamięci, to dałem spokój.
Robiłem to, bo chciałem znaleźć ewentualny błąd w programie powodujący, że nie działa mi jeden kanał w kicie AVT-3008. Sprawdzałem wszystko dokładnie na płytce, nie było żadnych zwarć. Nie podejrzewam uszkodzenia TDA8425, bo od początku był na podstawce. Nigdzie w internecie nie znalazłem rozwiązania tego problemu. Spotkałem na forum gościa, który miał ten sam problem, ale też nie podał rozwiązania, jedynie podejrzewał błąd w programie.
Zauważyłem, że podany na górze program na kość Atmela 89C4051 nie posiada procedur inicjacji I2C, tj I2CINIT. Wiem, że dla rdzenia AVR powinno się stosować się tę procedurę, ale nie wiem, czy to także dotyczy rdzenia 51.

Moje dodatkowe pytanie:
Czy istnieje jakaś możliwość zainstalowania BASCOM-AVR i BASCOM-8051 na platformie Windows7?
Dziękuję z góry za odpowiedzi.

-

Ryszard z Wrocławia
GG: 2272319

Portret użytkownika MrDoctor

Dzięki Mirley, nie

Dzięki Mirley, nie pomyślałem, że ten kod nie zmieści się w attiny. Będę kombinował, żeby coś po swojemu napisać, jak skończę to pewnie się pochwalę :)
@rysiek55 ja BASCOM-AVR bez problemu zainstalowałem na win7 - producent podaje że jest kompatybilny z vistą, więc z 7 nie powinno być problemów i u mnie nie było.

Portret użytkownika rysiek55

Dzięki MrDoctor

Już wiem doc o tym, bo też zainstalowałem go przed godzinę, ale tylko Bascom-AVR. W dalszym ciągu nie mogę zainstalować na Win7 wersji Bascomu-8051. Potrzebuję tej wersji, gdy próbuję coś zrobić z kostką 89C4051.

-

Ryszard z Wrocławia
GG: 2272319

Portret użytkownika gosc

pytanie

mam takie zapytanie czy ktoś przerobił ten program na attini 2313 bo ma ten układ od dłuższego czasu i właśnie mi nie działa i natrafiłem na ten temat wiem że stary ale może ma ktoś jeswzcze ten program??