Forum elektroda.pl

Regulamin | Punkty | Dodaj... | Ostatnie | Szukaj | Rejestracja | Zaloguj

Ta strona używa cookie. Dowiedz się więcej o celu ich używania i zmianie ustawień cookie w przeglądarce.
Korzystając ze strony wyrażasz zgodę na używanie cookie, zgodnie z aktualnymi ustawieniami przeglądarki.

Mega8 bascom - TDA8425 + LCD + enkoder (INT0, INT1), I2C w przerwaniu T0


Napisz nowy temat  Odpowiedz do tematu      Strona Główna -> Forum elektroda.pl -> Mikrokontrolery Ogólne -> Mikrokontrolery AVR -> Mega8 bascom - TDA8425 + LCD + enkoder (INT0, INT1), I2C w przerwaniu T0
Autor
Wiadomość
davidos95
Poziom 5
Poziom 5


Dołączył: 28 Sie 2008
Posty: 14
Miasto: Kraków

Post#1 Post autora tematu 29 Mar 2013 18:33   

Mega8 bascom - TDA8425 + LCD + enkoder (INT0, INT1), I2C w przerwaniu T0


Witam,

Zacząłem pisać program na atmege8 w bascomie, do sterowania preampem tda8425 przez enkoder, wyświetlając to wszystko na LCD póki co 8x2.

Program jest w fazie powstawania, ale mam kilka pytań co sądzicie o moich rozwiązaniach i czy tak w ogóle może być?

Enkoder obsługuję przez INT0 i INT1, zbocze opadające. Jeśli wejdzie w procedurę przerwania od INT0 to inkrementacja zmiennej, jeśli w INT1 to dekrementacja. Robiłem na jednym przerwaniu (INT0) i w nim sprawdzanie stanu drugiego pinu, ale najprawdopodobniej rozklekotał mi się enkoder i dlatego przestało to działać prawidłowo. Jak kupię nowy enkoder pewnie we wtorek to bardzo możliwe, że wrócę do tego rozwiązania.

Teraz przerwanie od T0. Powiem tak, o ile z przerwań INT0 korzystałem i już wiem o co chodzi, to w T0 muszę znowu sobie przypomnieć suchą teorię i zrobić to w praktyce, wówczas będę coś więcej wiedział. Zastanawiałem się czy nie mógłbym go urzyć w celu wysyłania danych przez I2C do tda8425. Tzn. przerwanie np co 100ms i w nim wysyła dane konfiguracyjne. Ma to prawo tak działać?

Menu główne chyba w pętli głównej przy użyciu instrukcji select case. Przełączanie poziomów menu przez kliknięcie przycisku enkodera.
I kolejne pytanie. Czy po każdej instrukcji zrobić skok do procedury wyświetlacza, czy wyświetlanie informacji dorzucić też do tej instrukcji, albo może jakoś inaczej?

Na chwilę obecną tyle tylko pytań przychodzi mi do głowy.

P.S. Wiem, że dużo jest tematów na elektrodzie odnośnie tda8425 i mógłbym nawet znaleźć gotowy kod, ale chcę napisać go sam, starając nie korzystać z cudzych projektów, bo wiem, że w nich znajdę różne inne rozwiązania i będę chciał zrobić wszystko na raz, a w tedy mnie to przerośnie ;).

Pozdrawiam
Dawid
Powrót do góry
   
Google


Google Adsense


Post# 29 Mar 2013 18:33   





Powrót do góry
   
Mol
Poziom 21
Poziom 21


Dołączył: 09 Kwi 2003
Posty: 1128
Miasto: Strzelce Op.

Post#2 29 Mar 2013 19:39   

Re: Mega8 bascom - TDA8425 + LCD + enkoder (INT0, INT1), I2C w przerwaniu T0


A po co ci T0 do wysyłania danych ? Po włączeniu zasilania wysyłasz konfigurację i do puki nic nie zmieniasz to program leci w pętli głównej. I2C zrób sobie w jakimś podprogramie i już . Przykładowo zmieniasz siłę głosu ,to przychodzi przerwanie na INT0 , w przerwaniu na początku robisz Disable INT0 , sprawdzasz pin , zmniejszasz lub zwiększasz zmienną, robisz skok do podprogramu gdzie wysyłasz dane po I2C , robisz Enable Int0 i program znowu leci w pętli głównej , do puki coś nie zmienisz. Menu też sobie możesz zrobić w podprogramach , bo w pętli głównej jak będziesz cały czas odświeżał wyświetlacz , to niektóre znaki mogą być słabo widoczne. Ale to tak tylko według mnie , bo pewnie można to zrobić na milion innych sposobów.
Powrót do góry
   
Google


Google Adsense


