{

Tutaj będą przenoszone tematy, którymi dalej nie warto się zajmować, co jakiś czas zawartość tego forum jest kasowana.
Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 31 paź 2011, 14:50

PS. Nie rób obliczeń w przerwaniach od Timera, bo jeżeli się przeciągną to ci braknie czasu, a już nadejdzie następne przerwanie, w końcu przepełni się stos i zawiesi się procesor.
Co do tej tabelki tonów, to chyba lepiej umieścić ja w EEPROM procesora, wtedy będzie można ja modyfikować, bez konieczności wgrywania całego programu do Flash, a jak rozbudujesz program to nawet przez RS232.
Ogólnie wieczorem spróbuję coś z tym jeszcze poknieić, bo zrobiłeś parę błędów w programie.
PS. ogólnie z maty nigdy nie byłem dobry, a z DSP to już wcale, więc trochę się pogubiłem. :shock: Ogólnie C też się dopiero uczę, więc może coś źle rozumiem. Ale po kolei.
Kod:

#define TONES 11
const double freqs[TONES] = { 1124,1197,1275,1358,1446,1540,1640,1747,1860,1981,2110 }; //NASZE TONY
static signed int16 y0;
static signed int16 y1[TONES];
static signed int16 y2[TONES];

Potem w przerwaniu od Timera miałem w pętli FOR zmianę od 0 do zmiennej TONES czyli
Kod:

For ZMIENNA = 0 to TONES
//OBLICZANIE COEFF
NEXT
Z tego wynika że:
TONES to stała nie zmienna określajaca wielkość tabeli fregs w której zapisane są poszukiwane tony ? Nie wiem czemu ta tablica Fregs ma typ Duble skoro zapisujesz w niej wartości stałoprzecinkowe, chyba że potrzebne to potem do obliczeń, i kompilator by się buntował ?
y0 - jest zmienną typu integer o rozmiarze 16 bitów. Nie bardzo kojarzę słówko static, ale to szczegół w BASCOM i tak chyba nie ma odpowiednika.
y1 oraz y2 to tablice typu int16 (jak wyżej) o rozmiarze równym stałej TONES.
Potem liczysz jakieś współczynniki wg. tego:
Kod:

for ( i = 0; i < TONES; i++ )
{
Y0 = *coeffS * y1 - y2 + adc_data;
y2 = y1;
y1 = Y0;
}

Tylko po co ci one skoro nigdzie potem ich nie wykorzystujesz ? Przynajmniej nie zauważyłem.
Ogólnie problem w tym że nie wiem co ma być w jakiej kolejności robione ? Bo przetłumaczenie tego z C na BASCOM jakaś wielką tragedią nie powinno być :?:

SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 02 lis 2011, 22:46

Witam! Nie myślcie, że temat umarł. Przeciwnie. Od tych 2 czy 3 dni siedzę ciągle z kol. kayronem i coś kombinujemy. Z czego więciej On ;). Do rzeczy. Jak kolega dondu napisał:
I dobra rada - przesiądź się na C jak najszybciej.
Tak też zrobiłem dziś, bo Bascom sie nie nadaje moim zdaniem do tego zadania z 2 powodów, za mały rozmiar zmiennych (mała dokładność) i zbyt wolne działanie. Przeszukanie 205 elementowej tablicy + wykonanie działań złożonych z rozbiciem na części zajeło mu ok. 100ms co jest karygodne :lol: . Narazie jestem na etapie poznawiania języka C dla PICów w środowisku PIC-C. Będąc zielonym w C już uruchomiłem ADC, i Timer1 z przerwaniem 8kHz. W zasadzie więcej już nic nie trzeba, najważniejsze zrobione. Tematu rzecz jasna nie zamykamy :D napewno jakieś spostrzeżenie któryś z nas doda, tak czy inaczej w Picu ogranicza mnie rozmiar jego RAM'u, używam 16F88 a to tylko 80 elemtowa tablica - przy czym zero kodu dalej :D, ale to tylko do prób, jak algorytm zadziała na mniejszej tablicy, to zmienię procesor, ten wybor padł z tego tylko, że taki miałem luzem zapakowany. W sumie to już nie ten dział, ale możemy pozostać, kol. Kayron będzie zmagał się z ubiciem tego w Bascomie. Trzymam kciuki :D Pozdrawiam!

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 03 lis 2011, 0:41

SQ8 pisze:Jak kolega dondu napisał:
I dobra rada - przesiądź się na C jak najszybciej.
Tak też zrobiłem dziś ...
"Zuch chłopak"! :lol:

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 05 lis 2011, 8:51

