Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

saa6588 obsługa w BASCOM AVR

wacha
-
-
Posty: 95
Rejestracja: 22 lis 2009, o 21:19
Lokalizacja: biele

saa6588 obsługa w BASCOM AVR

Postautor: wacha » 17 lip 2013, o 16:37

Witam wszystkich mam problem nie umiem obsługiwać układu saa6588 w bascomie.
Nie mam pojecia jak się do tego zabrać nie znam angielskiego wjęc nie wiem o co chodzi za bardzo w dokumentacji.
Byłbym wdzięczny jak by mi ktoś coś podpowiedział jak to obsługiwać najlepiej jakiś kawałek kodu albo troche informacji jak się za to zabrać.
Chciałbym odczytać nazwę stacji i nazwe wykonawcy utworu nie będe kożystał z innych funkcji.

wacha
-
-
Posty: 95
Rejestracja: 22 lis 2009, o 21:19
Lokalizacja: biele

Re: saa6588 obsługa w BASCOM AVR

Postautor: wacha » 10 sie 2013, o 18:45

Widze że nikt nic nie wie na ten temat albo nie chce powiedzieć może jak pokaże co udało mi się zdziałać w dziedzinie obsługi saa6588 to ktoś coś podpowie.

Kod: Zaznacz cały

Sub Wyslij_saa6588: I2cstart I2cwbyte 32 I2cwbyte &B00101011 I2cwbyte 0 I2cwbyte &B01111100 I2cstop End Sub
Powyżej jest procedura wysłania danych do preprocesora saa6588 jest ona wykonywana tylko raz.
Kwarc urzyty to 8,644MHz.
Poniżej procedura odczytu danych z układu saa:

Kod: Zaznacz cały

Sub Odczyt_saa6588: Rds_licznik = 0 Do Incr Rds_licznik I2cstart I2cwbyte 33 'adres odczytu układu saa6588 I2crbyte 0_saa , Ack 'odczyt danych I2crbyte 1_saa , Ack I2crbyte 2_saa , Ack I2crbyte 3_saa , Ack I2crbyte 4_saa , Ack I2crbyte 5_saa , Ack I2crbyte 6_saa , Nack I2cstop 'przepisanie 16 bitów do zmiennej d1 i d2 Rds_d1.0 = 1_saa.0 Rds_d1.1 = 1_saa.1 Rds_d1.2 = 1_saa.2 Rds_d1.3 = 1_saa.3 Rds_d1.4 = 1_saa.4 Rds_d1.5 = 1_saa.5 Rds_d1.6 = 1_saa.6 Rds_d1.7 = 1_saa.7 Rds_d2.0 = 2_saa.0 Rds_d2.1 = 2_saa.1 Rds_d2.2 = 2_saa.2 Rds_d2.3 = 2_saa.3 Rds_d2.4 = 2_saa.4 Rds_d2.5 = 2_saa.5 Rds_d2.6 = 2_saa.6 Rds_d2.7 = 2_saa.7 Rds_wybor.0 = 0_saa.5 Rds_wybor.1 = 0_saa.6 Rds_wybor.2 = 0_saa.7 Rds_wybor.3 = 0 Rds_wybor.4 = 0 Rds_wybor.5 = 0 Rds_wybor.6 = 0 Rds_wybor.7 = 0 Select Case Rds_wybor Case 1: Rds_s = &H00 Rds_s.3 = Rds_d1.3 Rds_s.4 = Rds_d1.4 Rds_s.5 = Rds_d1.5 Rds_s.6 = Rds_d1.6 Rds_s.7 = Rds_d1.7 Select Case Rds_s Case 0: Set Flaga_ps Rds_s = &H00 Rds_s.0 = Rds_d2.0 Rds_s.1 = Rds_d2.1 Select Case Rds_s Case 0: Pozycja = 1 Case 1: Pozycja = 3 Case 2: Pozycja = 5 Case 3: Pozycja = 7 Case 64: End Select Case 32: Set Flaga_rt End Select Case 2: If Flaga_rt = 1 Then R_txt = R_txt + Chr(rds_d1) + Chr(rds_d2) If Len(r_txt) > 16 Then R_txt = Right(r_txt , 16) Cls Lcd R_txt Reset Flaga_rt End If Case 3: If Flaga_ps = 1 Then Ps_namex = Chr(rds_d1) + Chr(rds_d2) Mid(ps_name , Pozycja , 2) = Ps_namex Cls Lcd Ps_name Reset Flaga_ps End If 'Case 4: 'Reset Flaga_ps End Select Loop Until Rds_licznik > 16
Ten licznik pętli jest potrzebny do opuszczania petli do loop dodam że nie odczytune stanu pinu DAVN.
Efektem podanego powyżej programu jest to że są krzaczki na wyświetlaczu zadnych konkretnych danych prosił bym o pomoc jak poprawić program aby poprawnie czytał nazwe stacji radiowej i radio text. :?