Post# 29 Mar 2013 19:39   





Powrót do góry
   
davidos95
Poziom 5
Poziom 5


Dołączył: 28 Sie 2008
Posty: 14
Miasto: Kraków

Post#3 Post autora tematu 30 Mar 2013 01:17   

Re: Mega8 bascom - TDA8425 + LCD + enkoder (INT0, INT1), I2C w przerwaniu T0


Fakt, ze jest milion różnych sposobów na zrobienie tego. Ok spróbuję tym sposobem co mi podsunąłeś. W sumie nawet lepiej tak. Dzięki.

Dodano po 5 [godziny] 32 [minuty]:

Ok, coś tam skleciłem, jest to niepełny program, bo nie ma w nim np. ustawień dla Mute i trybu, oraz nie pokazuje na LCD wartości, ale to później. Póki co mam dziwny problem z wyświetlaniem, ale o tym za chwile.

Planowalem żeby działało to w następujący sposób:

1. Przed pętlą główną ustawia wartości początkowe dla zmiennych.
2. Wchodzi w pętlę i w zależności od wartości zmiennej Poz_menu wypełnia instrukcję select case.
3. W instrukcji select case są ify. Jeżeli wartość zmiennej Encode zwiększyła się to zwiększa o jeden wartość zmiennej (odpowiedniej dla każdej case 0,1,2,3...), jeżeli zmniejszyła to zmniejsza.
4. Idzie do podbrogramu "Wpisz" (wpisuje tam po kolei do zmiennej wartość, najpierw:
a) adres i wartość dla głośności,
b) adres i wartość dla basu
c) adres i wartość dla tonów wysokich,
d) adres i wartość dla funkcji - tego jeszcze nie ma.
po każdym wpisaniu leci do podprogramu, który wysyła to do TDA i wraca tutaj, żeby zrobić to samo z pozostałymi.
5. Wraca z podprogramu wpisz i jeśli wciśnięty przycisk Sw1 to wskakuje do podprogramu jego obsługi. W podprogramie sprawdza, czeka, sprawdza i inkrementuje zmienną Poz_menu. Wraca do pętli głównej.
6. Skoro inkrementował to przeskakuje do kolejnej case. Jeśli przycisk by nie był naciśnięty to leci do procedury obsługi LCD i tam też jest select case z użyciem zmiennej poz_menu.

Teraz o problemie.
Program przeskakuje mi pomiędzy case 0, a 1, bo na wyświetlaczu przeskakuje "Vol" i "Bas". Jak chciałem sprawdzić czy wyświetli coś dalej zmieniłem początkową wartość Poz_menu na 1, to przeskakuje "bas" i "trb", a jak zmieniłem poz_menu na 2 to przeskakuje między "trb" a tak jakby resetem (tzn zapełnia całkiem wyświetlacz). Użyłem rezystorów podciągających, w podprogramie obsługi dałem opóźnienie 25ms.
Gdzie mogłem popełnić błąd?

Poniżej dodaję program, który napisałem.

Kod Basic4GL - [rozwiń]
'********************** Konfiguracja uC ****************************************
 
$regfile = "m8def.dat"
$crystal = 8000000
 
'********************** Konfiguracja portów i LCD ******************************
 
Config Lcd = 16 * 1a 'lcd 8*2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Portd = Input
 
Sw1 Alias Pind.0
Set Pind.0 'Sw1
Set Pind.2 'enkoder A
Set Pind.3 'enkoder B
 
'********************** I2C konfiguracja ***************************************
 
Config Scl = Portb.2
Config Sda = Portb.1
I2cinit
 
'********************** Przerwanie INT0 dla enkodera **************************
 
Config Int0 = Falling
On Int0 Enkoder
Enable Int0
Enable Interrupts
 
'********************** Konfiguracja uC Koniec ********************************
 
'********************** Zmienne ************************************************
 
Dim Vol As Byte
Dim Bass As Byte
Dim Trb As Byte
 
Dim Adres As Byte , Wartosc As Byte
 
dim encode as byte
Dim Poz_menu As Byte
 
'********************** Zmienne Koniec *****************************************
 
'********************** Wartości początkowe zmiennych **************************
 
Vol = 230 '224-255
Bass = 246 'min=242 0=246 max = 251
Trb = 246 'min=242 0=246 max = 250
 
 
Poz_menu = 0
Encode = 50
 
'********************** Petla glowna *******************************************
'*******************************************************************************
Cls
Cursor Off
 
Do
 
Poz_menu = 0
 
Select Case Poz_menu
 
Case 0: 'volume
If Encode > 50 Then
If Vol < 254 Then Incr Vol
Else
If Vol > 224 Then Decr Vol
End If
 
