Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Bascom] Jak dobrać $crystal dla RC5 ,1Wire , SD -HW SPI

adambehnke 22 Gru 2009 23:50 8790 72
  • #1 22 Gru 2009 23:50
    adambehnke
    Poziom 24  

    Takiego tematu nie znalazłem więc zakładam nowy.

    Otóż mam problem tego typu że:
    Posiadam Atmega 2560 ,podłączony do niej odbiornik RC5 (TSOP) , DS18B20 (1Wire) , a także kartę pamięci SD.
    W fusebitach przełączyłem się na razie na wewnętrzny oscylator i wyłączyłem Fusebit 7(clock divide by 8) .

    Jeśli mam ustawiony $crystal = 1000000 to transmisja z karty śmiga mi tak jak powinna (czyt. jak dla mnie zadowalająco) , ale za to DS18B20 nie odpowiada a także RC5 nie daje innej odpowiedzi jak 127,255.

    Jeśli ustawię $crystal = 4000000 to transmisja z karty siada znacznie (za bardzo jak dla mnie) , ale DS18B20 działa jak powinien , natomiast RC5 dalej 127,255

    Za to jak przestawię $crystal = 8000000 to DS i RC5 chodzą ok ale jeśli chodzi o SD to "olaboga= tragedia"

    Z sd ładuję obrazki i wyświetlam je na LCD graficznym więc dla mnie prędkość jest super ważna.

    Czy jest jakiś sposób aby programowo dostosować wszystko tak aby procek chodził na Max obrotach ale żeby pogodzić to z działaniem wszystkich peryferii?
    Próbowałem w programie wprowadzać w procedurze odczytu z karty zmianę $crystal na inną ale bez rezultatu.
    Może na zewnętrznym kwarcu który także mam podpięte (16MHz) można by coś zdziałać?

    Proszę o pomoc. Każdy trop sprawdzę.

    Dodatkowo transmisja z SD nie chce mi pracować na sprzętowym SPI. Nie widzi karty. Co może być przyczyną? I w jaki sposób - o ile jest to możliwe zwiększyć transmisję z SD?
    Podnieść prędkość szyny SPI?

    0 29
  • Pomocny post
    #2 23 Gru 2009 00:02
    xury
    Poziom 39  

    Musisz sobie zdać sprawę, że dyrektywa $crystal, nie steruje taktowaniem. Informuje ona jedynie kompilator o spodziewanym taktowaniu, a tenże kompilator dostosowuje program pod tą częstotliwość.
    Generalnie proponuję przejść na zewnętrzny kwarc i dobrze sprawdzić kod.

    0
  • #3 23 Gru 2009 00:13
    adambehnke
    Poziom 24  

    Kod jest ok gdyż do odbioru RC5 użyłem znanego bascomowego przykładu umieszczonego w przerwaniu. Co do odczytu ds-ów to także jest ok. Nie wiem co może być przyczyną.


    Nie wiem też dlaczego nie mogę odpalić sprzętowego SPI. Na programowym SPI kart śmiga pięknie a na HW nie chce ruszyć. Kartę mam podłączone pod:

    [Bascom] Jak dobrać $crystal dla RC5 ,1Wire , SD -HW SPI

    Zresztą złącze programujące także jest pod te piny podłączone.

    Przy karcie SD mam oczywiście wymagane rezystory na liniach:

    [Bascom] Jak dobrać $crystal dla RC5 ,1Wire , SD -HW SPI

    W opcjach Bascoma mam ustawione piny SPI i wybrane mam Hardware. Niestety to nie działa.

    0
  • Pomocny post
    #4 23 Gru 2009 12:33
    janbernat
    Poziom 38  

    Sprawdź w dokumentacji czy ta ATMega ma te same piny do programowania i do sprzętowego SPI.

    0
  • Pomocny post
    #5 23 Gru 2009 12:48
    atom1477
    Poziom 43  

    Ja sprawdziłem (jeszcze wczoraj) i ma te same. Dlatego tego nie komentowałem.

    Dodano po 2 [minuty]:

    RC5, 1Wire i SD to są rzeczy dość standardowe i nie mogą one tutaj tak po prostu nie działać. BASCOM ma swoje wady, ale co jak co, RC5, 1Wire i obsługę kart pamięci ma rozwiązaną dobrze (choć niekoniecznie optymalnie pod względem ilości zajmowanych zasobów pamięci).
    Więc jeżeli nie działa, to jest coś nie tak w kodzie.
    Więc pokaż kod.

    0
  • Pomocny post
    #6 23 Gru 2009 13:24
    kamyczek
    Poziom 34  

    $crystal to parametr dla kompilatora informujący o częstotliwości jego pracy. Nie jet to wartość przypadkowa . Możesz jedynie podłączyć kwarc 16MHz ustawić odpowiednio fusy i wpisać $crystal=16000000

    0
  • #7 23 Gru 2009 15:01
    adambehnke
    Poziom 24  

    Kod jest dość spory więc wkleję najważniejsze fragmenty odpowiedzialne za RC5 ,SD i 1Wire.






    RC5

    Code:
    '*****************************************************************************'
    
    '****************************PROCEDURA ODCZYTU RC5****************************
    '*****************************************************************************'
    Readir:

     Disable Int7' w pętli głównej włączam ponownie przerwanie. ( a może powinienem włączyć je jeszcze w miejscu XXX
     Enable Interrupts
     Getrc5(adres , Rozkaz)

         Rozkaz = Rozkaz And &B01111111

         Portc.7 = 0 'Używam tego do zobrazowania sobie czy odbiera mi kody z pilota. W pętli głównej zmieniam stan na przeciwny.

    'xxx'
    Return



    Code:
    '***********************************************************************************'
    
    '*********USTAWIENIE PRZERWANIA OD TSOP -ODBIORNIKA PODCZERWIENI NA INT.7***********'
    '***********************************************************************************'
    Config Rc5 = Pine.7                                         'Port do którego podłączona jest dioda odbiorcza podczerwieni.
    On Int7 Readir
    Config Int7 = Low Level
    Enable Int7



    1WIRE(DS18B20)

    Code:
    '***********************************************************************************'
    
    '**************************Konfiguracja magistrali 1Wire****************************'
    '***********************************************************************************'
    Config 1wire = Portd.4                                      'pin pod którym obsługiwane jest 1Wire


    Przeszukiwanie wstępne przed pętlą główną programu:
    Code:
    '***********************************************************************************'
    
    '*************PRZESZUKIWANIE MAGISTRALI 1WIRE I DODAWANIE DO 4CZUJNIKÓW*************'
    '***********************************************************************************'


    Ds(1) = 0 : Ds(2) = 0 : Ds(3) = 0 : Ds(4) = 0

    W = 1wirecount()
    Locate 4 , 1
    Lcd "Ilosc wykrytych czujnikow :" ; W

    Wait 1

    If W > 0 Then
    Dsid1(1) = 1wsearchfirst()                                  'Znajd? kolejny czujnik podpięty do portu




    Ds(1) = 1
    End If



    If W > 1 Then
    Dsid2(1) = 1wsearchnext()                                   'Znajd? kolejny czujnik podpięty do portu
    Ds(2) = 1
    End If



    If W > 2 Then
    Dsid3(1) = 1wsearchnext()                                   'Znajd? kolejny czujnik podpięty do portu
    Ds(3) = 1
    End If



    If W > 3 Then
    Dsid4(1) = 1wsearchnext()
    Ds(4) = 1
    End If

    '*******************Odczyt numerów ID czujników temperatury*********************


    If Dsid1(8) = Crc8(dsid1(1) , 7) Then
    Locate 5 , 1
    Lcd "CRC OK Czujnik 1 ID: "
    Locate 5 , 23
    For B = 1 To 8
    Lcd Hex(dsid1(b))

    Next
    End If


    If Dsid2(8) = Crc8(dsid2(1) , 7) Then
    Locate 6 , 1
    Lcd "CRC OK Czujnik 2 ID: "
    Locate 6 , 23
    For B = 1 To 8
    Lcd Hex(dsid2(b))
    Next
    End If


    If Dsid3(8) = Crc8(dsid3(1) , 7) Then
    Locate 7 , 1
    Lcd "CRC OK Czujnik 3 ID: "
    Locate 7 , 23
    For B = 1 To 8
    Lcd Hex(dsid3(b))
    Next
    End If


    If Dsid4(8) = Crc8(dsid4(1) , 7) Then
    Locate 8 , 1
    Lcd "CRC OK Czujnik 4 ID: "
    Locate 8 , 23
    For B = 1 To 8
    Lcd Hex(dsid4(b))
    Next
    End If



    Procedura odczytu DS:
    Code:
    Temp_set:
    


    If Ds(1) = 1 Then

    1wreset
    1wwrite &H55
    1wverify Dsid1(1)                                           'wysyłamy adres pierwszego czujnika
    1wwrite &HBE
    I1 = 1wread(2)

    End If

    If Ds(2) = 1 Then

    1wreset
    1wwrite &H55
    1wverify Dsid2(1)                                           'wysylam adres drugiego czujnika
    1wwrite &HBE
    I2 = 1wread(2)

    End If

    If Ds(3) = 1 Then

    1wreset
    1wwrite &H55
    1wverify Dsid3(1)                                           'wysylam adres trzeciego czujnika
    1wwrite &HBE
    I3 = 1wread(2)

    End If

    If Ds(4) = 1 Then

    1wreset
    1wwrite &H55
    1wverify Dsid4(1)                                           'wysylam adres czwartego czujnika
    1wwrite &HBE
    I4 = 1wread(2)

    End If

    '--------konwersja temp dla wszystkich dsow
    1wreset
    1wwrite &HCC
    1wwrite &H44

    Return


    '******************************************************************************'
    '**************************PROCEDURA 1WIRE-TEMPERATURA_READ********************'
    '******************************************************************************'
    Temp_read:

    I1 = I1 * 10
    I1 = I1 / 16
    Ss = Str(i1)
    Ss = Format(ss , " 0.0")
    Temp(1) = Ss

    I2 = I2 * 10
    I2 = I2 / 16
    Ss = Str(i2)
    Ss = Format(ss , " 0.0")
    Temp(2) = Ss

    I3 = I3 * 10
    I3 = I3 / 16
    Ss = Str(i3)
    Ss = Format(ss , " 0.0")
    Temp(3) = Ss

    I4 = I4 * 10
    I4 = I4 / 16
    Ss = Str(i4)
    Ss = Format(ss , " 0.0")
    Temp(4) = Ss

    Return


    I właśnie zauważyłem że nie czekam na konwersję od DS. Moim zamierzeniem było wysłać za jednym tyknięciem adresy do ds-ów (mam ich 4) a przy jakimś kolejnym odczytać wartości. Chciałem pominąć czekanie tego bez sensownego Waitms 750.


    Ładowanie obrazka na LCD



    Code:
    '******************************************************************************'
    
    '******************************************************************************'
    '*****************************ŁADOWANIE GRAFIKI Z PLIKU************************'
    '******************************************************************************'
    '******************************************************************************'
    Graphic:

    'Pwm1a = 200
    'Koordynaty wyświetlenia obrazka i nazwa pliku do otwarcia

    'Obrazek = "test.txt"
    Pozycja_x = 0
    Pozycja_y = 0


    Gr(1) = 0
    Gr(2) = 0
    Gr(3) = 0
    K = ""
    G = 0
    Dp = ""
    Cls Graph

    Open Obrazek For Binary As #5                               'można także użyć stałej jako numer kanału
    'G = Lof(#5)                                                 'sprawdzenie długości pliku danych

    Do
     K = ""
     Line Input #5 , K                                          ' read a line

    'XXXXXXXXXXXXXXXXXXXXXWYŚWIETLANIE NA LCDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Gr(1) = Len(k)                                              'długość kolumny
    Gr(2) = Gr(2) + 1                                           'kolejna linia


    For Gr(3) = 1 To Gr(1)

        Dp = Mid(k , Gr(3) , 1)

        'wprowadzene korekty wyświetlenia obrazka'
        Gr(4) = Gr(3) + Pozycja_x
        Gr(5) = Gr(2) + Pozycja_y

           If Val(dp) = 1 Then
            Pset Gr(4) , Gr(5) , 0
           End If

           If Val(dp) = 0 Then
            Pset Gr(4) , Gr(5) , 1
           End If

    Next Gr(3)
    'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Loop Until Eof(#5) <> 0

    Close #5
    Pwm1a = Bkl


    Return


    Nie Kierujcie się tu tą linijką z PWM bo jest ona używana do rozjaśnienia wyświetlacza po załadowaniu grafiki. Adres OBRAZEK to najzwyklejszy plik tekstowy xxx.txt skąd odczytuje grafikę w taki sposób jak w załączniku.

    Z uwagi że nie działa mi sprzętowe SPI korzystam z bascomowego przykładu config_mmc.bas:

    Code:
    ' Declare here you SPI-Mode
    
    ' using HW-SPI:     cMMC_Soft = 0
    ' not using HW_SPI: cMMC_Soft = 1

    Const Cmmc_soft = 1





    ' --------- Start of Section for Soft-SPI --------------------------------------

       ' Chip Select Pin  => Pin 1 of MMC/SD
      Config Pinb.0 = Output
       Mmc_cs Alias Portb.0
       Set Mmc_cs

       ' MOSI - Pin  => Pin 2 of MMC/SD
       Config Pinb.2 = Output
       Set Pinb.2
       Mmc_portmosi Alias Portb
       Bmmc_mosi Alias 2

       ' MISO - Pin  => Pin 7 of MMC/SD
       Config Pinb.3 = Input
    Mmc_portmiso Alias Pinb
     Bmmc_miso Alias 3

       ' SCK - Pin  => Pin 5 of MMC/SD
       Config Pinb.1 = Output
       Set Pinb.1
       Mmc_portsck Alias Portb
      Bmmc_sck Alias 1

    ' --------- End of Section for Soft-SPI ----------------------------------------


    ' ========== End of user definable range =======================================


    ' Error
    Const Cperrdrivereset = 225                                 ' Error response Byte at Reset command
    Const Cperrdriveinit = 226                                  ' Error response Byte at Init Command
    Const Cperrdrivereadcommand = 227                           ' Error response Byte at Read Command
    Const Cperrdrivewritecommand = 228                          ' Error response Byte at Write Command
    Const Cperrdrivereadresponse = 229                          ' No Data response Byte from MMC at Read
    Const Cperrdrivewriteresponse = 230                         ' No Data response Byte from MMC at Write
    Const Cperrdrive = 231
    Const Cperrdrivenotsupported = 232                          ' return code for DriveGetIdentity, not supported yet

    Waitms 1                                                    ' Wait some time before initialising MMC/SD
    Dim Gbdriveerror As Byte                                    ' General Driver Error register
    Dim Gbdriveerrorreg As Byte                                 ' Driver load Error-Register of HD in case of error
    Dim Gbdrivestatusreg As Byte                                ' Driver load Status-Register of HD on case of error
    Dim Gbdrivedebug As Byte
    $lib "MMC.LIB"                                              ' link driver library
    $external _mmc
    'Gbdriveerror = Driveinit()                                  ' Init MMC/SD Card


    Oraz Config_AVR-DOS.BAS.

    Nie potrafię inaczej skonfigurować obsługi karty aby jeśli to możliwe pominąć ten config_mmc.bas.

    Muszę mieć obsługę fat więc Config_AVR-DOS.BAS muszę mieć. Ale jak to skonfigurować aby chodziło na sprzętowym SPI nie mam pojęcia. Szperałem na Elektrodzie,w helpach itp. I nic nie wychodzi.

    W programie mam jeszcze obsługę pamięci 24c512 na I2C , oraz PCF8583. I wszystko to śmiga OK.
    Problemy największe są przy RC5 i DS.


    Reasumując:

    Potrzebuję maksymalnej prędkości jaką wycisnę z Atmegi 2560 z kwarcem zew. 16Mhz aby jak najszybciej ładować obrazki z SD. Ale musi przy tym działać RC5, DS, I2C. No generalnie wszystko oczywiście ma śmigać. Na razie nie ma problemów z działaniem przy :

    Code:
    $regfile = "m2560def.DAT"                                   'ATMEGA 2560
    

    $crystal = 4000000
    $hwstack = 64
    $swstack = 64
    $framesize = 64


    Ale karta SD chodzi za wolno. Fakt że na soft-spi . Na Hardware zapewne można by poszaleć ale nie potrafię tego opanować niestety <rozkłada ręce>.

    Dodam że jeśli ustawię :
    Code:
    $crystal = 1000000

    to karta chodzi 2-3 razy lepiej ale RC5 i DS milczą. PCF odpowiada zawsze idealnie.Jak na razie pracuję na wewnętrznym oscylatorze gdyż miałem niemiłą niespodziankę z zablokowaniem sobie atmegi :/ Ale ją reanimowałem poświęcają przy tym ładnych parę godzin. Dlatego zanim nie ukończę programu to chyba nie będę się przełączał na zew. kwarc. Tym bardziej że zapewne jeszcze z 200x przeprogramuję Atmegę zanim skończę program. Testuję wszystko na bieżąco. Mam nadzieję że procek nie odmówi współpracy w setnym z kolei programowaniu.Niby w nocie katalogowej podają że wytrzymuje 10,000 przeprogramowań ale lepiej dmuchać na zimne. Ta atmega jest dość droga (kosztowała mnie prawie 70pln + koszt wlutowania 15pln ,gdyż sam nie lutowałem bo płytka na której jest wlutowana celowo nie ma solder-maski bo chcę jeszcze pomierzyć wszystko do końca a lakier by mi to utrudnił. Raster ścieżek też jest bardzo gęsty i wynosi 5mils) więc szkoda by było.

    Widok płytki. Mam na niej też 2 piloty (już działają w RC5) - oczywiście odcięte już od płytki głównej.Widać tu 3-4 nie pasujące elementy które wyszły niechcący przy wizualizacji.


    [Bascom] Jak dobrać $crystal dla RC5 ,1Wire , SD -HW SPI [Bascom] Jak dobrać $crystal dla RC5 ,1Wire , SD -HW SPI

    Oczywiście dodam że mam dodane w programie :
    Code:
    $include "Config_MMC.bas"                                   'include mmc
    
    $include "Config_AVR-DOS.BAS"                               'include avr-dos


    Aby nie było niedomówień.


    Dołączam też schemat aby było wszystko jasne.
    [Bascom] Jak dobrać $crystal dla RC5 ,1Wire , SD -HW SPI

    0
  • Pomocny post
    #8 23 Gru 2009 16:52
    kamyczek
    Poziom 34  

    Na twoje utrapienia jest tylko jedno lekarstwo: Napisać obsługę karty samodzielnie lub przeprojektować układ i rozdzielić zadania na kilka mikrokontrolerów. Niestety Bascom nadaje się do zabawy a nie do poważnych aplikacji.

    0
  • Pomocny post
    #9 23 Gru 2009 17:08
    atom1477
    Poziom 43  

    adambehnke napisał:
    Na razie nie ma problemów z działaniem przy :

    Code:
    $regfile = "m2560def.DAT"                                   'ATMEGA 2560
    

    $crystal = 4000000
    $hwstack = 64
    $swstack = 64
    $framesize = 64


    Ale karta SD chodzi za wolno. Fakt że na soft-spi . Na Hardware zapewne można by poszaleć ale nie potrafię tego opanować niestety <rozkłada ręce>.

    Na moje oko procesor chodzi na 4MHz więc program będzie działał tylko wtedy gdy zadeklarujesz taką częstotliwość.
    Gdy zadeklarujesz mniejszą to ta rzeczywista wcale się nie zmienia. BASCOM wstawia mniejsze opóźnienia licząc w ilości cykli. Myśli bowiem że procesor chodzi na mniejszej częstotliwości.
    Czyli opóźnienia liczone w milisekundach wyjdą 4 razy mniejsze. Karcie SD to nie zaszkodzi. Po prostu będzie działała 4 razy szybciej.
    DS-om i RC5 to niestety zaszkodzi.


    adambehnke napisał:
    Dodam że jeśli ustawię :
    Code:
    $crystal = 1000000

    to karta chodzi 2-3 razy lepiej ale RC5 i DS milczą.

    No właśnie. Czyli na 99% jest tak jak napisałem. Chcesz szybciej to musisz zmienić rzeczywistą częstotliwość taktowania a nie tylko tą w którą sobie deklarujesz w programie.
    Na razie dla testów przestaw w FuseBitach taktowanie z 4-ech na 8MHz. W programie też zadeklaruj 8MHz. Karta powinna działać 2 razy szybciej. Ale wyjątkowo, DS.-y i RC5 też powinny działać.
    Jak zadziała to przestaw się na rezonator zewnętrzny i wtedy będziesz miał obsługę SD 4 razy szybszą. Z tym że tak jak mówię DS-y i RC5 też będą działały.
    Jak zadziała to spróbujemy przejść na sprzętowe SPI co da jeszcze większą prędkość odczytu karty SD. Ale po kolei.
    Jak się boisz grzebać w Fusebitach to daj zrzut ekranu z tymi FuseBitami które teraz masz ustawione to powiem(y) co masz zmienić.

    0
  • Pomocny post
    #10 23 Gru 2009 23:58
    kriss68
    Poziom 20  

    Skoro masz wpięty kwarc to ustaw fusy na zewnętrzny kwarc i wpisz $crystal = 16000000 (wg schematu masz kwarc 16MHz) powinno wszystko śmigać - mi śmigało, ale nie robiłem wszystkiego naraz. Co do karty sd i hw spi w bascomie to pamiętam, że było coś namieszane w inicjacji spi (config mmc) i też nie wymagaj cudów od bascoma - ja przy hw spi max wyciągnąłem 32kHz przy odtwarzaniu pliku wav (odczytaj 8bit z sd -> ustaw pwm i tak w koło macieju)

    0
  • #11 24 Gru 2009 00:23
    adambehnke
    Poziom 24  

    kamyczek napisał:
    Na twoje utrapienia jest tylko jedno lekarstwo: Napisać obsługę karty samodzielnie lub przeprojektować układ i rozdzielić zadania na kilka mikrokontrolerów. Niestety Bascom nadaje się do zabawy a nie do poważnych aplikacji.


    Także o tym myślałem. Płytka jaką zaprojektowałem jest identycznych rozmiarów co płytka z wyświetlaczem 240*128 i jest umieszczana za wyświetlaczem.Projektując ją pomyślałem o dalszych rozszerzeniach układu i wyprowadziłem sobie to co potrzebuje na goldpiny.Tak że, mogę umieścić kolejną płytkę za tą która już istnieje. Tylko zasilanie muszę zrobić dla niej samodzielne bo tu nie chcę się bawić w jakieś większe radiatory.W tej chwili mam na stabilizatorach radiatorki TO220 i jest cool.


    A poniżej zamieszczam zrzut ekranu fusów. Rzeczywiście nie w smak mi znowu zblokować atmegę. Tym bardziej że jest to obudowa TQFP100 i wlutowana na stałe.

    [Bascom] Jak dobrać $crystal dla RC5 ,1Wire , SD -HW SPI

    0
  • Pomocny post
    #12 24 Gru 2009 00:33
    kriss68
    Poziom 20  

    CKSEL na 1111 i SUT na 11 co nam da zewnętrzny rezonator zresztą tak powinno być przy opisie. Po tym w programie zmień na $crystal = 16000000.

    0
  • #13 24 Gru 2009 00:34
    adambehnke
    Poziom 24  

    Cytat:
    i też nie wymagaj cudów od bascoma - ja przy hw spi max wyciągnąłem 32kHz przy odtwarzaniu pliku wav (odczytaj 8bit z sd -> ustaw pwm i tak w koło macieju


    No proszę, czyżbym znalazł w końcu kogoś kto w Bascomie potrafi odtworzyć powiedzmy jakiś plik dźwiękowy z SD i wrzucić go na PWM? Chodzi mi o jakąś super prostą procedurkę i sprzęt abym mógł to zaimplementować w moim projekcie do jak to ujmę dźwiękowego potwierdzania wykonywanych czynności. Tzn. jak naciskam Menu to odtwarza mi wcześniej zapisany-nagrany plik dźwiękowy w którym słyszymy słowo MENU. Wiem, trochę to głupie ale mam pewne pomysły co do zastosowania ale najpierw jakoś muszę to opanować.

    Sorry że zszedłem z tematu ale lubię załatwiać wszystko na gorąco :)

    0
  • Pomocny post
    #14 24 Gru 2009 00:37
    kriss68
    Poziom 20  

    Odtwarzałem kiedyś pliki mono 8bit 32kHz w bascomie wszystko ładnie działało. Nie chodziło to przy pełnych 32kHz ale dźwięk nie był zniekształcony (program chodził przy max prędkości i przed każdym odczytem karty zmieniał stan jednego z pinów - w ten sposób mogłem zmierzyć częstotliwość)

    0
  • #15 24 Gru 2009 00:38
    adambehnke
    Poziom 24  

    kriss68 napisał:
    CKSEL na 1111 i SUT na 11 co nam da zewnętrzny rezonator zresztą tak powinno być przy opisie. Po tym w programie zmień na $crystal = 16000000.


    Jesteś pewien na 10000000000000000% ? Bo mi ręka drży jak grzebię w fusach przy oscylatorach :)

    0
  • Pomocny post
    #16 24 Gru 2009 00:40
    kriss68
    Poziom 20  

    A co pisze przy tej opcji? Może przenieśmy rozmowę na gg bo się śmietnik robi?

    0
  • Pomocny post
    #17 24 Gru 2009 00:44
    atom1477
    Poziom 43  

    Rozwiń zakładkę 98DCBA i zrób printscreena.
    Zobaczymy co tam można wybrać.
    To niby proste ale ja też się boję :D

    Dodano po 55 [sekundy]:

    Programmed 506 to nic takiego. U mne dochodziło do 10000...20000.

    0
  • #18 24 Gru 2009 00:46
    adambehnke
    Poziom 24  

    Ok przestawiłem fusy jak na zrzucie ekranu:

    [Bascom] Jak dobrać $crystal dla RC5 ,1Wire , SD -HW SPI

    oraz zmieniłem na

    Code:
    $crystal = 16000000
    w programie.


    Rzeczywiście zaczęło ładować obrazki z SD ze dwa razy szybciej. Na dodatek RC5 i DS chodzą !

    Ale mam pewne wątpliwości czy to odczyt z SD jest wolny czy po prostu wykonywanie instrukcji PSET zajmuje tyle czasu. No bo przy pełnym ekraniku 240*128 to jest 30720 pixeli ! A to chyba musi ileś trwać. Ale jak to przyspieszyć do granic możliwości...

    0
  • Pomocny post
    #19 24 Gru 2009 00:50
    kriss68
    Poziom 20  

    Jeśli chcesz to ci wyślę ten programik od wav tylko podaj gg albo napisz do mnie (gg w profilu) bo nie chcę forum zaśmiecać

    0
  • Pomocny post
    #20 24 Gru 2009 00:50
    atom1477
    Poziom 43  

    Miałem na myśli zrzut ekranu PRZED przestawieniem Fusebitów :D
    Ale skoro działa to tylko się cieszyć trzeba.
    To został HW SPI. Może być z tym duży problem. Bo ja też miałem z tym problem na ATMega32 i nie udało mi się go rozwiązać (to znaczy musiałem pozostać przy Softwareowym SPI).

    0
  • #21 24 Gru 2009 00:55
    kriss68
    Poziom 20  

    A ja wciąż proszę o kontakt gg (program wav + działające hw spi)

    0
  • Pomocny post
    #23 24 Gru 2009 00:58
    atom1477
    Poziom 43  

    Acha. To PSET tak Ci ogranicza prędkość. Ja używając ładowania obrazu za pomocą:

    Gosub _set_address
    Gosub _gwrite_data
    i
    Gosub _gwrite_cmd

    przyspieszyłem odświeżanie gdzieś z 16 razy w porównaniu do tego samego programu działającego na procedurze PSET.

    0
  • Pomocny post
    #25 24 Gru 2009 12:35
    atom1477
    Poziom 43  

    No to tak.
    U mnie pamięć grafiki w LCD zaczynała się od 768. Stąd taka stała w programie. Wcześniej (od 0) była pamięć textu.
    Pixele są rysowane poziomo. Czyli każdy bajt reprezentuje 8 pixeli jako pozioma linia.
    I teraz dość nieprzyjemna rzecz. Mianowicie tryb wyświetlania zależy od trybu textu. Jak wybierzesz tryb 8-mio bitwy to każdy bajt będzie Ci reprezentował 8 pixeli. Ale czcionka też będzie 8-mio bitowa i będzie dość rozwlekła.
    Jak przejdziesz na tryb 6-cio bitowy, to czcionka będzie bardzo ładna.
    Ale grafika też będzie 6-cio bitowa. Każdy bajt będzie reprezentował 6 pixeli. 2 najstarsze pixele będą olewane. I właśnie ta 6-io bitowość grafiki jest dość niewygodna.

    Tryb 6 albo 8 bitowy wybiera się linią FS (Font Select).

    A teraz kawałek programu:

    Code:

    Dim X1 As Byte
    Dim Y1 As Byte
    Dim Addr As Word
    Dim Pixel_Data As Byte

    ...
    ...

    Y1 = 10
    X1 = 20
    Pixel_data = &B00101010
    Gosub Draw_megapixel

    ...
    ...

    Draw_megapixel:
          Addr = Y1 * 40                    '40 = 240/6
          Addr = Addr + X1
          Addr = Addr + 768

          lds R20, {Addr+0}
          lds R21, {Addr+1}
          Gosub _set_address

          lds R24, {Pixel_data}
          Gosub _gwrite_data
          ldi R24, &HC0
          Gosub _gwrite_cmd
    Return


    Narysuje to 6 pixeli w wybranym „megapixelu”. To znaczy w polu o wielkości 6 pixeli.
    Zwiększenie zmiennej Y1 o 1 spowoduje przejście o jedną linię w dół.
    Zwiększenie zmiennej X1 o 1 spowoduje przejście o 1 pole w lewo. O jedno pole, a nie o 1 pixel! 1 pole to 6 pixeli.
    Jeżeli chcesz pracować w trybie 8-mio bitowym to zmień obliczanie adresu na:
    Code:

          Addr = Y1 * 30                    '30 = 240/8
          Addr = Addr + X1
          Addr = Addr + 768


    Ten kod dotyczy LCD 240x128 pixeli z kontrolerem T6963C.
    Rysowanie będzie z 6 ( 8 ) razy szybsze. Bo w jednej komendzie stawiane jest 6 ( 8 ) pixeli. PSET w jednej komendzie stawia jeden.
    Dla wyświetlaczy z innymi kontrolerami mogło by to być 16 razy szybsze (bo PSET może wymagać odczytania bajtu z LCD, zmiany jednego bitu i zapisania tego bajtu spowrotem. Czyli postawienie jednego pixela to 2 komendy. Postawienie 8-miu pixeli to 16 komend).
    Ale inne kontrolery trzeba inaczej sterować. Ten kod wysteruje tylko kontroler T6963C.
    Jeżeli będziesz chciał to wykorzystać to szykuje Ci się niezła zmiana w kodzie, bo tym za prosto obrazków w formacie BGF nie narysujesz.

    0
  • #26 24 Gru 2009 14:04
    adambehnke
    Poziom 24  

    To jest super sprawa! Dzięki! Sprawdzę kodzik niestety dopiero jutro bo już mnie żona goni bo kupa roboty przed wigilią do zrobienia a jak to mowi "Ty siedzisz i się bawisz tymi swoimi zabawkami" . Co prawda to prawda <haha>.

    No cóż.Pozostaje mi iść.

    Zatem

    Życzę Wszystkim Zdrowych i Wesołych Świąt.
    I jeszcze raz dziękuję wszystkim za okazywaną mi pomoc :)

    0
  • #27 25 Gru 2009 18:48
    adambehnke
    Poziom 24  

    atom1477 napisał:

    Jeżeli będziesz chciał to wykorzystać to szykuje Ci się niezła zmiana w kodzie, bo tym za prosto obrazków w formacie BGF nie narysujesz.


    Nie mam w zamiarze używania plików *.bfg. Odczytuje i zapisuje do lcd bezpośrednio po odczytaniu z pliku, dane które są niejako tablicą.
    Odczytuje z pliku dane linijka po linijce gdzie jedna linijka w pliku odpowiada jednej linijce na lcd i tak po kolei aż do końca pliku. W sumie raczej nie powinno być kłopotu z przerobieniem fragmentu kodu odpowiedzialnego za wyświetlanie.
    Dzisiaj mam chwilkę więc posiedzę i skrobnę coś i zamieszczę.



    A więc napisałem taki oto kodzik. Tak jak mówiłeś Atom ładowanie grafiki sporo przyśpieszyło. Jak na moje oko to około 3 razy. Teraz ładowanie grafiki 240*128 trwa około 1s. Nie jest to zapewne jeszcze optymalnie napisane ale ważne że każda kolejna zmiana jest ogromnym krokiem na przód.

    Code:
    Graphic:
    


    Open Obrazek For Binary As #5


    Cls                                                         'czyszczenie tekstu i grafiki na lcd
     X1 = 0 : Y1 = 0                                            'koordynaty wstępne

    Do

      K = ""
      Line Input #5 , K                                         ' odczyt linii danych z pliku

         For Q1 = 0 To 39

             Q2 = Q1 * 6
             Q2 = Q2 + 1
             Q3 = Mid(k , Q2 , 6)
             Q4 = "00" + Q3

             Pixel_data = Binval(q4)

        'kod Atoma wyświetlający blok o długości 6 pixeli

             Addr = Y1 * 40                                     '40 = 240/6
             Addr = Addr + X1
             Addr = Addr + 768
             lds R20, {Addr+0}
             lds R21, {Addr+1}
             Gosub _set_address

             lds R24, {Pixel_data}
             Gosub _gwrite_data

             ldi R24, &HC0
             Gosub _gwrite_cmd

                   X1 = X1 + 1

        Next Q6

             Y1 = Y1 + 1                                        'skok do kolejnego wiersza


    Loop Until Eof(#5) <> 0                               

    Close #5

    Return


    Nie wiem czy można jeszcze coś z tego wycisnąć. Chyba tylko mogła by pomóc zmiana z programowego na sprzętowe SPI.

    0
  • Pomocny post
    #28 26 Gru 2009 09:49
    kamyczek
    Poziom 34  

    Dokładnie jak mówisz sprzętowe SPI obsługiwane w przerwaniach. Najszybszą i optymalną procedurę obsługi tego lcd można napisać w asemblerze. Ciekawym rozwiązaniem może być też użycie mikrokontrolera atxmega128A3 i jednego z kanałów DMA ale to już wyższa szkoła...

    0
  • #29 26 Gru 2009 13:29
    adambehnke
    Poziom 24  

    Tylko nie wiem dlaczego nie widzi mi karty na sprzętowym. Oraz nie wiem jak pozbyć się załącznika Config_mmc.bas .Chciałbym do mojego kodu załaczyć tylko avr_dos.bas a resztę konfiguracji ISP umieścić bezpośrednio w moim głównym kodzie.

    0
  • #30 26 Gru 2009 15:51
    atom1477
    Poziom 43  

    Po prostu skopiuj zawartość pliku Config_mmc.bas do swojego kodu programu.
    Dużo Ci jeszcze zżera formatowanie grafiki. Ja spokojne wyciągałem odświeżanie 10…20 razy na sekundę.

    kamyczek napisał:
    Dokładnie jak mówisz sprzętowe SPI obsługiwane w przerwaniach.

    Nie zauważyłem żeby adambehnke gdzieś tak powiedział.
    Po za tym to nieprawda. Sprzętowe SPI jest obsługiwane bez przerwań.

    0