wacha
-
-
Posty: 95
Rejestracja: 22 lis 2009, o 21:19
Lokalizacja: biele

Re: saa6588 obsługa w BASCOM AVR

Postautor: wacha » 18 sie 2013, o 20:15

Widze że dalej nic sam pokombinowałem z zamieszczonym powyrzej kodem.
Umieściłem kod w przerwaniu wyzwalanym przy niskim stanie wykorzystałem też wyjście davn układu saa6588
odczytuje tylko nazwę stacji radiowej i jest mały problem.
Czasami pojawiają się przekłamania podczas wyswietlania tekstu.
Może ktoś mi teraz pomoże w kwestij tych przekłamań skąd one się biorą i jak temu zaradzić?

Kod: Zaznacz cały

Odczyt_saa6588: Disable Int1 Enable Interrupts I2cstart I2cwbyte 33 'adres odczytu układu saa6588 I2crbyte 0_saa , Ack 'odczyt danych I2crbyte 1_saa , Ack I2crbyte 2_saa , Ack I2crbyte 3_saa , Ack I2crbyte 4_saa , Ack I2crbyte 5_saa , Ack I2crbyte 6_saa , Nack I2cstop 'przepisanie 16 bitów do zmiennej rds_d1 i rds_d2 Rds_d1.0 = 1_saa.0 Rds_d1.1 = 1_saa.1 Rds_d1.2 = 1_saa.2 Rds_d1.3 = 1_saa.3 Rds_d1.4 = 1_saa.4 Rds_d1.5 = 1_saa.5 Rds_d1.6 = 1_saa.6 Rds_d1.7 = 1_saa.7 Rds_d2.0 = 2_saa.0 Rds_d2.1 = 2_saa.1 Rds_d2.2 = 2_saa.2 Rds_d2.3 = 2_saa.3 Rds_d2.4 = 2_saa.4 Rds_d2.5 = 2_saa.5 Rds_d2.6 = 2_saa.6 Rds_d2.7 = 2_saa.7 Rds_wybor.0 = 0_saa.5 'przepisanie zawartości wyboru bloku danych Rds_wybor.1 = 0_saa.6 Rds_wybor.2 = 0_saa.7 Rds_wybor.3 = 0 Rds_wybor.4 = 0 Rds_wybor.5 = 0 Rds_wybor.6 = 0 Rds_wybor.7 = 0 '====================================================================bloki========================================================= Select Case Rds_wybor Case 1: 'blok "A" Rds_s = 0 'ODCZYTANIE ADRESU SEGMĘTU Rds_s.3 = Rds_d1.3 Rds_s.4 = Rds_d1.4 Rds_s.5 = Rds_d1.5 Rds_s.6 = Rds_d1.6 Rds_s.7 = Rds_d1.7 Select Case Rds_s Case 0: Set Flaga_ps Rds_s = 0 Rds_s.0 = Rds_d2.0 Rds_s.1 = Rds_d2.1 Select Case Rds_s Case 0: Pozycja = 1 Case 1: Pozycja = 3 Case 2: Pozycja = 5 Case 3: Pozycja = 7 End Select End Select Case 3: 'blok "C" nazwa stacji If Flaga_ps = 1 Then Ps_namex = Chr(rds_d1) + Chr(rds_d2) Mid(ps_name , Pozycja , 2) = Ps_namex Cls Lcd Spc(4) ; Ps_name Reset Flaga_ps End If End Select Enable Int1 Return

