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

Linia opóźniająca na AVR + Bascom

02 Sty 2008 11:07 1079 3
  • Poziom 10  
    Witam

    Jak rozwiązać następujący problem:
    Robię urządzenie wykonujące jakieś operacje na prostokątnym sygnale wejściowym i przetworzony sygnał wystawiam na jednym z portów.
    Używam AVR 8515, sygnał wejściowy podaję na oba wejścia przerywające, liczę zbocza, obrabiam w programie sygnał i wyrzucam na port. Sygnał wyjściowy opóźniony jest więc tylko o czas przetwarzania.

    Potrzebuję mieć sygnał wyjściowy opóźniony względem wejściowego o konfigurowalną wartość czasu z przedziału 0-50ms z krokiem 1ms.
    Myślałem zrobić jakiś rejestr przesuwny wyzwalany przerwaniem timera co 1 ms do którego ładował bym obrobiony sygnał. Zmiana opóźnienia odbywałaby się poprzez zmianę bitu rejestru przesuwnego z którego będę wystawiał sygnał wyjściowy.
    Napisałem kawałek kodu w bascomie ale nie chce działać jak należy.

    Może ma ktoś jakąś gotową receptę na ten problem lub podpowie inne rozwiązanie?

    Generalnie, jak dobrze zbudować w bascomie 50-bitowy rejestr przesuwny?

    Taktowanie procka: 8MHz
    Czestotliwość sygnału wej: 1-2kHz
  • Poziom 18  
    Witaj.
    50 bitów - potrzebujesz 8 bajtów pamięci, a byłoby szybciej, gdybyś miał na wyłączność 8 rejestrów.
    Ustawiasz wskaźnik Carry na taką wartość, jaką ma opóźniany bit, do danego rejestru wrzucasz 1-szą komórkę pamięci, robisz ROL na rejestrze, wrzucasz rejestr do pamięci, do danego rejestru wrzucasz 2-gą komórkę pamięci, robisz ROL na rejestrze, wrzucasz rejestr do pamięci itd aż przetworzysz te 8 bitów.
    Tę operację zrób sobie przy pomocy wstawki asemblerowej w Bascomie.
    Pozdrowienia - teedd
    P.S. mam nadzieję, że właściwie rozumiem instrukcję ROL. W razie czego proszę o "naprostowanie" mnie. Jak znajdę chwilkę czasu, to sprawdzę to w praktyce.

    P.S.1 Działa.
  • Poziom 10  
    No ok rozumiem pomysł, powinno zadziałać samo przesuwanie.
    Wystarczy 7 bajtów (7x8=56)

    Jak zapewnić sobie w Bascomie te 7 rejestrów na wyłączność?
    Tzn jak sprawić żeby we wstawce asm. nie skasować czasem jakiejś bascomowej zmiennej?

    A jeśli sie nie da w rejestrach, to do których komórek pamięci zapisywać skladowe bajty rejestru żeby nie nadpisać jakiejś zmiennej.

    Jak już to ruszy to jak zbudować taktowanie tego rejestru przesuwającego co 1ms? Bo wydaje mi sie ze tu mam jakiś problem z timerami którego nie moge przeskoczyć?
  • Poziom 18  
    Witaj.
    W helpie nie jest napisane wprost (nie zauważyłem), że Bascom nie używa konkretnych rejestrów - więc nie ma co na to liczyć. Ale tutaj mogą się wypowiedzieć bardziej doświadczeni koledzy.
    Jeśli chodzi o rezerwację konkretnych bajtów w pamięci, to możesz to zrobić tak:
    Dim Komorka_zarezerwowana as Byte at $60

    Zrobisz sobie przerwanie co 1ms, a w nim wrzucisz jakiś rejestr na stos, pobierzesz po kolei zawartości komórek i zrobisz ROL (tak jak wcześniej pisałem) i wrzucisz je z powrotem do pamięci. Potem, w zależności od zdefiniowanego opóźnienia, pobierzesz odpowiedni bajt i bit i wystawisz go na jakieś wyjście portu. Ściągniesz zawartość stosu do rejestru i powrócisz z przerwania.
    Pozdrowienia - teedd