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

ATtiny2313 - [asm] Generator fali

narki1 09 Lut 2013 20:42 1836 15
  • #1 09 Lut 2013 20:42
    narki1
    Poziom 13  

    Witam
    Chcę zbudować generator fali 36kHz. Doczytałem się ,że mogę wykorzystać tryb CTC.
    Proszę o kilka wskazówek:
    1. Czy dobrze myślę ,że wyjście timera T0 jest na nodze PB2 (14) ?
    2. Chcąc zrobić generator fali muszę:
    - ustawić częstotliwość zegara
    - ustawić toggle mode
    - ustawić preskaler
    Wyliczyłem ze wzoru z dokumentacji ,że potrzebuję częstotliwość zegara:8Mhz, preskaler 8 i wartość licznika 13 ( około 35,7 kHz)
    Na razie fusebitów nie ruszam żeby przestawić zegar ( zrobię to później)
    Teraz asembler:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Efekt: Nic
    Proszę o sprawdzenie czy dobrze ustawiam TCCR0A i OCR0A.
    Spodziewałem się ,że dioda podłączona do PB2 będzie migać ( lub zaświeci).
    Co robię źle ?

    0 15
  • #2 09 Lut 2013 20:52
    excray
    Poziom 39  

    Wow! Gdzie ty się uczyłeś tego asemblera? Bo chyba nie na AVR. Po pierwsze chyba bardzo lubisz pisać bo masz mnóstwo bzdur i bezsensownego bełkotu w kodzie. Po drugie w AVR na sam początek się ustawia wskaźnik stosu. Wie o tym każdy kto napisał choć jeden działający kod.

    0
  • #4 09 Lut 2013 21:33
    excray
    Poziom 39  

    I oczywiście procesor nie można po zakończeniu kodu pozostawić samego sobie. Zazwyczaj się go zapętla aby nie poszedł w jakieś krzaki.

    0
  • #5 09 Lut 2013 21:36
    narki1
    Poziom 13  

    Dalej w programie mam pustą pętlę. Jak timer zadziała to będę pisał dalej program.

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • #6 09 Lut 2013 21:58
    excray
    Poziom 39  

    Zrób porządek ze stosem, ustaw TCCR0B o którym zapomniałeś w kodzie (CS01), pamiętaj o pętli na końcu kodu. Poza tym kodu nie umieszcza się w obszarze wektorów przerwań.

    0
  • #7 10 Lut 2013 10:13
    tmf
    Moderator Mikrokontrolery Projektowanie

    excray napisał:
    Wow! Gdzie ty się uczyłeś tego asemblera? Bo chyba nie na AVR. Po pierwsze chyba bardzo lubisz pisać bo masz mnóstwo bzdur i bezsensownego bełkotu w kodzie. Po drugie w AVR na sam początek się ustawia wskaźnik stosu. Wie o tym każdy kto napisał choć jeden działający kod.


    No właśnie, każdy, kto zatrzymał się w rozwoju swojej wiedzy o AVRach lata temu. A wystarczy zajrzeć do noty, żeby przeczytać, że domyślnie SP w ATtiny2313 jest inicjowany wartością RAMEND, w związku z czym SP nie trzeba inicjalizować. Podobnie jak w każdym nowszym AVR.

    Dodano po 4 [minuty]:

    BTW, timer wypadałoby czymś taktować, a więc wybrać zegar.

    0
  • #8 10 Lut 2013 10:31
    excray
    Poziom 39  

    tmf napisał:
    No właśnie, każdy, kto zatrzymał się w rozwoju swojej wiedzy o AVRach lata temu. A wystarczy zajrzeć do noty, żeby przeczytać, że domyślnie SP w ATtiny2313 jest inicjowany wartością RAMEND, w związku z czym SP nie trzeba inicjalizować. Podobnie jak w każdym nowszym AVR.
    Tylko w takim razie dlaczego inicjuje SP gdzieś w połowie programu.

    0
  • #9 10 Lut 2013 10:35
    tmf
    Moderator Mikrokontrolery Projektowanie

    Akurat w tym programie może sobie SP zainicjować dowolną wartością, bo ten program ze stosu nie korzysta. A dlaczego w połowie, to pytanie raczej do autora?:)

    0
  • #10 10 Lut 2013 10:43
    excray
    Poziom 39  

    tmf napisał:
    Akurat w tym programie może sobie SP zainicjować dowolną wartością, bo ten program ze stosu nie korzysta. A dlaczego w połowie, to pytanie raczej do autora?:)

    To może zaproponujemy mu więcej głupich nawyków skoro program z nich nie korzysta? Pisanie kodu w obszarze wektorów przerwań i ustawianie stosu w połowie programu ma już za sobą, więc może niech wpisuje jeszcze losowe wartości do rejestrów? Będzie super szkoła programowania. Poza tym mógłbyś mi powiedzieć gdzie w nocie Atiny2313 jest informacja że wskaźnik stosu jest już zainicjowany po resecie bo ja nie widzę nigdzie takiej informacji w nocie. Ba na stronie 45 jest informacja że wskaźnik stosu należy jednak inicjować. I zawsze należy go inicjować bo są sytuacje właśnie w kiepskich programach gdzie program dociera do adresu 0 a nie jest to reset.

    0
  • #11 10 Lut 2013 11:07
    tmf
    Moderator Mikrokontrolery Projektowanie

    Jest to w nocie tam gdzie zawsze - AVR CPU Core/Stack Pointer - Initial value.
    O jakich głupich nawykach piszesz? W asemblerze to norma, że program rozpoczyna się w miejsu nieużywanych wektorów przerwań. Bo niby po co zostawiać kilkaset bajtów wolnych? Dla ozdoby? Szczególnie w procku, który ma tylko 2 kB pamięci FLASH.

    0
  • #12 10 Lut 2013 12:14
    narki1
    Poziom 13  

    No tak. Biorąc pod uwagę konstruktywną krytykę poprawiłem program

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Cytat:
    , ustaw TCCR0B o którym zapomniałeś w kodzie (CS01)

    Tutaj nie wiem o co chodzi. Czy TCCR0B trzeba ustawiać jak chcę wykorzystać tylko TCCR0A ?
    Cytat:
    BTW, timer wypadałoby czymś taktować, a więc wybrać zegar.

    Jak wybrać zegar ? Na razie chciałbym użyć wewnętrznego zegara ,który jeżeli dobrze kojarzę jest ustawiony domyślnie na 1Mhz. Potem planuję ustawić na fusebitach wewnętrzny zegar 8Mhz.
    Jeżeli chodzi o tryb CTC. Wpisałem go na początku programu w sekcji deklaracji ponieważ myślałem ,że tryb ten deklaruje się tak jak funkcje portów na początku. Wszędzie piszą ,że jest to sprzętowy generator i nie zajmuje prawie wcale programu stąd moja interpretacja.
    Program ma zmienione wartości:
    Zegar wew. 1Mhz
    Preskaler na 1024
    "Stała czasowa" dla licznika 255 co powinno dać falę o częstotliwości ok. 2Hz. Łatwiej zaobserwować diodę.

    0
  • #13 10 Lut 2013 12:35
    tmf
    Moderator Mikrokontrolery Projektowanie

    Timer musi być czymś taktowany. Nie myl taktowania CPU z taktowaniem peryferii. Jak zaglądniesz do noty i opisu rejestrów timera 0, który wykorzystujesz to po kolei je skonfiguruj tak jak należy i problem zniknie.

    0
  • #14 10 Lut 2013 14:36
    narki1
    Poziom 13  

    Teoretycznie powinno być tak:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    ATtiny2313 - [asm] Generator fali
    FOC0A i FOC0B powinny być ustawione na jedynki dla wave generator. W symulatorze AVR Studio te bity się nie ustawiają.

    0
  • #15 10 Lut 2013 15:50
    tmf
    Moderator Mikrokontrolery Projektowanie

    A po co ruszasz bity FOC? Masz ustawić timer w tryb OCT, skonfigurować wyjścia w TCCR0A i preskaler zegara w TCCR0B. To wszystko.

    0
  • #16 10 Lut 2013 19:55
    narki1
    Poziom 13  

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Czy teraz program wygląda dobrze ?
    Dla tych ustawień dioda na nodze OC0A (PB2) powinna migać z częstotliwością ok. 2Hz . Dioda świeci. Czy trzeba jeszcze sprawdzać i zerować flagę przepełnienia ?

    Dodano po 2 [godziny] 35 [minuty]:

    Działa.
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Teraz tylko jak będę miał oscyloskop to dopasuję dokładnie częstotliwość.
    Pojawia się drugi temat: Jak zrealizować modulację sygnału (włączanie i wyłączanie ) ?

    0