matrix
-
-
Posty: 342
Rejestracja: 7 maja 2010, o 14:02
Lokalizacja: Sochaczew
Kontaktowanie:

Re: saa6588 obsługa w BASCOM AVR

Postautor: matrix » 18 sie 2013, o 20:57

Przekłamania mogą się pojawiać nie z winy odczytu danych ale z błędów odbioru transmisji z nadajnika.

wacha
-
-
Posty: 95
Rejestracja: 22 lis 2009, o 21:19
Lokalizacja: biele

Re: saa6588 obsługa w BASCOM AVR

Postautor: wacha » 20 sie 2013, o 11:53

To wygląda tak jakby jeden tekst nakładał się na drugi ale po czasie się stabilizuje i jest dobrze najwieksze problemy są przy odbiorze stacji o słabym sygnale wtedy to tylko krzaczki na wyświetlaczu.
Czy da się jakoś temu zaradzić? :?

wacha
-
-
Posty: 95
Rejestracja: 22 lis 2009, o 21:19
Lokalizacja: biele

Re: saa6588 obsługa w BASCOM AVR

Postautor: wacha » 22 sie 2013, o 18:47

Było źle umieszczone polecenie kasowania lcd teraz nie ma przekłamań jedyna żecz co jest źle to to że jeśli mam ten sam tekst to ciągle jest czyszczony wyświetlacz ale z tym sobie poradze.
Poniżej zamieszczam poprawioną procedure odczytu danych z układu saa6588 gdyby komuś się przydało bo w sieci jest bardzo mało przykładów obsługi w bascomie.

Kod: Zaznacz cały

Odczyt_saa6588: Disable Int1 Enable Interrupts I2cstart I2cwbyte 33 'adres odczytu układu saa6588 I2crbyte 0_saa , Ack 'odczyt danych I2crbyte 1_saa , Ack I2crbyte 2_saa , Ack I2crbyte 3_saa , Ack I2crbyte 4_saa , Ack I2crbyte 5_saa , Ack I2crbyte 6_saa , Nack I2cstop 'przepisanie 16 bitów do zmiennej rds_d1 i rds_d2 Rds_d1.0 = 1_saa.0 Rds_d1.1 = 1_saa.1 Rds_d1.2 = 1_saa.2 Rds_d1.3 = 1_saa.3 Rds_d1.4 = 1_saa.4 Rds_d1.5 = 1_saa.5 Rds_d1.6 = 1_saa.6 Rds_d1.7 = 1_saa.7 Rds_d2.0 = 2_saa.0 Rds_d2.1 = 2_saa.1 Rds_d2.2 = 2_saa.2 Rds_d2.3 = 2_saa.3 Rds_d2.4 = 2_saa.4 Rds_d2.5 = 2_saa.5 Rds_d2.6 = 2_saa.6 Rds_d2.7 = 2_saa.7 Rds_wybor.0 = 0_saa.5 'przepisanie zawartości wyboru bloku danych Rds_wybor.1 = 0_saa.6 Rds_wybor.2 = 0_saa.7 Rds_wybor.3 = 0 Rds_wybor.4 = 0 Rds_wybor.5 = 0 Rds_wybor.6 = 0 Rds_wybor.7 = 0 '====================================================================bloki========================================================= Select Case Rds_wybor Case 1: 'blok "A" Rds_s = 0 'ODCZYTANIE ADRESU SEGMĘTU Rds_s.3 = Rds_d1.3 Rds_s.4 = Rds_d1.4 Rds_s.5 = Rds_d1.5 Rds_s.6 = Rds_d1.6 Rds_s.7 = Rds_d1.7 Select Case Rds_s Case 0: Set Flaga_ps Rds_s = 0 Rds_s.0 = Rds_d2.0 Rds_s.1 = Rds_d2.1 Select Case Rds_s Case 0: Pozycja = 1 Case 1: Pozycja = 3 Case 2: Pozycja = 5 Case 3: Cls Pozycja = 7 End Select End Select Case 3: 'blok "C" nazwa stacji If Mute_tuner = 1 And Sygnal > 80 Then 'wyciszenie włączone If Flaga_ps = 1 Then 'pokazuj komunikaty rds gdy sygnał jest na dobrym poziomie Ps_namex = Chr(rds_d1) + Chr(rds_d2) Mid(ps_name , Pozycja , 2) = Ps_namex Lcd Spc(4) ; Ps_name Reset Flaga_ps End If End If If Mute_tuner = 0 Then 'wyciszenie wyłączone If Flaga_ps = 1 Then 'pokazuj komunikaty rds Ps_namex = Chr(rds_d1) + Chr(rds_d2) Mid(ps_name , Pozycja , 2) = Ps_namex Lcd Spc(4) ; Ps_name Reset Flaga_ps End If End If End Select Enable Int1 Return
To wyciszeni słurzy temu aby przy słabym sygnale nie wyświetlać komunikatów rds bo przekłamuje czasem.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Re: saa6588 obsługa w BASCOM AVR

Postautor: pajaczek » 23 sie 2013, o 17:48

teraz nie ma przekłamań jedyna żecz co jest źle to to że jeśli mam ten sam tekst to ciągle jest czyszczony wyświetlacz ale z tym sobie poradze.
Chodzi Ci o to, że odświeża pomimo tego że treść się nie zmienia?

wacha
-
-
Posty: 95
Rejestracja: 22 lis 2009, o 21:19
Lokalizacja: biele

Re: saa6588 obsługa w BASCOM AVR

Postautor: wacha » 25 sie 2013, o 16:03

Dokładnie kolego pajączek tekst jest tej samej treści mimo to polecenie cls "czyszczenie wyświetlacza" jest wykonywane.
Polecenie to jest zawarte w tej samej instrukcji wyboru co ostatnia pozycja tekstu.
Czyli działa to tak że jeśli skompletuje nam się cały tekst to dopiero wtedy jest czyszczony wyświetlacz i tekst jest wyswietlany.
Tylko czy to powinno tak być przyznam że troche mie denerwóje te ciągłe miganie tekstu prubowałem sobie z tym poradzić ale kiepsko mi to wychodzi.
Kod ten znalazłem w internecie okroiłem go trochę z nie potrzebnych żeczy i dopasowałem do własnych potrzeb lecz denerwyjwe mnie to czyszczenie wyświetlacza.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Re: saa6588 obsługa w BASCOM AVR

Postautor: pajaczek » 25 sie 2013, o 16:27

Nie wiem jak to jest dokładnie w bascomie, ja zwykle robiłem tak, że tworzyłem strukturę zawierającą mapę obrazu (tutaj po prostu poszczególne znaki na wyświetlaczu), oraz flagę czy coś się zmieniło (ustawianą przy każdym dodaniu znaku do mapy obrazu). Do tego wywoływana cyklicznie (timerem) procedura sprawdzająca czy jest ustawiona flaga, jeżeli jest to cls; wysłanie nowej treści na ekran i clr(flaga). Takie podejście powoduje, że ekran wyczyści się (a nawet nie musi się czyścić, bo nowa treść nadpisze CAŁY ekran, na nowo) tylko gdy zmienił się choć jeden znak (w celu zmniejszenia jeszcze bardziej transferu prock -> wyświetlacz a co za tym idzie częstości odświeżania całości) można to podzielić na mapy poszczególnych linii, ale to komplikuje nieco kod (obciążenie procka kosztem poprawy jakości odświeżania wyświetlacza).

Co do Twojego kodu w bascomie, nie chce mi się analizować co oznaczają poszczególne Rds_s czy Rds_d1, może to przybliżysz to będzie łatwiej...
Ale czy nie uważasz, że niektóre fragmenty są dosyć... dziwne, np.:

Kod: Zaznacz cały

Select Case Rds_s Case 0: Set Flaga_ps Rds_s = 0 Rds_s.0 = Rds_d2.0 Rds_s.1 = Rds_d2.1 Select Case Rds_s Case 0: Pozycja = 1 Case 1: Pozycja = 3 Case 2: Pozycja = 5 Case 3: Cls Pozycja = 7 End Select End Select
Po co ten nadrzędny switch (przepraszam... select) jeżeli zawiera tylko jednego case'a?

Ps. Prośba do Rafała. Jeżeli nie znasz się na "tekstowym programowaniu" to nie pisz proszę kolejnych postów które nie wnoszą nic do tematu, a w których jedynie przypominasz nam o tym fakcie... to zbyteczne, już wszyscy o tym wiedzą.

matrix
-
-
Posty: 342
Rejestracja: 7 maja 2010, o 14:02
Lokalizacja: Sochaczew
Kontaktowanie:

Re: saa6588 obsługa w BASCOM AVR

Postautor: matrix » 26 sie 2013, o 15:44

Co do migania wyświetlacza to nie korzystaj z dyrektywy cls tylko nadpisuj wybrany fragment wyświetlacza pisząc locate X,Y i wpisując na lcd to co chcesz. Nie będzie Ci wtedy to migać.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Re: saa6588 obsługa w BASCOM AVR

Postautor: pajaczek » 26 sie 2013, o 22:08

Co do migania wyświetlacza to nie korzystaj z dyrektywy cls tylko nadpisuj wybrany fragment wyświetlacza pisząc locate X,Y i wpisując na lcd to co chcesz. Nie będzie Ci wtedy to migać.
To też jest wyjście... pod warunkiem że tekst znajduje się zawsze w tym samym miejscu (albo zapamiętujemy gdzie był ostatnio), dodatkowo konieczne będzie za każdym razem wypisywanie tekstów o tej samej długości, by zamazać ew. znaki które pozostaną po poprzedniku.
Ale faktycznie, dla krótkich fraz również stosowałem takie rozwiązanie z powodzeniem.
Można też zdefiniować sobie funkcję clrln, która wypisuje na ekran pustą linię, i ustawia kursor na jej początku. Wówczas sprawa będzie chyba już prosta.

wacha
-
-
Posty: 95
Rejestracja: 22 lis 2009, o 21:19
Lokalizacja: biele

Re: saa6588 obsługa w BASCOM AVR

Postautor: wacha » 27 sie 2013, o 11:21

Prubowałem z tym locate x,y i bez dyrektywy cls i nic z tego co prawda nie ma migania ale tekst jest pisany po całym wyswietlaczu nawet ieśli ustawie locate 1 , 1 a potem lcd ;text do wyświetlenia;
Najlepiej to by było zastosować jakąś flage ktura jest ustawiana jek tekst ma inną wartość jak ktoś ma jakiś pomysł to proszę ja trochę nad tym posiedze w niedzielę.
A cls musi być konieczne w tym case co jest teraz inaczej nie działa.

Udało się zaradzić miganiu wyswietlacza teraz cls jest wykonywane tylko wtedy gdy tekst się zmienia ponizej treść podprogramu obsługi rds-u:

Kod: Zaznacz cały