Tzn. NIE wiem w BASCOMie chyba sprawa umarła, bo w swojej świetności BASCOM mi uwalił chyba procesor podczas programowania :cry: bo nie może odczytać sygnatury. znaczy się podejrzewam jeszcze, że mogła ujawnić się wada fabryczna płytki z kamami, w końcu modne lutowanie non PB.
Bo na AVT-1452 ten sam programator wykrywa mi CPU prawidłowo i je programuje.
No chyba że OLED mi zbytnio obciąża prądowo programator jak w nim włączę tryb graficzny ?
Ale coraz bardziej tracę cierpliwość do BASCOMa, środowisko jak środowisko, ale te jego ciągłe zwiechy są bardziej czasochłonne niż pisanie programu. Symulator właściwie jest w ogóle bezużyteczny.
Coraz bardziej rozważam przejście na PICa, tam przynajmniej proca sobie zablokować tak łatwo nie można.
A tak na marginesie inicjował już ktoś z was LCD alfanumeryczny w BASCOM AVR. Mi to za chiny nie chce działać ? Przy czym nie chodzi mi o instrukcję CONFIG LCD, tylko napisanie własnej procedury inicjacyjnej. Bo jak widać na .FILMIKU procedura nawet BASCOMa nie zawsze sobie z tym dobrze radzi ? A wyświetlacz o tyle fajny że potrafi wyświetlać grafikę.
Choć taka sztuczka się udaje ? Inicjacja BASCOMem, potem modyfikacja ustawień LCD własnymi procedurami.

Kod: Zaznacz cały

Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Config Lcd = 16 * 2

Declare Sub Write4b(byval Dane As Byte)
Declare Sub Writelcd(byval Dane As Byte)
Declare Sub W_data(byval Dane As Byte)
Declare Sub W_instr(byval Regi As Byte)

E Alias Portb.5
Rs Alias Portb.4

Const Lcd_mask = &B00110000
Const T0ctc = 1
Const T0start = 2             ' start z preskalerem 8
Const T0stop = 0              ' STOP T0
Const T0_val = 125            ' wartość do odmiezania czasu przerwań
Const Adc_pin = &B0001001001
'PB6(9) jako wejście AIN, konwersja wyniku do 8 bit automatycznie wynik w ADCH
Const Adc_start = &B10101110
'ADC w trybie AUTO Triger, taktowany FCPU/64
Const Adc_stop = &B00100110
Dim Temp As Byte
Dim Video(100) As Byte        'bufor video dla grafiki

Config Portb = Output
Portb = 0

'Tccr0a = T0ctc
'Ocr0a = T0_val


Cls
Lcd ">"
Writelcd 84 'T
Writelcd 69 'E
Writelcd 83 'S
Writelcd 84 'T
W_instr 15                    ' powinno spowodować migotanie kursora i tak też robi.
Do
  Waitus 100
  $asm
   nop
  $end Asm
Loop

Sub Write4b(byval Dane As Byte)
   Reset Rs
   Dane = Dane And &B00001111
   Portb = Portb And Lcd_mask
   Portb = Portb Or Dane
   Set E
   $asm
     nop
     nop
   $end Asm
   Reset E
   Waitms 5
 End Sub

 Sub Writelcd(byval Dane As Byte)
   Temp = Dane And &B11110000
   Shift Temp , Right , 4
   Portb = Portb And Lcd_mask
   Portb = Portb Or Temp
   Set E
   $asm
    nop
    nop
    nop
    nop
   $end Asm
   Dane = Dane And &B00001111
   Reset E
   Portb = Portb And Lcd_mask
   Portb = Portb Or Dane
   Waitus 25
   Set E
   $asm
    nop
    nop
    nop
    nop
   $end Asm
   Reset E
   Waitus 50
 End Sub

 Sub W_data(byval Dane As Byte)
   Set Rs
   Call Writelcd(dane)
   Reset Rs
   Waitus 80
 End Sub

 Sub W_instr(byval Regi As Byte)
   Reset Rs
   Call Writelcd(regi)
   Select Case Regi
   Case 1 : Waitms 7
   Case 2 To 3 : Waitms 6
   Case Else : Waitus 150
   End Select
 End Sub
PS Już wiem co było nie tak przestawiłem jedną zworkę i odciąłem sygnał RESET od CPU
Załączniki
OLED TEST.JPG

SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 06 lis 2011, 9:42

Witam! No no :D ładnie ten OLED świeci w ciemności, ładnie :). Czyli rozumiem, że problem z nie wykrywaniem procesora zażegnany (przełożona zworka)? Ja od przedwczoraj mam tyle pracy, że nie wiem jak się nazywam. Chciałem wypróbować kompilator MIKROE - C dla AVR ale ten brak czasu...Z PICem mi nie wyszło jak pisałem po mimo poprawnego działania ADC i Timera. Poprostu reagowało na każdy ton, od 100Hz do 4000Hz :) Zobaczymy co wyjdzie. Pozdrawiam

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 06 lis 2011, 12:33

Ja jeszcze spróbuje pomęczyć tego OLEDa, znaczy się jakieś postępy mam, ale jeszcze trybu graficznego nie odpaliłem, jak to mi się uda to spróbuje ten algorytm ugryźć w BASCOM.
Choć dziwnie się zachowuje ten wyświetlacz niby zgodny z HD44780, a jednak nie które BASCOMowe instrukcje sobie z nim nie radzą ?
No nic muszę go rozgryźć na piechotę tworząc własne procedury.

Zablokowany