• Witamy w największym polskim serwisie internetowym poświęconym w całości zagadnieniom samodzielnej budowy nagłośnienia.
    Dzięki DIYaudio.pl poznasz zagadnienia samodzielnej budowy nagłośnienia od podszewki oraz będziesz mógł dyskutować o DIY audio do woli.

    Artykuły z dawnego portalu zostały przeniesione do sekcji forum na samym dole.

Preamp DIY PGA2311

Rejestracja
Mar 21, 2013
Postów
149
Reakcji
0
Lokalizacja
Łódź-Irlandia
Witam wszystkich mam problem z napisaniem kodu w Bascom.
Chodzi o przed wzmacniacz stereofoniczny na układzie PGA2311 z zegarem i data na PCF8583 oraz sterowaniem chłodzenia końcówek mocy na DS18b20.
Całe sterowanie menu i wybieranie danej funkcji chce zrobić na enkoderze obrotowym.
Menu chciałem tylko do ustawienia zegarka i daty,wartość przy jakiej uruchamia się wiatrak na końcówce mocy jest ustawiona na stale czyli powyżej 30 stopni jest na ON a gaśnie przy 20 stopniach.
Podczas działania przedwzmacniacza na wyświetlaczu chciał bym ze by była wyświetlana godzina+data w monecie zwiększenia lub zmniejszenia głośności stan potencjometru przez ok 3-5sek
Programy mam napisane do wszystkich urządzeń podłączonych do Atmegi8 ale nie wiem jak je połączyć w całość niestety moja wiedza w programowaniu jest niewystarczająca do ogarnięcia tego tematu może ktoś z forumowiczów bardziej doświadczony i zorientowany w temacie będzie mógł mi pomoc w napisaniu programu do mojego preampa.
Napisałem taki wstępny kod w Bascomie ale nie działa tak jak powinien
to znaczy nie mogę zrobić termostatu ze by działał cały czas w moim programie działa on tak ze dopiero po wejściu do programu TERMOMETR zaczyna on działać ale po przejściu do innego programu z menu przestaje
Co do zegarka na PCF8583 dodałem jeszcze 5 przycisków do ustawień daty i godziny nie wiem jak przerobić to ustawianie godziny i daty abym mógł sterować enkoderem i switchem z enkodera
Do PGA2311 jeszcze nie doszedłem ponieważ mam problem z pierwsza częścią kodu może ktoś z bardziej doświadczonych forumowiczów może coś mi pomoc
Dodaje kod
Pokaż załącznik ENKODER_WERSJA_NA_INT0_INT1+MENU_NA_SELECT_CASE.rar
 
Na tym forum jest malo programistow bascom-a, popytaj na elektrodzie. Choc tam strasznie wywalaja posty wiec lepiej poszukac po starzu kogos kto ma doswiadczenie w mikroprocesorach i probowac zagadac na PW.


na stale czyli powyżej 30 stopni jest na ON a gaśnie przy 20 stopniach.

Idiotyczne zalozenie!! Widze ze i z podstawami masz problemy. Typowo w dom,u jest wiecej niz 20 stopni a wiec wentylator nigdy ci sie nie wylaczy. A 30 stopni to coz za grozna temeratura zeby od razu uruchamiac wentylator? Ja bym zrobil gorna >60 stopni a moze nawet 80 a dolna ok 50. Zreszta wszystko zalezy od wielkosci radiatora i sily wentylatora. W domowych wzmacniaczach o mocy do ok 2x100W nie ma sensu stosowac wentylatorow.
 
Witam
Na elektrodzie tez dałem temat w związku z tym projektem jak narzazie bez odzewu
Co do zaczepek na PW to ja tak nie robię ale chyba zacznę
Co do termostatu to nie jest powiedziane ze tak będzie na stale jak bym ustawił np załącz przy 70 wyłącz przy 40 to jak bym miał to sprawdzić?
co zapalniczka lub papierosem DS-a bym rozgrzewał bo nie wiem jak ty byś poradził sobie z uzyskaniem 70 czy 80 stopni
A tak na marginesie to chłodzenie ma być w formie bajeru
Nie wierze ze na takim forum jak to nikt nie zajmuje się programowaniem lub nie miał do czynienia z cyfrowymi potencjometrami
Czekam na jakieś rady jak napisać poprawnie program do mojego preampa
 
Odpuść sobie to aktywne chłodzenie. Jak budowałem pierwszy wzmacniacz to też sie na to napaliłem a w praktyce sie okazło zupełnie zbędne.. Jak sie wzmacnaicz za abrdzo grzeje to lepiej dać większe radiatory.
 
zekam na jakieś rady jak napisać poprawnie program do mojego preampa
Prosto.
Uruchamiasz timer na przepełnienie np 1s (temp przecież nie musi być mierzona cały czas.)
W przerwaniu od timera szczytujesz temperaturę z ds-a do globalnej zmiennej "temp".
W pętli głównej spr. czy temp jest mniejsza /większa od ustalonego progu i włączasz/ wyłączasz wentylator czy co tam chcesz.

Wentylator sobie odpuść no chyba że to jakiś kloc z kilowatami mocy ;)
Ale zab. termiczne wyłączające wzmacniacz po osiągnięciu zadanej temp. się przydaje ;)

U mnie zrobiłem tak że po przekroczeniu 75 stopni moc jest ograniczana do 25W a jak to nie pomoże i dalej temp. wzrasta wzmacniacza jest wyłączany.
 
Co do termostatu to nie jest powiedziane ze tak będzie na stale jak bym ustawił np załącz przy 70 wyłącz przy 40 to jak bym miał to sprawdzić?
co zapalniczka lub papierosem DS-a bym rozgrzewał bo nie wiem jak ty byś poradził sobie z uzyskaniem 70 czy 80 stopni

No jak to jak?? Przeciez wzmacniacz sie nagrzewa a skoro ci sie nie nagrzewa do takiej temperatury to po co ci aktywne chlodzenie?
 
Teoretycznie PGA2311 jest proste do sterowania - podajesz stan wysoki na odpowiedni pin i masz głośniej/ciszej. Problem leży w tym, żeby go odpowiednio zaaplikować. Potrzeba stabilizowanego źródła, jak podepniesz do zwykłego to go możesz usmażyć - zresztą ja też tak prawie usmażyłem. Enkoder musisz odfiltrować kondensatorami 100nf, żeby nie pojawiały się fałszywe stany. Poza tym nie wiem czy ci się to zmieści w bascomie i 8kb pamięci. Coś mi się wydaje, że będziesz zmuszony zastosować przerwania w programie.
 
Zmuszony? Przecież przerwania to najlepsze co może być w procesorach...

PGA2311 jest sterowany poprzez I2C więc tłumaczenie tego "dajesz na pin stan wysoki i masz głośniej/ciszej" to co najmniej niepoważne, wszystko jest w nocie układu dokładnie opisane.

I co ma znaczyć wg. ciebie stabilizowane źródło a zwykłe w którym niby ten układ się usmaży?
 
PGA2311 jest sterowany poprzez I2C więc tłumaczenie tego "dajesz na pin stan wysoki i masz głośniej/ciszej" to co najmniej niepoważne, wszystko jest w nocie układu dokładnie opisane.

PGA2311, PGA2310, PGA4311 i wszystkie pochodne są sterowane przez coś podobnego do SPI, choć oni nazywają to: 3-wire serial control interface.
W zasadzie sterowanie można zrobić na jednej pętli FOR.
 
Skojarzyłem z innym układem ale to jest praktycznie to samo, SPI tutaj będzie minimalnie prostsze do implementacji.

Jak na razie gdybać można ale kolega kulamario tego nie zrobi tylko oczekuje aż ktoś za niego to wykona.
 
Panowie chyba zbaczamy troszkę z tematu
Co do kodu do PGA2311 mam napisany
Nie oczekuje az ktos napisze licze na wzkazowki jak to wszystko polaczyc w calosc
co do kodu prosze

Set Portd.7


Dim Vol As Long , Mute_stat As Long , A As Bit , I As Integer , Db As Single
Vol = 0
Mute_stat = 0
A = 0
I = 100

Cls
Vol = 257 * I
Db = 255 - I
Db = Db * 0.5
Db = 31.5 - Db
Lcd "Volume: " ; Db ; " dB"

Do
If Pinc.5 = 1 Then Gosub Mute
If Pinc.4 = 1 Then Gosub Vol_up
If Pinc.3 = 1 Then Gosub Vol_dn
Loop


Mute:
If A = 0 Then
Do
Cls
Lcd " MUTE ON "
Mute_stat = 0
Reset Portd.7
Shiftout Portd.6 , Portd.5 , Mute_stat , 1
Waitms 500
Set Portd.7
Cls
Waitms 500
Loop Until Pinc.5 = 1
A = 1
Else
Cls
Lcd " MUTE OFF "
Mute_stat = I * 257
Reset Portd.7
Shiftout Portd.6 , Portd.5 , Mute_stat , 1
Wait 1
Set Portd.7

Cls
Db = 255 - I
Db = Db * 0.5
Db = 31.5 - Db
Lcd "Volume: " ; Db ; " dB"
A = 0
End If
Return

Vol_up:
Cls
If I < 255 Then
I = I + 1
Vol = 257 * I
Db = 255 - I
Db = Db * 0.5
Db = 31.5 - Db
Lcd "Volume: " ; Db ; " dB"
Reset Portd.7
Shiftout Portd.6 , Portd.5 , Vol , 1
Waitms 100
Set Portd.7

