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

Czy attiny2313 obsłuży L293D, RS232, LED, czujniki i 36kHz w Bascom?

treker 25 Cze 2006 20:37 4607 12
  • #1 2763286
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Witam!!!
    Mam 2 pytania
    :arrow: 1. Czy attiny2313 da radę sterować silnikami układem L293D. Wysyłać komunikaty przez rs232(Max232) sterować 2 LED'ami i dwoma czujnikami na raz i do tego generować przebieg prostokątny 36khz (Program ogólnie jest bardzo prosty) . Czy nie będzie się wieszał :?: ( Czy się nie rozwali)
    :arrow: 2. Jak by w Bascomie wyglądało to generowanie przebiegu prostokątnego 36khz :?: Czy ten przebieg może być kierowany na dowolną nóżkę :?: bo mam zajęte Portb 1,2,3,4 i tego nie można zmienić:|
  • Pomocny post
    #2 2763587
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Spokojnie da radę , ale pod warunkiem , że kod zmieści w 2kB.
    36kHz możesz wygenerować sprzętowo na PORTD.5(OC0B) , albo programowo(nie polecam) na dowolnym porcie.

    Piotrek
  • Pomocny post
    #3 2763937
    TheMonter
    Poziom 17  
    Posty: 272
    Pomógł: 10
    Ocena: 8
    Zasadniczo zumek Ci podpowiedział jak mozesz uzyskac 36kHz. Ja jeszcze dodam do Twojej 1), że program się zawiesza/wysypuje jeśli jest źle (błędnie) napisany. Jeśli napiszesz soft w Baskomie to raczej powinien działąć jeśli nie popełnisz karygodnych błędów. Co najwyżej może wolniej działać i wtedy będzie problem z 36kHz, jeśli walczyłbyś w ASM to masz wiele większe szanse na sypanie się softu.

    Pzr.
  • #4 2764098
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Właśnie chodziło mi o to czy nie będzie wolniej działał (Czy się nie "zamuli" :D ) w 2kb sie zmieszczę bez problemu;)

    Cytat:
    36kHz możesz wygenerować sprzętowo na PORTD.5(OC0B)

    Możecie to jakoś dokładniej jestem początkującym naukę o uC zacząłem 1/2 roku temu :| i niezbyt wiele umiem;)


    Pozdrawiam Treker :D
  • #5 2764697
    mikszy5
    Poziom 12  
    Posty: 95
    Ocena: 1
    Mnie też to interesuje jka wygenerwoać ten przebieg prostokątny 36khz spzrętowo jak mówił zumek
  • #6 2765176
    wlamywacz2004
    Poziom 17  
    Posty: 279
    Pomógł: 10
    Ocena: 1
    A może HELP-a zobaczycie i znajdziecie jakieś informację ?
  • #7 2765549
    Holy

    Poziom 14  
    Posty: 155
    Pomógł: 5
    Ocena: 6
    TheMonter napisał:
    ...jeśli walczyłbyś w ASM to masz wiele większe szanse na sypanie się softu.


    Ale przynajmniej wiedziałbyś dokładnie co się dzieje w programie. Ja swoją naukę procków zaczynałem od asemblera. Teraz piszę też w C, ale też nie wszystko. Trzeba umieć dobrać język programowania do powierzonego procku zadania. Na Twoim miejscu pobawiłbym się jednak w asemblerze. Dłużej Ci to zajmie, ale efekt będzie lepszy niż w bascomie.
    Konto firmowe:
    HOLTECH
    Fabryczna 18 lok. U6, Białystok, 15-483 | Tel.: +48XXXXXXXXX (Pokaż) | Strona WWW: www.holtech.eu
  • #8 2765702
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Zyziu mi napisał kod bo nie miał czasu może mi to ktoś wytłumaczyć co do czego:
    $regfile = "attiny2313.dat"
    $crystal = 4000000
    Config Portd.5 = Output
    
    Ocr0b = &H37 'wartość obliczyć tak:$crystal/(36000*2)
    Ocr0a = &H37 'j/w
    Tccr0a = &B00010010
    Tccr0b = 1
    
    Do
    nop
    Loop

    Ocr0b = &H37 'wartość obliczyć tak:$crystal/(36000*2)

    Czy ta wartość musi wynosić 56??
    Ocr0b = &H56 'wartość obliczyć tak:$crystal/(36000*2)


    Najbardziej to nie rozumiem tego momentu
    
    Tccr0a = &B00010010 
    

    Przebieg prostokątny miał być generowany na Portd.5
    Niech mi to ktoś wytłumaczy muszę to mieć do środy :/
    Bardzo proszę o pomoc jest to pilne!!
    Za pomoc mogę się odwdzięczyć kilkoma pkt'ami:D
  • Pomocny post
    #9 2769317
    psooya
    Poziom 38  
    Posty: 5344
    Pomógł: 376
    Ocena: 575
    Witam poporstu generujesz przebieg ze sprzętowego PWMa tylko problem polega na odpowiednim dobraniu kwarcu ja dokąłdnie nie pamietam jak to jest wykonane w bascomnie ale kiedyś pisałem taki program. Zobacz do PDFa na rejestry TCCR0a i bedziesz wiedział jak albo poczytaj w bascom help na temat config PWM . Wzór na F wyjściową z PWMa jest taki częstotliwość kwarcu / prscaler (stopień podziału 1,8,64,256,1024)/510
    z tym że PWM moze prcować w rozdzielczosci 8, 9 , 10 bitów i wartosć 510 jest dla 8 bitów, dla 9 bitów jest 1022, a dla 10 bitów jest 2046
    musisz znaleść dopowiedni kwarc do tego co jest dosć skomplikowane. Mozesz wygenerowć 36 KHz na dowolnym kwarcu który dzieli sie bez reszty przez 36 KHz Na myśl mi przychodzi kwarc 3,57MHz ale moze sa lepsze. Program bedzie wyglądał wtedy coś ala to
    Do
    nop
    nop
    ....
    ....
    reset portx.x
    nop
    nop
    ...
    ...
    set portx.x
    loop
    Oczywiście pętla do loop przy powrcie zajmuje wiecej taktów bo jest to skok. kiedys to kminiłem z kumplem i trzeba było dać kilka nopów (dosć sporo w całym programie ich bedzie bo jeden nop zajmuje 1 takt zegara procka) mniej Jako przykład takie softu podam ten program poniżej . Jak widać kombinacji jest wiele
    Przepraszam za pisownie niemam czasu na poprawe mam sesje i ryje cały dzień i noc Można banować pozwalam (text wiadomo do kogo na tym forum)
    soft jest tu https://www.elektroda.pl/rtvforum/topic414255-30.html#2640840 w pliku stereo. rar powodzenia i przepraszam ze niedam gotowca ale niemam kiedy
  • #10 2770333
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Ok.Dzięki dobre i to. :|
    ...
    Eeee... Dalej nic nie kumam :cry: jednak potrzebuje gotowca:/
  • Pomocny post
    #11 2770684
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    Może spróbuj w ten sposób :
    $crystal = 4000000
    Config Pind.5 = Output  'ustawienie wyjścia na pinie który standardowo sygnalizuje przepełnienie timer-a
    Config Timer0 = Timer , Prescale = 1  'ustawienie timer1 dzielnik 1
    On Timer0 Przerwanie_timer1  'wywołanie przerwania po przepełnieniu timera
    Timer0 = 145  'wartość początkowa od której timer bedzie zliczł impulsy timera
    Enable Timer0
    Enable Interrupts
    Do
     ' główna petla programu, tu dasz to co program powinien robić
    Loop
    Przerwanie_timer1:
      Timer0 = 145   ' ustawienie wartości początkowej
    Return
    

    Nie do końca jestem pewien swoich wyliczeń co do wartości startowej, może niech ktoś mądrzejszy jeszcze to sprawdzi, ale powinno być OK.
    Niestety, nie mam dostępu do oscyloskopu, aby to sprawdzić :( Jeżeli poprawnie wszystko policzyłem, i nic nie namieszałem z kodem :) , sygnał na pinie d5 powinien zmieniać się z częstotliwością 36KHz.

    Kurde ... straszny upał .... mózg mi się przegrzewa .... :)
    I za każdym razem jak to liczę, wychodzi mi zupełnie inny wynik :(
    Niech mnie ktoś poprawi.
    Chodzi o 36 KHz , czyli przebieg zmieniający się co 27,8 uS...
    Przy zegarze 4MHz i preskalerze = 1 , zmieniającym sie co 0,00000025 s tj. 0,25 uS to timer musi się zmienić jakieś 111 razy co nam daje wartość początkową timera 145.
  • #12 2770771
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Wielkie dzięki :) bardzo mi to było potrzebne za kilka dni będę wiedział czy działa, ale faktycznie może ktoś to może wyliczyć DZIĘKI!!
  • #13 2771709
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    OK, myślałem że mnie ktoś wyręczy , ale ... :(
    Dodaję komentarze:
    
    $regfile = "attiny2313.dat"
    $crystal = 4000000
    Config Portd.5 = Output 'musi być ustawiony jako wyjście , by można go podłączyć do przerzutnika OC0B
    
    Ocr0b = &H37 'wartość obliczyć tak:$crystal/(36000*2)
    'Powyższa wartość nie musi być taka jak wychodzi z wyliczenia , ale nie może być większa.
    Ocr0a = &H37 'tyle taktów zegara potrzeba , by timer0 "obracał się" 72000 razy na sekundę.
    Tccr0a = &B00010010 'Włącz tryb CTC dla timer0 i podłącz Pinb.5 do przerzutnika OCR0B w trybie TOGGLE(zmień stan na przeciwny do bieżącego).
    Tccr0b = 1 'preskaler=1i start zliczania timer0
    

    Przy powyższych ustawieniach, timer0 zlicza cykle zegarowe i jeśli rejestr TCNT0=OCR0A , to TCNT0=0 i tak w kółko ;)
    W czasie pracy timer0 , jego rejestr TCNT0 jest także porównywany z OCR0B i jeśli TCNT=OCR0B , to stan Pind.5 zmienia się na przeciwny.
    Żeby wygenerować falę prostokątną 36kHz na Pinb.5 , to stan Pinb.5 musi zmieniać swoją wartość z "0" / "1" 72000 razy na sekundę.Ufff....
    Wystarczyło zajrzeć do dokumentacji i sprawdzić za co odpowiadają bity =1 w TCCR0 , ale pewnie sie nie chciało w ten upał :D

    Piotrek
    PS
    To nie jest jedyny możliwy tryb , do wygenerowania na OC0x jakiejś tam fali.Timery w nowszych AVR-ach mają naprawdę spore możliwości
    Zachęcam do lektury ich dokumentacji.