Gosub Wpisz
If Sw1 = 0 Then Gosub Sw_1
Gosub L_c_d
 
Case 1: 'bass
If Encode > 50 Then
If Bass < 251 Then Incr Bass
Else
If Bass > 242 Then Decr Bass
End If
 
Gosub Wpisz
If Sw1 = 0 Then Gosub Sw_1
Gosub L_c_d
 
Case 2: 'trebles
If Encode > 50 Then
If Trb < 250 Then Incr Trb
Else
If Trb > 242 Then Decr Trb
End If
 
Gosub Wpisz
If Sw1 = 0 Then Gosub Sw_1
Gosub L_c_d
 
If Poz_menu = 4 Then Poz_menu = 0
End Select
 
 
Loop
End
 
'********************** Petla glowna Koniec ************************************
 
'********************** I2C ****************************************************
Wpisz: 'wpisuje adres i wartości zmiennych przed wysłaniem do tda
Adres = 0
Wartosc = Vol
Gosub Wyslij_i2c
 
Adres = 1
Wartosc = Vol
Gosub Wyslij_i2c
 
Adres = 2
Wartosc = Bass
Gosub Wyslij_i2c
 
Adres = 3
Wartosc = Trb
Gosub Wyslij_i2c
 
Return
 
Wyslij_i2c: 'wysyła adres i wartości do tda
I2cstart
I2cwbyte 130
I2cwbyte Adres
I2cwbyte Wartosc
I2cstop
Waitms 1
Return
'********************** koniec i2c *********************************************
 
 
'********************** Enkoder przerwanie *************************************
 
Enkoder:
Disable Int0
If Pind.3 = 1 Then Incr Encode Else Decr Encode
Enable Int0
 
Return
'********************** Koniec przerwania **************************************
 
'********************** Sw_1 obsługa *******************************************
Sw_1:
If Sw1 = 0 Then Waitms 25 'sprawdzenie stanu Sw1 + opóźnienie
If Sw1 = 0 Then Incr Poz_menu 'inkrementacja zmiennej Poz_menu jeśli Sw1 wciśnięty
Return 'powrót do pętli głównej
 
'********************** Koniec Sw_1 ********************************************
 
'********************** LCD obsługa ********************************************
 
L_c_d:
 
Select Case Poz_menu
 
Case 0: 'wyświetlanie "Vol"
Cls
Locate 1 , 1
Lcd "Vol"
Waitms 500
 
Case 1: 'wyświetlanie "Bas"
Cls
Locate 1 , 1
Lcd "Bas"
Waitms 500
 
Case 2: 'Wyświetlanie "Trb"
Cls
Locate 1 , 1
Lcd "Trb"
Waitms 500
 
Return 'powrót do pętli głównej
end SELECT
 
 
 


P.S. Co do kolejności Return i end select na samym końcu przy obsłudze LCD to dlatego, że program ma mi wracać do pętli głównej.
P.S.2 Widzę, że zapomniałem o jednej rzeczy. Zmienną encode trzeba będzie przywracać za każdym razem do początkowej wartości, chyba przed EndIF w każdym z case w pętli głównej. Dlatego że w innym przypadku cały czas by inkrementowało lub dekrementowało.
Pozdrawiam
Dawid
Powrót do góry
   
Napisz nowy temat  Odpowiedz do tematu      Strona Główna -> Forum elektroda.pl -> Mikrokontrolery Ogólne -> Mikrokontrolery AVR -> Mega8 bascom - TDA8425 + LCD + enkoder (INT0, INT1), I2C w przerwaniu T0
Strona 1 z 1
Podobne tematy
[Bascom] Odbiór RC5 w przerwaniu INT0 nie działa w nowej wersji kompilatora (6)
[atmega8] [bascom] czas przerwania na int0 i int1 - gdzie popełniłem bład (6)
Bascom Atmega8 Portd (piny TxD, INT0, INT1 ) jako wyjścia (2)
[2313][bascom] RC5 odbiór w przerwaniu INT0 (6)
[Atmega8][Bascom] Rc5 w przerwaniu od int0 (2)
[attiny2313] [bascom] Przyciski int0 i int1 (7)
[ATtiny2313][Bascom] Odbiór w przerwaniu INT1 (1)
Bascom & Encoder - INT0 & INT1 Incr Decr (12)
[mega8][bascom] Przedwzmacniacz na I2C, nie robi nic... (3)
TDA8425 Atmega32 - Brak komunikacji I2C Atmega32 z TDA8425 [c] (5)


Administrator || Moderatorzy || Regulamin forum || Regulamin ogólny || Informacja o cookies || Reklama || Kontakt

Page generation time: 0.146 seconds

elektroda.pl temat RSS