Else
Lcd " Max. Volume "
Wait 1
Cls
Lcd "Volume: " ; Db ; " dB"
End If
Return

Vol_dn:
Cls
If I > 0 Then
I = I - 1
Vol = 257 * I
Db = 255 - I
Db = Db * 0.5
Db = 31.5 - Db
Lcd "Volume: " ; Db ; " dB"
Reset Portd.7
Shiftout Portd.6 , Portd.5 , Vol , 1
Waitms 100
Set Portd.7

Else
Lcd " Min. Volume "
Wait 1
Cls
Lcd "Volume: " ; Db ; " dB"
End If

Return


End
 
Skorzystaj z mojego kodu, co prawda jest to do sterownika PGA2310 na ATMega8, ale to nie ma znaczenia. Kod pisałem dobre kilka lat temu, więc żeby się nikt nie czepiał, że coś jest źle ;).

Kod:
$regfile = "m8def.dat"
$crystal = 16000000

'##########Konfiguracja

Config Pind.1 = Input                                       'enkoder
Set Portd.1
Config Pind.2 = Input                                       'enkoder
Set Portd.2
Config Portd.7 = Output                                     'podswietlenie
Reset Portd.7
Config Portc.1 = Output                                     'wystawia stan "mute" dla pga
Set Portc.1
Config Pinc.0 = Input                                       'uswitch mute
Set Portc.0
Config Pind.3 = Input                                       'gniazdo sluchawkowe
Set Portd.3

Enable Interrupts

Config Int0 = Falling                                       'konfiguracja przerwan
   On Int0 Enkoder
   Enable Int0
Config Int1 = Falling
   On Int1 Gniazdo
   Enable Int1
Config Timer1 = Timer , Prescale = 1024                     'konfiguracja timera
   On Timer1 Podsw
   Enable Timer1
   Load Timer1 , 62500
   Stop Timer1

Deflcdchar 0 , 00 , 14 , 31 , 31 , 31 , 14 , 00 , 00
Deflcdchar 1 , 2 , 6 , 14 , 30 , 14 , 6 , 2 , 00

Dim Vol As Single                                           'zmienne
Dim L As Byte
Dim R As Byte
Dim C As Byte
Dim Flaga As Bit
Dim Flaga2 As Bit
   Flaga = 1
   Flaga2 = 1
   L = 7
   R = 7
Gosub Spio
Gosub Podsw : Portd.7 = 1                                   'podswietlenie lcd na starcie
Cls

'##########Petla glowna

Do
   If Pind.3 = 1 Then
      Portc.1 = 0
      Flaga2 = 0
   End If
   If Flaga = 1 Then
      Vol = 255 - L                                         'obliczanie poziomu glosnosci w "dB"
      Vol = Vol / 2
      Vol = 31.5 - Vol
      Debounce Pinc.0 , 0 , Muteon , Sub
      Cursor Off : Upperline : Lcd "Volume: " ; Vol ; " dB   "       'wyswietlanie info
         C = L / 16
         Locate 2 , C
         Lcd Chr(0) ; " "
         Locate 2 , 16
         Lcd Chr(1)
   End If
   If Flaga = 0 Then
      If Pind.2 = 0 Then
          Gosub Podsw : Portd.7 = 1
      End If
      Debounce Pinc.0 , 0 , Muteoff , Sub
      Cursor Off : Upperline : Lcd "Volume: Mute    "
   End If
Loop

'#############Podprogramy

Enkoder:                                                    'podprogram dla enkodera
   Gosub Podsw : Portd.7 = 1
   If Pind.1 = 0 Then
      Incr L
      Incr R
      Gosub Spio
      If L = 0 Then : L = 255 : End If
      If R = 0 Then : R = 255 : End If
   Else
      Decr L
      Decr R
      Gosub Spio
      If L = 0 Then : L = 1 : End If
      If R = 0 Then : R = 1 : End If
   End If
Return
Spio:                                                       'podprogram wysylajacy zmienna do pga
   Spiinit
   Spiout L , 1
   Spiout R , 1
   Return
Podsw:                                                      'podprogram odliczajacy ~4s do wygasniecia podswietlenia lcd
   Load Timer1 , 62500
   Start Timer1
   Portd.7 = 0
Return
Gniazdo:
   Flaga2 = 1
   If Flaga = 0 Then
      Portc.1 = 0
   Else
      Portc.1 = 1
   End If
   L = 7
   R = 7
   Gosub Spio
Return
Muteon:
   Disable Int0
   Flaga = 0
   Portc.1 = 0
   Gosub Podsw : Portd.7 = 1
Return
Muteoff:
   If Flaga2 = 0 Then
      Portc.1 = 0
   Else
      Portc.1 = 1
   End If
   Enable Int0
   Flaga = 1
   Gosub Podsw : Portd.7 = 1
Return
 
Powrót
Góra