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

Jak obsłużyć impulsator 120kHz w BASCOM AVR z wstawką asemblerową?

Roburr 09 Maj 2006 20:56 5416 15
REKLAMA
  • #1 2609535
    Roburr
    Poziom 21  
    Posty: 550
    Pomógł: 1
    Ocena: 15
    Moim zadaniem jest obsłużyć impulsator pracujący przy dość dużych częstotliwościach. Wszystko jest dobrze do częstotliwości kilku kiloherców a ja muszę zbudowac urzadzenie pracujace z częstotliwościami dochodzącymi do 120kHz. Można by pewnie napisać to w assemblerze ale nie wiem jak podejrzeć Bascoma, z których zasobów korzysta i jakich rejestrów mogę używać by umieścić w kodzie wstawkę asemblerową. Kod odpowiedzialny za jego obsługę impulsatora umieszczam ponizej:


    Do 'poczatek petli glownej
    If I1 = 1 And I2 = 1 Then 'impulsator w pozycji - zwarte
    Af = 1
    End If

    If I1 = 0 And I2 = 0 Then
    Af = 0
    End If


    If I1 = 0 And I2 = 1 Then
    If Af = 1 Then
    Do
    If I2 = 0 Then Exit Do
    If P2.1 = 0 Then
    Gosub Zmien_krok
    End If
    Loop
    Gosub Czestotliwosc_zwieksz

    Else
    Do
    If I1 = 1 Then Exit Do
    If P2.1 = 0 Then
    Gosub Zmien_krok
    End If
    Loop
    Gosub Czestotliwosc_zmniejsz
    End If
    End If


    If I1 = 1 And I2 = 0 Then
    If Af = 1 Then
    Do
    If I1 = 0 Then Exit Do
    If P2.1 = 0 Then
    Gosub Zmien_krok
    End If
    Loop
    Gosub Czestotliwosc_zmniejsz

    Else
    Do
    If I2 = 1 Then Exit Do
    If P2.1 = 0 Then
    Gosub Zmien_krok
    End If
    Loop
    Gosub Czestotliwosc_zwieksz
    End If
    End If

    Loop

    Prosze o wszelkie podpowiedzi które spawią że kod będzię działał o wiele sprawniej, lub proszę o podpowiedż w sprawie zajmowanie zasobów przez BASCOMa i odpowiednie używanie wstawek asemblerowych. Układ pracuej z kwarcem 8MHz i wolałbym tego nie zmieniać z pewnych względów. Będę wdzięczny za wszelkie podpowiedzi.
  • REKLAMA
  • #2 2609872
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Roburr napisał:
    ... Można by pewnie napisać to w assemblerze ale nie wiem jak podejrzeć Bascoma, z których zasobów korzysta i jakich rejestrów mogę używać by umieścić w kodzie wstawkę asemblerową.

    1)"Zasoby" Bascoma , możesz sobie podejrzeć w AVRStudio.
    2)"Zasoby" , z których będziesz korzystał w asm , możesz zachować na stosie , a potem odtworzyć.
    3) Itp.

    Piotrek
  • #3 2610004
    ZbeeGin
    Poziom 39  
    Posty: 4318
    Pomógł: 602
    Ocena: 452
    Owszem, tak jak pisze zumek. Dodatkowo jednak wyłączaj przerwania - jeśli są używane, bo jak w Twoją procedure wejdzie przerwanie, to może Ci zniszczyć parę rejestrów. Oto prolog procedury obsługi przerwania:
    13:       _t0_isr:
    +00000026:   920F        PUSH    R0
    +00000027:   921F        PUSH    R1
    +00000028:   922F        PUSH    R2
    +00000029:   923F        PUSH    R3
    +0000002A:   924F        PUSH    R4
    +0000002B:   925F        PUSH    R5
    +0000002C:   927F        PUSH    R7
    +0000002D:   92AF        PUSH    R10
    +0000002E:   92BF        PUSH    R11
    +0000002F:   930F        PUSH    R16
    +00000030:   931F        PUSH    R17
    +00000031:   932F        PUSH    R18
    +00000032:   933F        PUSH    R19
    +00000033:   934F        PUSH    R20
    +00000034:   935F        PUSH    R21
    +00000035:   936F        PUSH    R22
    +00000036:   937F        PUSH    R23
    +00000037:   938F        PUSH    R24
    +00000038:   939F        PUSH    R25
    +00000039:   93AF        PUSH    R26
    +0000003A:   93BF        PUSH    R27
    +0000003B:   93CF        PUSH    R28
    +0000003C:   93DF        PUSH    R29
    +0000003D:   93EF        PUSH    R30
    +0000003E:   93FF        PUSH    R31
    +0000003F:   B78F        IN      R24,0x3F
    +00000040:   938F        PUSH    R24
    .....
    

    Jak widać nie wyszstkie rejestry ląduja na stos.

    Jedno jest pewne. Nie możesz używać R6 (status programu), Y (stos SoftStack), R24 (rej. tymczasowy). O ile używać będziesz zmiennych Single lub też stałych ułamkowych to nie używaj R12..15.

    Druga sprawa, to czy AVR z kwarcem 8MHz będzie wogóle mógł obsługiwać impulsator z taką częstotliwością, biorąc pod uwagę wszystkie elementy programu i sterowanego urządzenia?
  • #4 2610443
    Roburr
    Poziom 21  
    Posty: 550
    Pomógł: 1
    Ocena: 15
    Przerwań nie moge wyłaczyć gdyż w oparciu o nie realizuje odmierzanie czasu potrzebne po to by co 0,5ms zapisać liczbę zliczonych obrotów do wewnętrznej pamięci mikrrokontolera. Rozumiem że pracując w BASCOM AVR nie ma raczej alternatywnych rozwiązań(oprócz wstawek asemblerowych), które przyśpieszyły by prace tego modułu? Przy kwarcu 8MHz cykl maszynowy dla pojedyńczej instrukcji wynosi 125ns co teoretyczne pozwaloałoby odczytać częstotliwośc 100kHz gdyby łaczna ilość cyki maszynowych potrzebna do obeserwacji i zapisania jednego obrotu była mniejsza niż 80. Niestety jezyki wysokiegoo poziomu psują mam wydajność systemu...
  • REKLAMA
  • #5 2611854
    morph13
    Poziom 25  
    Posty: 987
    Pomógł: 25
    Ocena: 32
    Roburr napisał:
    ..... Rozumiem że pracując w BASCOM AVR nie ma raczej alternatywnych rozwiązań(oprócz wstawek asemblerowych), które przyśpieszyły by prace tego modułu? ...


    I to jest słuszne stwierdzenie !!!!

    Następna sprawa to obsługa impulsatora. Zakładam, że impulsator jest 2 (dwu) wyjściowy i pomijam ile ma pinów wspólnych. Najprostrza i najskuteczniejsza metoda to oczywiście asembler i taka oto zasada.

    Sprawdzasz czy na 1 (pierwszym) pinie jest 0 jeśli nie to czekasz w pętli. Jeśli jest to wtedy zapisujesz do znacznika C (dla 51) lub T dla AVR stan pinu 2 (drugiego wyjścia) a nastepnie czekasz aż stan pinu 1 znowu osiągnie 1. Nastepnie określasz kierunek. Jeśli C lub T miało wartośc 0 to obrót w prawo a jesli 1 to obrót w lewo (to przykład). Proste i efektywne. Kilkanascie instrukci asemblera plus instrukcje zachowania na stosie "waznych rejestrów". Brak instrukcji (procedur) "wytłumiania drgań styków".

    Powodzenia.
    I pamietaj, od asemblera czasami się nie ucieknie.
  • #6 2611993
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Witam.

    Mozesz sprobowac wykorzystac dodatkowo - jako uklad posredniczacy miedzy np enkoderem ,a uC jakis licznik np kwadratury. Wtedy do uC wysylasz dane w postaci ilosci impulsow,a sama kwestia ich zliczania zajmuje sie ten dodatkowy uklad. Bedziesz mial pewnosci ze impulsy beda dobrze zliczone i odciazysz uC.
  • REKLAMA
  • #7 2613826
    ucy74
    Poziom 20  
    Posty: 539
    Pomógł: 22
    Ocena: 10
    adamusx napisał:
    ...Mozesz sprobowac wykorzystac dodatkowo - jako uklad posredniczacy miedzy np enkoderem ,a uC jakis licznik...
    Jeden 7400 ustalający czy dodajemy czy odejmujemy, oraz cztery 74193 pozwalają Ci zliczyć dwubajtową wartość. Jeśli do tego dodasz nastawniki BCD, to możesz jeszcze kożystać z sygnału resetującego licznik z enkodera - będzie wtedy liczył do lub od zadanej wartości. Dane, przez zatrzaski, możesz czytać jednym AT89c2051 z kilku takich liczników...

    BTW: W której pamięci wewnętrznej zapisujesz dane przez 0,5ms? W EEPROM'ie? A co się wtedy dzieje ze zliczaniem z enkodera?
  • #8 2614528
    morph13
    Poziom 25  
    Posty: 987
    Pomógł: 25
    Ocena: 32
    ucy74 napisał:
    ....Jeden 7400 ustalający czy dodajemy czy odejmujemy, oraz cztery 74193 pozwalają Ci zliczyć dwubajtową wartość. Jeśli do tego dodasz nastawniki BCD, to możesz jeszcze kożystać z sygnału resetującego licznik z enkodera - będzie wtedy liczył do lub od zadanej wartości. ....

    Idąc dalej w domniemaniach ...... ten cały zestaw o którym wspomniał ucy74 to możesz zastąpić uładem logiki programowalnej typu ATF16V8 z Atmela. Tylko zadaj sobie sam pytanie czy warto i czy obsługa programowa impulsatora nie rozwiąże Twoich prob;emów.
  • #9 2614863
    Roburr
    Poziom 21  
    Posty: 550
    Pomógł: 1
    Ocena: 15
    Nie nie, podpinanie jakiejkolwiek logiki do układu z Atmega8 jest rozwiązaniem może skutecznym ale śmiesznym. Na pewno da się to zdobić porgramowo. Muszę się tylko wgryźć nieco w asemblera AVRów bo do tej pory miałem do czynienie z asemblerem procków z serii '51. Dzięki za wszelkie uwagi. No chyba że ktoś już napisał taka procedurkę w asm to byłbym wdzięczny za jej umieszczenie tutaj. Mam dużo spraw na głowie i nie mogę się zajmować wszystkim na raz... Jeszcze raz dziękuje za wszelkie uwagi.
  • #10 2616000
    Marek81
    Poziom 19  
    Posty: 367
    Pomógł: 6
    Ocena: 8
    ATmega8 posiada trzy liczniki/timery, z których dwa (T0 i T1) mają możliwość zliczania zewnętrznych impulsów, dołączanych do pinów 6 i 11.
    Wg atmelowskiego pdf'a częstotliwość zliczanych impulsów nie może być wyższa niż połowa częstotliwości zegara ATmegi. Dla bezpieczeństwa i zapewnienia prawidłowej synchronizacji podają wartość fclk/2.5 - co w Twoim przypadku daje 8MHz/2.5=3.2MHz.
    Sprawa jest prosta przy impulsatorze z jednym ciągiem impulsów - po prostu je zliczasz, ale gdy masz dwa ciągi przesunięte w fazie, to konieczny jest jednak zewnętrzny układ antykoincydencjalny, aby zliczać impulsy tylko w jednym kierunku.

    Pozdrawiam.
  • #11 2616408
    ucy74
    Poziom 20  
    Posty: 539
    Pomógł: 22
    Ocena: 10
    morph13 napisał:
    ...zadaj sobie sam pytanie czy warto i czy obsługa programowa impulsatora nie rozwiąże Twoich prob;emów...
    Robiłem licznik na AT90s2313 podkręconym do 12 - 18MHz, liczyłem assemblerem. Impulsator dający 10000 impulsów gubił się przy prędkości powyżej jednego obrotu na sekundę, a założeniem jest zdaje się, zliczanie impulsów z częstotliwością 120kHz. Oczywiście, w układ PGA można wpakować znacznie więcej liczników zbudowanych na TTL'ach niż opisałem...
  • REKLAMA
  • #12 2618633
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Proponuje zastosowac uklad LS7660 ( nie do konca jestem pewien tej nazwy ) - masz sprawe ze zliczaniem zalatwiona poza uC, poza tym mozesz osiagnac znacznie wieksze prednosci niz 100Khz
  • #13 2618798
    morph13
    Poziom 25  
    Posty: 987
    Pomógł: 25
    Ocena: 32
    Roburr napisał:
    ..... Na pewno da się to zdobić porgramowo....

    Hmmmm, można pokusić się o implementację programowa zliczania (pisałem o metodzie wyżej) i wtedy sprawdzić maksymalne osiągi procesora lub niestety może okazać sie, że nie bedzie wyjścia i bez "uładu dodatkowego" a mysle tu o QEP - Quadrature Encoder Pulse (standardowo implementoany w DSP i niektórych prockach) raczej sie nie obedzie.
    Mozna jeszcze zbudować układ antkoincydencyjny (kolene scalaki) jak proponował Marek81 i zaprząc do zliczania dwa liczniki z AVR-a a następnie porównywać ich zawartść przez co można okreslić kierunek i ilość obrotów (impulsów).
    Poprostu AVR-y niemaja QEP i tyle. A jeśli metoda programowa jednak się nie sprawdzi nie pozostanie nc innego jak tylko "dodatkowa dobudówka w postaci scalaka" i po raz kolejny podkresle gdyby do tego doszło to jedyne sensowne rozwiązanie to Logika Programowalna np. z FLASH-em (dowolna konfiguracja pinów !!!).
  • #14 2619080
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Po co tak kombinowac i jeszcze sie bawic w uklad programowalny....
    LS7166 i masz sprawe zalatwiona! Predkosc... max 25Mhz chyba powinno wystarczyc?
    http://www.lsicsi.com/pdfs/LS7166.pdf - wejdz i poczytaj

    pozdrawiam
  • #15 2619226
    morph13
    Poziom 25  
    Posty: 987
    Pomógł: 25
    Ocena: 32
    adamusx - ja nie jestem z natury przekornym człowiekiem i wierzę, że masz jak najlepsze intencje i przemawia przez Ciebie praktyka, ale właśnie dlatego, że zadałem sobie odrobinę trudu i przejrzałem tą notę nadal jako "scalak dodatkowy" polecam logikę - jeśli jednak zajdzie taka ostatecna konieczność.
    Kosć która proponujesz ma naprawdę spore możliwości ale gość nie leci w kosmos ze swoim impulsatorem. A dodatkowo w logike może jeszcze coś zaimplementować np dekoder adresowy co w przypadku mini-systemu jak znalazł.

    Jeśli jednak autor pytania nadal upierał sie bedzie, że musi to załatwić droga programową to trzeba szukać innego rozwiązania. Być może zmiana typu implulsatora biorąc pod uwage zmniejszenie ilości "kroków" na obrót a wtedy AVR zacznie się wyrabiać ze zliczaniem. Nie wszystkie projekty wymagaja 1000 imp/obr.
  • #16 2623301
    jacobsek
    Poziom 22  
    Posty: 419
    Pomógł: 61
    Ocena: 24
    Witam.
    Przeglądam właśnie dyskusję.
    Kolega Ucy74 słusznie zwrócił uwagę na coś co zostało pominięte w ferworze waliki z impusami,jak zauważyłeś ma być niby robiony zapis do pamięci ale nie przez 0,5 mS tylko co 0,5ms..... a to juz jeśli chodzi faktycznie o eeprom makabra,biorąc pod uwagę czas samego zapisu do eeproma no i biorąc pod uwagę jego żywotność,mam nadzieję że codzi o inny rodzaj zapisu?
    pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy obsługi impulsatora pracującego z częstotliwością do 120 kHz w środowisku BASCOM AVR z wykorzystaniem wstawek asemblerowych. Problemem jest ograniczona wydajność kodu w języku wysokiego poziomu oraz konieczność zachowania przerwań, które służą do odmierzania czasu i zapisu liczby impulsów co 0,5 ms. Zalecane jest stosowanie asemblera dla efektywnej obsługi impulsatora, z zachowaniem rejestrów na stosie i wyłączaniem przerwań w krytycznych fragmentach kodu. Proponowane metody obejmują prostą logikę sprawdzania stanów pinów impulsatora i określania kierunku obrotu na podstawie stanu drugiego pinu. Alternatywnie sugerowano użycie zewnętrznych układów liczników kwadraturowych lub programowalnej logiki (np. ATF16V8) do odciążenia mikrokontrolera. Wskazano także na możliwość wykorzystania wbudowanych liczników/timerów ATmega8 do zliczania impulsów z ograniczeniem do połowy częstotliwości zegara (około 3,2 MHz przy 8 MHz kwarcu). Wskazano na gotowe scalaki, takie jak LS7166, które mogą zrealizować zliczanie impulsów z dużą prędkością, eliminując konieczność skomplikowanego oprogramowania. Poruszono również kwestie zapisu danych do pamięci wewnętrznej mikrokontrolera, podkreślając, że zapis do EEPROM co 0,5 ms jest niepraktyczny ze względu na czas zapisu i trwałość pamięci. Podsumowując, najlepszym rozwiązaniem jest zastosowanie asemblera do obsługi impulsatora lub wykorzystanie dedykowanych układów zewnętrznych do zliczania impulsów, aby sprostać wymaganiom częstotliwości 120 kHz.
Wygenerowane przez model językowy.
REKLAMA