Odczyt_saa6588: Disable Int1 Enable Interrupts I2cstart I2cwbyte 33 'adres odczytu układu saa6588 I2crbyte 0_saa , Ack 'odczyt danych I2crbyte 1_saa , Ack I2crbyte 2_saa , Ack I2crbyte 3_saa , Ack I2crbyte 4_saa , Ack I2crbyte 5_saa , Ack I2crbyte 6_saa , Nack I2cstop 'przepisanie 16 bitów do zmiennej rds_d1 i rds_d2 Rds_d1.0 = 1_saa.0 Rds_d1.1 = 1_saa.1 Rds_d1.2 = 1_saa.2 Rds_d1.3 = 1_saa.3 Rds_d1.4 = 1_saa.4 Rds_d1.5 = 1_saa.5 Rds_d1.6 = 1_saa.6 Rds_d1.7 = 1_saa.7 Rds_d2.0 = 2_saa.0 Rds_d2.1 = 2_saa.1 Rds_d2.2 = 2_saa.2 Rds_d2.3 = 2_saa.3 Rds_d2.4 = 2_saa.4 Rds_d2.5 = 2_saa.5 Rds_d2.6 = 2_saa.6 Rds_d2.7 = 2_saa.7 Rds_wybor.0 = 0_saa.5 'przepisanie zawartości wyboru bloku danych Rds_wybor.1 = 0_saa.6 Rds_wybor.2 = 0_saa.7 Rds_wybor.3 = 0 Rds_wybor.4 = 0 Rds_wybor.5 = 0 Rds_wybor.6 = 0 Rds_wybor.7 = 0 '====================================================================bloki========================================================= Select Case Rds_wybor Case 1: 'blok "A" Rds_s = 0 'ODCZYTANIE ADRESU SEGMĘTU Rds_s.3 = Rds_d1.3 Rds_s.4 = Rds_d1.4 Rds_s.5 = Rds_d1.5 Rds_s.6 = Rds_d1.6 Rds_s.7 = Rds_d1.7 Select Case Rds_s Case 0: Set Flaga_ps Rds_pozycja = 0 Rds_pozycja.0 = Rds_d2.0 Rds_pozycja.1 = Rds_d2.1 Select Case Rds_pozycja Case 0: Pozycja = 1 Case 1: Pozycja = 3 Case 2: Pozycja = 5 Case 3: If Flaga_zezwolenia = 1 Then Set Flaga_ps_name End If Pozycja = 7 End Select End Select Case 3: 'blok "C" nazwa stacji If Mute_tuner = 1 And Sygnal >= 112 Then 'wyciszenie włączone If Flaga_ps = 1 Then 'pokazuj komunikaty rds gdy sygnał jest na dobrym poziomie Ps_namex = Chr(rds_d1) + Chr(rds_d2) Mid(ps_name , Pozycja , 2) = Ps_namex If Pomoc_ps_name <> Ps_name Then : Flaga_zezwolenia = 1 : Else : Flaga_zezwolenia = 0 : End If pomoc_ps_name = ps_name If Flaga_ps_name = 1 Then Cls Lcd Spc(4) ; Ps_name Reset Flaga_ps_name End If Reset Flaga_ps End If End If If Mute_tuner = 0 Then 'wyciszenie wyłączone If Flaga_ps = 1 Then 'pokazuj komunikaty rds Ps_namex = Chr(rds_d1) + Chr(rds_d2) Mid(ps_name , Pozycja , 2) = Ps_namex If Pomoc_ps_name <> Ps_name Then : Flaga_zezwolenia = 1 : Else : Flaga_zezwolenia = 0 : End If pomoc_ps_name = ps_name If Flaga_ps_name = 1 Then Cls Lcd Spc(4) ; Ps_name Reset Flaga_ps_name End If Reset Flaga_ps End If End If Case 4: Reset Flaga_ps End Select Enable Int1 Return
Program działa lecz na niekturych stacjach czasem przekłamuje nawet gdy sygnał ma wysoki poziom.
Czy to możliwe żeby dane były źle odebrane?

matrix
-
-
Posty: 342
Rejestracja: 7 maja 2010, o 14:02
Lokalizacja: Sochaczew
Kontaktowanie:

Re: saa6588 obsługa w BASCOM AVR

Postautor: matrix » 27 sie 2013, o 18:24

Prubowałem z tym locate x,y i bez dyrektywy cls i nic z tego co prawda nie ma migania ale tekst jest pisany po całym wyswietlaczu nawet ieśli ustawie locate 1 , 1 a potem lcd ;text do wyświetlenia;
Co Ty gadasz? Ja całe menu i to złożone tworzyłem do pewnego projektu i wszystko działa jak trzeba. Musisz dobrze przemyśleć pisanie.

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 11 gości