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

[Atmega128 Bascom] Atmega128 Bascom - Różnice w szybkości komunikacji HARD-SPI vs SOFT-SPI

werewolf15 22 Lip 2015 15:50 1809 22
  • #1 14867222
    werewolf15
    Poziom 14  
    Witam!
    Kiedyś, gdzieś w internecie wyczytałem że Hard-spi to szybszy sposób komunikacji procesora z np. kartą sd niż SOFT-SPI. Bardzo długo męczyłem się żeby At128 dogadała się z kartą sd przez HARD-SPI ale w końcu się udało.

    Napisałem prosty program zapisujący na kartę zmienną typu byte jednocześnie licząc ilość tych zapisów w czasie 1sek.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Fragment pliku konfiguracji sd:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Okazało się że przy Hard-spi udało się zapisać zmienną 3724 razy a przy Soft-spi 3697 razy w ciągu 1sek.

    Mam więc pytanie czy te dwa tryby komunikacji SPI nie różnią się od siebie pod względem prędkości komunikacji z kartą sd czy może ja się gdzieś pomyliłem w programie? I co w takim razie ma oznaczać komentarz w pliku konfig. karty "Double speed on ATMega128"? A może po prostu Atmega nie da rady wykonać więcej zapisów przy kwarcu 16Mhz?

    Dodam że cały układ mam zasilany z programatora USB ASP. At128 zasilana 5V karta 3,3V połączona przez konwerter napięć SN74LS07d.
  • #2 14867363
    tmf
    VIP Zasłużony dla elektroda
    BASCOM i wydajność - to się nazywa oksymoron. Żeby wyciągać jakieś sensowne wnioski trzeba by użyć sensownego kompilatora, który generuje sensowny kod. Bo tak to tylko testujesz jakość Bascoma, a wszyscy wiemy, że jako zabawka jest ok, ale bądźmy poważni :)
    Teoretycznie na M128 taktowanej 16 MHz, SPI może być taktowane 8 MHz, czyli możesz uzyskać transfer 1 MB/s. Przy softwarowym SPI (tylko po co w ogóle myśleć o czymś takim jak softwarowe SPI) osiągniesz może 100-300 kB/s, zakładając użycie kompilatora np. C lub pisząc w asemblerze. Ale... przy zapisie/odczycie SD dużo zależy od reszty kodu - to nie tylko transfer po SPI, ale też obsługa FS. Dla M128 co prawda jak pisałem teoretycznie uzyskasz 1 MB/s transferu po SPI ale zasadniczo ze 100% obciążeniem procka. Na AVR XMEGA dzięki DMA uzyskasz transfer 2 MB/s przy obciążeniu procka na poziomie zero do paru procent, więc będzie mógł w tym czasie robić coś innego.
  • #3 14867571
    werewolf15
    Poziom 14  
    Czyli jeżeli bym chciał napisać program w Bascomie zapisujący na kartę sd odczyty z wewn. ADC to nie mam co liczyć na lepszą częstotliwość próbkowania niż te uzyskane 3,7kHz? No bo wiem że zarówno odczyt z ADC jak i zapis na sd zajmują w Bascomie trochę czasu :cry:
  • #4 14867661
    tmf
    VIP Zasłużony dla elektroda
    Nie wiem, nie znam Bascoma. Zapewne da się uzyskać więcej jeśli Bascom ma dedykowane biblioteki do SD. Z drugiej strony nie prościej przejść na C? Szybkość zapisu na poziomie 300-1400 kB/s jest zupełnie realna w C. A ponieważ do obsługi SD używasz biblioteki, np. FATFS Chana to prostota użycia tego rozwiązania jest taka sama jak Bascoma.
  • #5 14867698
    Konto nie istnieje
    Konto nie istnieje  
  • #6 14867783
    werewolf15
    Poziom 14  
    Jeżeli chodzi o programowanie to moja wiedza obejmuje tylko to co zapamiętałem przeglądając internet i helpa bascoma, w związku z tym bardzo dziękuję za pokazanie mi moich błędów bo ciężko było by mi dojść do tego drogą prób i błędów :D

    Przerobiłem program według Twoich wskazówek:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Teraz widać ogromną różnice pomiędzy Hard a Soft Spi, zapis na sd przy:
    -Hard=23255 taktów
    -Soft=41210 taktów
    -odczyt ADC=37 taktów.

    Może zadam teraz banalne pytanie, ale ile jest w moim przypadku taktów na 1 sek? Chciałbym wiedzieć ile zdołam zrobić powtórzeń właśnie w czasie 1 sek?
  • #7 14867841
    Konto nie istnieje
    Konto nie istnieje  
  • #8 14867856
    kamyczek
    Poziom 38  
    W bascomie różnica będzie niewielka , tylko dlatego że bascom jest a w zasadzie to trzeba powiedzieć że nie jest doskonały . Różnica jest taka jak wynosić śmieci samemu lub wykorzystać do tego młodszego brata i o ile brat nie wymaga patrzenia przez okno czy śmieci trafiły do naszego śmietnika , to w tym czasie można spałaszować lody w lodówce , wysłać sms-ka do kolegi itp. Hardwerowe spi wykorzystuje autonomiczny moduł do którego należy jedynie wpisać zmienną w trakcie kiedy moduł wysyła dane mikrokontroler może zrobić coś innego i przy każdej zmiennej będzie to od 8 instrukcji do n krotności wynikającej z dzielnika zegara SPI . Programowe spi do całej operacji używa mikrokontrolera i o ile nie napiszemy go sami i nie wpleciemy zamiast opóźnień innych operacji wykorzysta puste pętle generujące opóźnienia w których mikrokontroler będzie bezczynny . Różnicę można szybciej zobaczyć w przypadku wysyłania grafiki na LCD i użyciu asemblera gdzie użycie peryferii i odczyt kolejnych bajtów wysyłanych na wyświetlacz może się odbyć w trakcie transmisji poprzedniego bajtu po spi . Czy więc sprzętowo będzie szybciej oczywiście tak , ale przy pomocy języka ,który pozwala na osiągnięcie szybkości działania programu a nie pisania programu jak to jest w przypadku bascoma ...
  • #9 14868380
    werewolf15
    Poziom 14  
    Niewiem czy dobrze rozumiem ale chyba będzie problem bo na moim kalkulatorze wychodzi że 16000000/15000=1066,7 a w nocie pisze że dla Timer1 prescaler może być max 1024
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Mimo wszystko zmieniłem program:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    W efekcie przy Hard-spi odczyt z ADC=0, a zapis SD=215 taktów.
    Czy "zmuszając" atmege do przekroczenia tych 15000 próbek na sek. dalej przepełniam licznik? Może trzeba wymienić kwarc na mniejszy np. 12000000/1024=11718,75 i wtedy by się mieściło w granicy? I jeszcze pytanie co z tą częścią po przecinku 11718,75? Czy to się jakoś zaokrągla do pełnej liczby?
  • #10 14868910
    Konto nie istnieje
    Konto nie istnieje  
  • #11 14868936
    dondu
    Moderator na urlopie...
    Dodam, że:
    - wykorzystanie rozdzielczości 10-bitów ma sens tylko pod warunkiem prawidłowego zaprojektowania schematu i PCB,
    - można przekraczać częstotliwość taktowania ADC powyżej 200kHz pod warunkiem, że nie korzystamy z pełnej rozdzielczości 10-bit.
  • #12 14870792
    werewolf15
    Poziom 14  
    Poczytałem trochę o timerach i prescalerach i mam nadzieję że teraz napisałem obsługę timer0 bez "rażących" błędów :?:
    Program posiada dwa założenia: zlicza liczbę zapisanych na SD zmiennych typu word lub zlicza ilość odczytów z ADC w ciągu 1sek, wyniki wyświetla na lcd.
    Zmieniłem również zmienną "f" liczącą zapisy/odczyty z byte na single bo zorientowałem się po zmienności wyników że byte po prostu jest za mała i się przepełnia :oops:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Wyniki przedstawiają sie następująco:
    -zapis na SD 3391Hz
    -odczyt ADC 4332Hz
    Czyli dalej zrobiłem coś źle bo znowu odczyt ADC jest szybszy od zapisu SD :?:
  • #13 14870901
    Konto nie istnieje
    Konto nie istnieje  
  • #14 14870983
    werewolf15
    Poziom 14  
    Proszę oto wyniki:
    - samo ADC=4464
    - S=3245
    - R=1992
    Czyli wyszło podobnie do moich wyników.
  • #15 14871239
    Konto nie istnieje
    Konto nie istnieje  
  • #16 14871349
    werewolf15
    Poziom 14  
    Zrobiłem wszystko jak Napisałeś:
    -zmieniłem zmienną G na long
    -zmieniłem prescaler ADC z Auto na 128
    -zaznaczyłem w komentarze 4 linijki w mcs.lib, potem skompilowałem w managerze

    Wyniki dalej niczym się nie różnią od poprzednich :cry:
  • #17 14871391
    Konto nie istnieje
    Konto nie istnieje  
  • #18 14871503
    kamyczek
    Poziom 38  
    Jeśli chcesz wybrać dobrą drogę na pzyszłość wybierz prescaler na C albo asemblera używanie bascoma jest jak używanie widelca do zjedzenia zupy , w prawdzie się da ale nigdy nie będzie to optymalne . Zainstaluj AVR studio i zamiast się męczyć z widelcem przesiądź się na łyżkę pora wydorośleć bascom jest dla młodzieży na poziomie gimnazjum ... Ja używam asemblera który dla wielu jest za wolny w pisaniu ale w moim przypadku sprawdza się w 101% . Z zabawy z bascomem wyleczyło mnie np. zabawa z KS108 w prawdzie trzeba poświęcić kilka godzin żeby sobie napisać swoją obsługę magistrali 6800 ale jak się to zrobi dobrze można mieć 10 razy szybszy wyświetlacz . I tak jest z wszystkim czego się dotkniesz a na końcu okazuje się że masz 20 kilowy plik z bascoma albo 6 kilo z asemblera
  • #19 14871580
    dondu
    Moderator na urlopie...
    kamyczek napisał:
    ... na końcu okazuje się że masz 20 kilowy plik z bascoma albo 6 kilo z asemblera

    ... co kończy się droższym projektem, bo trzeba brać ATmega128 zamiast np. ATmega8.


    @werewolf15
    Weź sobie do serca co napisał kol. kamyczek oraz to: http://mikrokontrolery.blogspot.com/2011/04/jaki-jezyk-wybrac.html
    i podejmij szybko właściwą decyzję. Mała uwaga Atmel Studio, a nie AVR Studio jak napisał kol. kamyczek - wszystko w spisie treści na w/w stronie.
  • #20 14871632
    Konto nie istnieje
    Konto nie istnieje  
  • #22 14871660
    werewolf15
    Poziom 14  
    Jeśli chodzi o C to poznałem jego podstawy na informatyce na studiach i mam nadzieję że pewnego pięknego dnia przerzucę się na ten język. Na razie jednak chciałbym zakończyć tą sprawę z Bascomem. :ok:

    niveasoft oczywiście miałeś rację i komentarze w mcs.lib zaznaczyłem apostrofami, po poprawieniu odczyt ADC zwiększył się i wynosi 8929razy/sek.
  • #23 14871673
    dondu
    Moderator na urlopie...
    werewolf15 napisał:
    Jeśli chodzi o C to poznałem jego podstawy na informatyce na studiach i mam nadzieję że pewnego pięknego dnia przerzucę się na ten język. Na razie jednak chciałbym zakończyć tą sprawę z Bascomem. :ok:

    Jasne, ale zrób to już od następnego projektu :)
REKLAMA