logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

adambehnke 22 Gru 2009 23:50 9513 72
  • #1 7425125
    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?
  • Pomocny post
    #2 7425167
    xury
    Specjalista automatyka domowa
    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.
  • #3 7425199
    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.
  • Pomocny post
    #4 7426371
    janbernat
    Poziom 38  
    Sprawdź w dokumentacji czy ta ATMega ma te same piny do programowania i do sprzętowego SPI.
  • Pomocny post
    #5 7426426
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #6 7426598
    kamyczek
    Poziom 38  
    $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
  • #7 7427005
    adambehnke
    Poziom 24  
    Kod jest dość spory więc wkleję najważniejsze fragmenty odpowiedzialne za RC5 ,SD i 1Wire.






    RC5
    '*****************************************************************************'
    '****************************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



    '***********************************************************************************'
    '*********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)

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


    Przeszukiwanie wstępne przed pętlą główną programu:
    '***********************************************************************************'
    '*************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:
    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



    '******************************************************************************'
    '******************************************************************************'
    '*****************************Ł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:

    ' 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 :

    $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ę :
    $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 :
    $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
  • Pomocny post
    #8 7427450
    kamyczek
    Poziom 38  
    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.
  • Pomocny post
    #9 7427517
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #10 7429467
    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)
  • #11 7429561
    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
  • Pomocny post
    #12 7429585
    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.
  • #13 7429595
    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 :)
  • Pomocny post
    #14 7429603
    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ść)
  • #15 7429604
    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 :)
  • Pomocny post
    #16 7429613
    kriss68
    Poziom 20  
    A co pisze przy tej opcji? Może przenieśmy rozmowę na gg bo się śmietnik robi?
  • Pomocny post
    #17 7429616
    Konto nie istnieje
    Poziom 1  
  • #18 7429627
    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
    $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...
  • Pomocny post
    #19 7429634
    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ć
  • Pomocny post
    #20 7429637
    Konto nie istnieje
    Poziom 1  
  • #21 7429642
    kriss68
    Poziom 20  
    A ja wciąż proszę o kontakt gg (program wav + działające hw spi)
  • Pomocny post
    #23 7429652
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #25 7430534
    Konto nie istnieje
    Poziom 1  
  • #26 7430882
    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 :)
  • #27 7434747
    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.

    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.
  • Pomocny post
    #28 7436411
    kamyczek
    Poziom 38  
    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...
  • #29 7437286
    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.
  • #30 7437885
    Konto nie istnieje
    Poziom 1  
REKLAMA