Podsumowanie tematu

LABEL_AI_GENERATED
Attiny2313 jest w stanie sterować silnikami za pomocą układu L293D, komunikować się przez RS232 (z wykorzystaniem MAX232), kontrolować dwie diody LED oraz dwa czujniki jednocześnie, a także generować przebieg prostokątny o częstotliwości 36 kHz, pod warunkiem, że program mieści się w pamięci 2 kB i jest poprawnie napisany, np. w Bascomie. Generowanie sygnału 36 kHz najlepiej realizować sprzętowo na pinie PortD.5 (OC0B) z wykorzystaniem trybu CTC timera 0 i przerzutnika OCR0B, co pozwala na stabilne i efektywne uzyskanie wymaganej częstotliwości. Wartości rejestrów OCR0A i OCR0B należy obliczyć według wzoru: częstotliwość kwarcu podzielona przez (2 * 36000). Preskaler timera powinien być ustawiony na 1. Przebieg prostokątny generowany sprzętowo jest bardziej stabilny niż programowy, który jest mniej zalecany. Pin generujący sygnał musi być skonfigurowany jako wyjście. W Bascomie konfiguracja timerów i pinów odbywa się przez odpowiednie dyrektywy i rejestry, np. TCCR0A, TCCR0B, OCR0A, OCR0B. Programowanie w asemblerze może dać lepsze efekty, ale Bascom jest wystarczający dla początkujących, jeśli kod jest dobrze napisany. W przypadku zajętych pinów PortB 1-4, PortD.5 jest rekomendowany do generowania sygnału PWM 36 kHz. Wartość startowa timera i konfiguracja przerwań pozwalają na generowanie sygnału w przerwaniu timera. Dobór odpowiedniego kwarcu jest istotny dla precyzyjnej częstotliwości sygnału; kwarc 4 MHz jest często stosowany, ale inne częstotliwości dzielące się bez reszty przez 36 kHz również mogą być użyteczne. Program powinien być zoptymalizowany, aby nie przekroczyć limitu pamięci i zapewnić stabilną pracę mikrokontrolera.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA