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

Przesiadka z 51 na AVR - trudne początki

Virus500 18 Cze 2011 14:03 1854 6
REKLAMA
  • #1 9626018
    Virus500
    Poziom 11  
    Do tej pory troszkę bawiłem się AT89C2051. Wykonałem pewien układzik który za pomocą Timera0 zliczał impulsy na wejściu T0 podczas 1sekundy którą odmierzałem Timerem1. Jako, że musiałem przeprogramować 51 do innych celów chciałbym go zastąpić Attiny2313 bo mam dwie sztuki. Zacząłem czytać książkę Dolińskiego aby wykonać program ale mam pewne problemy. Na razie piszę go na AVR Studio i testuję na symulatorze. Widzę, że jest parę nieścisłości z którymi nie bardzo mogę sobie poradzić:
    - mam ciągle przerwanie na Int0 i nie wiem dlaczego
    Przy okazji to jak np na portb,6 odczytać wartość komparatora za pomocą diody led - wiem że to rejestr ACO ?
    Poniżej moje bazgroły
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Jakby komuś się chciało napisać gdzie są błędy i co robię nie tak to śmiało pisać.
  • REKLAMA
  • #2 9628355
    Krauser
    Poziom 26  
    1. Nie ustawiasz bitów w MCUCR co powoduje, że przerwanie jest generowane dopóki na wejściu jest poziom niski.
    2. Nie warto stosować konstrukcji typu 0b11111100, bo po pierwsze łatwo sie pomylić a po drugie utrudnia to analizę kodu. Nazwy bitów jednak coś mówią.
    3. Przed zapisem należałoby odczytać dany rejestr, bo przy złożonych programach można sobie coś później popsuć przypadkiem zerując jakiś bit. Po odczytaniu należy użyć ORI lub ANDI i zapisać.
    4. Co do komparatora to należy używać instrukcji skoku jeśli bit jest ustawiony.
  • REKLAMA
  • #3 9628481
    Virus500
    Poziom 11  
    Krauser napisał:
    1. Nie ustawiasz bitów w MCUCR co powoduje, że przerwanie jest generowane dopóki na wejściu jest poziom niski.

    Chciałem aby przerwanie było aktywowane stanem niskim dlatego ustawiłem portd w stan wysoki a MCUR nie ruszałem. Zauważyłem, że pomimo ustawienia stanu wysokiego w symulatorze na pind i tak panuje stan niski. Co do punktu 2 myślałem, że tak będzie czytelniej ale jeśli można to zrobić lepiej to prosiłbym o przykład. Punkt 3 to nie bardzo skumałem więc jakby napisać której linijki się to tyczy może byłoby mi łatwiej. Jeśli chodzi o komparator to znalazłem jakieś rozwiązanie ale czy właściwe ? Poniżej ponownie kod po zmianach.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    W pierwszej wersji odczytywałem impulsy z rejestru TCNT0 ale zauważyłem, że odczytuje tylko część, więc w drugiej wersji podałem adres do odczytu. Pewnie można zrobić to lepiej. No i pewnie to drobnostka ale jak np zrobić aby w tym przerwaniu co 1s na przemian zapalała się dioda czyli 1s zgaszona a potem 1s zapalona. W 51 było to proste, wystarczyła funkcja CPL czyli negacji bitu której jakoś nie widzę w AVR.
  • REKLAMA
  • #4 9634683
    Krauser
    Poziom 26  
    1. Zauważ, że jeśli ustawisz generowanie przerwania od opadającego zbocza to po pojawieniu się stanu niskiego przerwanie zostanie wygenerowane tylko jeden raz.
    2 i 3. Może do ustawiania portów to ma sens choć i tak lepsze będzie ldi r16,(1<<pb7)|(1<<pb6), ale na pewno nie do rejestru gimsk. Od razu dam przykład jak nie zmienić bitów które nas nie interesują.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    w takim przypadku bit PCIE nie zostanie zmieniony np. przypadkiem wyzerowany i nie muszę pamiętać jaka jest jego wartość
    5. Używasz przerwań a nie ustawiłeś stosu. Dodaj zaraz po resecie:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    6. Dla starego at2313 można zrobić taką procedurę:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    podaje to bo może się przydać, ale do negacji bitu w porcie wystarczy dla attiny2313 wpisać jedynkę do rejestru pin
    Kod: text
    Zaloguj się, aby zobaczyć kod

    7. Do takich różnych operacji z wykorzystaniem przerwań wygodnie jest zrobić sobie z jednego rejestru flagi i nimi się posługiwać
    Kod: text
    Zaloguj się, aby zobaczyć kod

    8. Odnośnie odczytu rejestru tcnt0 i acsr
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #5 9635311
    Virus500
    Poziom 11  
    1. Nie wiem czy to dobre rozwiązanie ale akurat wyzwalanie stanem niskim mi odpowiada ponieważ w przerwaniu jest pętla która trwa dopóki stan niski się nie zmieni. Czyli włącza diodę po wciśnięciu przycisku na tak długo jak jest wciśnięty.
    2. Tutaj mała zagwostka ponieważ w książce oraz datasheet jest, że rejestr wejściowy pin jest tylko do odczytu. Ja po ustawieniu w stan wysoki rejestru portd oraz pind dopiero przestałem mieć ciągłe przerwania z Int0. Czyli rejestr pin też można ustawiać ?
    3. Posłuchałem rady i zmieniłem sposób ustawienia gimsk oraz timsk.
    5. Jeśli chodzi o stos to już się doczytałem i ustawiłem ale dzięki za radę.
    6. Nie wiem jak dłuuuugo bym do tego doszedł ! Wielkie dzięki ! To mi się przyda tylko na początek dla nauki i wizualizacji działania programu.
    7. Pewnie procedurka się przyda do innych celów.
    8. Tutaj też już zauważyłem błąd ale dzięki za podpowiedzi.
  • REKLAMA
  • Pomocny post
    #6 9637693
    Krauser
    Poziom 26  
    1. Rozwiązanie z przerwaniem od stanu niskiego akurat tutaj pasuje, ale gdyby np. w pętli głównej miała migać inna dioda to już to nie przejdzie. Wtedy można najpierw skonfigurować wyzwalanie zboczem opadającym (wciśniecie) i narastającym (puszczenie).
    2. Dla AT90S2313 rejestr pinx jest tylko do odczytu, a dla Attiny2313 do odczytu i zapisu. Dodane jest również dodatkowe źródło przerwań asynchronicznych od zmiany stanu na wejściach. Bardzo przydatne dla w trybie Power Down.
    PortB ustawiony na 1 podciąga wewnętrznie wyprowadzenie do VDD gdy pracuje ono jako wejście. Jeśli tego nie zrobisz przycisk musi mieć dodatkowy rezystor. Wpisanie do rejestru pinx jedynki zmienia stan portx na przeciwny co objawia się negacją wyjścia lub włącza i wyłącza podciąganie wejścia. Nie wiem co tam Tobie wyszło ale jak dla mnie najpierw sobie coś dobrze ustawiasz (stan początkowy wyjść oraz podciąganie wejść wpisując 0b11111111 do portx) a potem to psujesz (zmieniasz stan początkowy na przeciwny i wyłączasz podciąganie wpisując 0b11111111 do pinx). Sprawdź to sobie.
  • #7 9650418
    Virus500
    Poziom 11  
    Pomysł z przerwaniami zboczem opadającym a później narastającym okazał się bardzo dobrym rozwiązaniem w moim przypadku. Jeśli chodzi o ustawienia portów to zależy czy najpierw dasz instrukcję ustawienia portx czy pinx, przynajmniej tak mi wyszło w symulatorze. Teoretycznie program został już napisany tylko wrzucić do procka i sprawdzić w praktyce. Mogę tylko podziękować koledze "Krauser", że jako jedyny starał się mimo moich błędów pomóc mi w tworzeniu programu.
REKLAMA