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

[ATmega16A] ATmega16A - Dlaczego kod wykonuje się wolniej niż oczekiwano?

KryQ 07 Cze 2013 14:00 1134 6
REKLAMA
  • #1 12392344
    KryQ
    Poziom 10  
    Posty: 14
    Witam z tej strony znów ja i znów z durnym problemem. Otóż w przypływie weny napisałem prosty programik który obsługuje programowe kanały PWM (do kilku taśm led) i w ramach mojego zboczenia php chciałem to napisać tak by potem nie musieć przekopywać 50 linii kodu by dodać lub usunąć jeden kanał. Jednak po wszystkich moich wojażach kod zaczął sie strasznie mozolnie wykonywać (Atmega ustawiona jest na 16MHz z zewnętrznego oscylatora fusebity się zgadzają).

    Tak wiec postanowiłem to przetestować i napisałem proste 2 pętle powinny wykonać sie w nieco ponad pół sekundy jednak wykonują sie w 17 sekund!

    Czy mógłby mnie ktoś poinstruować czemu tak długo ti im zajmuje?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    komendy kompilacji:

    
    avr-gcc -g -Os -DF_CPU=16000000 -mmcu=atmega16a -c led.c
    
    avr-gcc -g -mmcu=atmega16a -o led.elf led.o
    
    avr-objcopy -j .text -j .data -O ihex led.elf led.hex
    
    avrdude -F -b 19200 -c arduino -p m16 -P COM3 -u -U flash:w:led.hex
    


    Z góry dzięki za odpowiedzi
  • REKLAMA
  • Pomocny post
    #2 12392952
    jarek_lnx
    Poziom 43  
    Posty: 22720
    Pomógł: 4195
    Ocena: 6119
    Dlaczego skróciłeś cykl zliczania do zera?
    Przy preskalerze 8 wykonują się tylko przerwania.
  • REKLAMA
  • #3 12392980
    KryQ
    Poziom 10  
    Posty: 14
    przy większym cyklu ledy zaczynają mi migać a tak przejścia są łagodne

    //EDIT

    Tzn mrugają tylko te podłaczone do mostka-h(l293dne) te przy procku pracuja idealnie.
  • Pomocny post
    #4 12393514
    jarek_lnx
    Poziom 43  
    Posty: 22720
    Pomógł: 4195
    Ocena: 6119
    Prawie cały czas procesora, wykonują się przerwania, nie starcza czasu na pętlę główną, to skutek wpisania bzdur do rejestrów konfiguracyjnych licznika.
  • REKLAMA
  • #5 12393716
    KryQ
    Poziom 10  
    Posty: 14
    no tak jeszcze borykam sie z konfiguracja tych rejestrów jednak podpowiedz mi czemu to co wpisalem jest bzdura?
  • REKLAMA
  • Pomocny post
    #6 12394274
    jarek_lnx
    Poziom 43  
    Posty: 22720
    Pomógł: 4195
    Ocena: 6119
    Zajrzyj do dokumentacji atmegi16 opis trybu CTC i rejestru TCCR2 ustawiłeś preskaler 8 i OCR2=0 czyli licznik liczy od zera do zera, kiedy osiągnie zero zostaje wyzerowany, cokolwiek to znaczy ;) Nie jestem w stanie stwierdzić czy licznik powinien zgłaszać przerwanie co 8 cykli zegara, czy częściej - warunek wystąpienia przerwania jest zawsze spełniony, samo przerwanie będzie trwało kilkaset cykli więc to i tak bez znaczenia, po prostu po wyjściu z przerwania, natychmiast wejdzie w kolejne, moze zdąży wykonać jedną instrukcję z pętli głównej.

    Ustaw preskaler 1024 i jakiś sensowny OCR2.
  • #7 12395274
    KryQ
    Poziom 10  
    Posty: 14
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tak dla potomnych (albo i to tez bzdury) jednak przy większym preskalerze diody znów flickerowały (kod jednak wykonywał się z odp prędkością)

    Przy tym ustawieniu kod chodzi może z milisekundowym opóźnieniem jednak przy moim kodzie nie ma to większego znaczenia.

    Jeszcze raz wielkie dzięki za pomoc !

Podsumowanie tematu

✨ Użytkownik napotkał problem z wolnym wykonaniem kodu na mikrokontrolerze ATmega16A, który obsługuje programowe kanały PWM. Mimo ustawienia na 16 MHz, pętle w programie wykonują się znacznie wolniej niż oczekiwano, co prowadzi do opóźnienia w działaniu. Odpowiedzi wskazują, że problem może wynikać z nieprawidłowej konfiguracji rejestrów licznika, co powoduje nadmierne wywoływanie przerwań. Użytkownik został poinstruowany, aby sprawdzić dokumentację ATmega16A, szczególnie tryb CTC oraz ustawienia preskalera. Po wprowadzeniu poprawek, takich jak zmiana preskalera na 128, kod zaczął działać z lepszą prędkością, mimo że diody LED nadal migały.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA