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

[atmega8][ Bascom]ultradźwięki.

janbernat 31 Sie 2009 21:53 2647 12
REKLAMA
  • #1 6966034
    janbernat
    Poziom 38  
    Napisałem sobie taki programik:

    
    $regfile = "m8def.dat"
    
    $crystal = 8000000
    'Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 , Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5
    
    Config Portb = Output
    
    Enable Interrupts
    Ocr2 = 103
    Tccr2 = 25
    
    Enable Oc2
    On Oc2 Licz
    
    Dim Paczka As Byte
    Paczka = 0
    
    Do
    
    Loop
    End
    
    Licz:
     Incr Paczka
     If Paczka <= 20 Then
          Toggle Portb.4
          Elseif Paczka < 255 Then
          Reset Portb.4
          Else
          Paczka = 0
    
       End If
    
    
    Return
    


    Ma on wysyłać stały sygnał ok. 40kHz z procesora na układ ST232 lub podobny.
    I wysyła-ok. 40kHz.
    Ale na drugie wejście tego układu ma wysyłać paczki impulsów.
    No i też wysyła.
    Ale ok. 30.6kHz one mają.
    Są wysyłane w paczkach po 10.
    Co ok. 4.3ms
    Ale one mają 30.6 kHz i za diabła nie chcą mieć 40kHz.
    Zmieniałem ocr2 i nic.
    Częstotliwość sygnału się zmieniała- a sygnał z przerwania dalej 30.6kHz.
    Jak uzyskać częstotliwość sygnału paczek impulsów ok. 40kHz?
    Na częstotliwości sygnału stałego mi nie zależy-to będzie tylko do zasilania.
  • REKLAMA
  • #2 6967834
    pmmisiek
    Poziom 15  
    Witam,

    Jak już wcześniej pisałem:

    Najprościej jak się da, nie używając timerów można umieścić poniższy ciąg instrukcji w pętli, która wykona się określoną ilość razy (tyle ile chcesz wysłać paczek) a następnie program przejdzie dalej

    Set Portb.4
    Waitus 13
    Reset Portb.4
    Waitus 13



    Nie jest to dokładnie 40kHz (38,4kHz) ale do nadajnika ultradźwięków się nadaje. Przetestowałem to kiedyś i działało ok.

    Pozdrawiam
  • Pomocny post
    #3 6967915
    szelus
    Poziom 34  
    Obstawiam, że się BASCOM nie wyrabia z obsługa przerwań co 13us. Ale na BASCOM-mie się nie znam.

    4.3ms daje przerwanie co ca. 16us, co by się zgadzało z obserwowaną czestotliwością ok. 30kHz.
  • REKLAMA
  • #4 6969122
    janbernat
    Poziom 38  
    szelus:
    Rzeczywiście się nie wyrabia.
    emarcus mi to ładnie wyliczył- ale Jego post został przeniesiony do kosza(chyba sam przeniósł-nie rozumiem dlaczego).
    Dałem obsługę przerwania z opcją "nosave"-nic nie zapisuje na stosie.
    I teraz się wyrabia -64 takty mniej.
    Ale to rozwiązanie bardzo mi się nie podoba.
    Bo w tym programie się sprawdza -ale co będzie gdy program się rozbuduje?
    Dałem też w przerwaniu tylko incr paczka a obsługę w głównej pętli- jakieś potworności pojawiły mi się na oscyloskopie.

    Dalej nad tym muszę popracować.

    pmmisiek:
    Poleceń wait lub delay to ja używam w skrajnej desperacji albo z lenistwa- gdy coś muszę szybko sprawdzić.
    Tego nie może być później w programie.
    Kilka nop można jeszcze ostatecznie tolerować- więcej nie.
  • REKLAMA
  • Pomocny post
    #5 6970766
    robiw
    Poziom 26  
    Witaj,
    No save spokojnie możesz użyć.... pod warunkiem, że nie korzystasz w obsłudze przerwania z instrukcji Bascoma bo jeśli tak to nie odkładając rejestrów na stos, zgubisz ich wartości i w najlepszym przypadku będą się działy różne rzeczy. Ja bym napisał wstawkę w asemblerze odkładając wcześniej na stos używane rejestry w tym SREG. Możesz też użyc jednego Timera do generowania 40kHz, jego wyjście podłączyć do drugiego Timera pracującego jako licznik zliczający impulsy zewnętrzne. Temu drugiemu Timerowi ustawić TCNT na max-10 i skorzystać z przerwania po przepełnieniu licznika OVF, które wyłączy Timer generujący 40 kHz. Tak uzyskasz paczkę 10 impulsów o f=40 kHz, jeśli dobrze Cię zrozumiałem...robiw
  • Pomocny post
    #6 6970845
    szelus
    Poziom 34  
    64 takty to o połowę krócej. :) W każdym razie, rzeczywiście obsługa tego przerwania w asemblerze powinna się spokojnie zmieścić poniżej 2us.

    Ewentualnie można jeszcze dodać bramkę AND sterowaną z drugiego timera i załatwić to sprzętowo.
  • #7 6972711
    janbernat
    Poziom 38  
    robiw, szelus:
    Ale rozrzutni jesteście z tymi timerami.
    Ale dzięki za pomoc.
    Docelowo to ma być na attiny2313 z dwoma timerami - a ten drugi będzie potrzebny do mierzenia czasu pomiędzy wysłaniem paczki impulsów a odbiorem sygnału odbitego od przeszkody.
    attiny2313 ma trzy rejestry uniwersalne GPIOR "ukryte" między innymi rejestrami i docelowo zamierzam użyć jednego z nich.
    I wtedy zamiast "incr paczka" będzie "incr GPIOR0".
    Mam nadzieję że Bascom tam nie zagląda.
    Na razie popełniłem następną wersję kodu.
    Zgodnie z teorią w przerwaniu "nosave" umieszczam tylko incr paczka a resztę w pętli głownej.
    Coś chodzi ale pojawia się jeden impuls i drugi niestabilny.
    Pewnie znowu jakiś błąd w rozumowaniu.
    Oto kod:

    
    $regfile = "m8def.dat"
    
    $crystal = 8000000
    'Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 , Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5
    
    Config Portb = Output
    
    Enable Interrupts
    Ocr2 = 103
    Tccr2 = 25
    
    Enable Oc2
    On Oc2 Licz Nosave
    
    Dim Paczka As Byte
    Paczka = 0
    Dim Temp_paczka As Byte
    Temp_paczka = 0
    Do
    If Paczka <= 10 And Temp_paczka = Paczka Then
          Toggle Portb.4
          Temp_paczka = Paczka
          Elseif Paczka < 255 Then
          Reset Portb.4
          Else
          Paczka = 0
    
       End If
    Loop
    End
    
    Licz:
     Incr Paczka
    
    
    
    Return
    


    Może szybciej znajdziecie głupotę w kodzie niż ja.
  • REKLAMA
  • #8 6973412
    robiw
    Poziom 26  
    Incr Paczka także korzysta z jakiegoś rejestru, którego Ty nie odkładasz przed wejściem do procedury ISR i zdejmujesz po wyjściu - ot cała "głupota" ;-). Przy No save nie używamy instrukcji Bascoma, chyba, że odłożymy odpowiednie rejestry na stos...robiw

    PS.
    Skasuj End po Loop, potrafi trochę nabroić ;-)
  • #9 6977258
    janbernat
    Poziom 38  
    Na razie skorzystałem z rozwiązania "siłowego".
    Dałem zewnętrzny kwarc 16MHz.
    Całość obsługi w przerwaniu bez "nosave".
    Czyli odkłada na stos i zdąży przy 16 MHz.
    A nie wiem czy odkładanie na stos w asm w przerwaniu zajmie dużo mniej czasu.
  • #10 6977451
    robiw
    Poziom 26  
    janbernat napisał:

    A nie wiem czy odkładanie na stos w asm w przerwaniu zajmie dużo mniej czasu.

    Jasne, że mniej bo odłożysz powiedzmy SREG i jakiś rejestr "użytkowy" a nie 24 sztuki jak to robi Bascom :-)... robiw
  • #11 6977740
    janbernat
    Poziom 38  
    No dobrze.
    Asm to ja się chyba nie zdążę nauczyć.
    Ale jak napisałem docelowo to będzie na Attiny2313 z wykorzystaniem rejestrów GPIOR -do których jak sądzę Bascom nie sięga z powodu swej uniwersalości.
  • #13 6981580
    janbernat
    Poziom 38  
    Jako nałogowiec książek mam obydwie książki.
    I Pawłowskiego też.
    Ale jak napisałem- chyba się tego wszystkiego nie zdążę nauczyć.
REKLAMA