Skocz do zawartości

[Kurs] Programowanie mikrokontrolerów AVR w języku assembler - część 5


Pomocna odpowiedź

3 minuty temu, _LM_ napisał:

Ale od zgłoszenia, jak wiadomo, są wykonywane jeszcze instrukcje obsługi stosu, tak samo powrót = zdjęcie ze stosu tego co wcześniej tam wylądowało. W gcc są atrybuty które umożliwiają ręczne napisanie obsługi przerwania.

#define ISR_NAKED __attribute__((naked))

Jak widać ISR_NAKED to tak naprawdę atrybut gcc __attribute__((naked)). Ten atrybut własnie sprawia, że po napotkaniu funkcji z atrybutem naked kompilator przestaje generować dla niej prolog i epilog, o zachowanie stanu rejestrów i ich odtworzenie musi więc zadbać programista. Więc nie ma wtedy żadnej obsługi stosu robionej przez kompilator. Robienie tego samemu może być czasami skomplikowane/bolesne. Czasami jednak może być trywialne - np. jak nie dostępujemy zmiennych:

ISR(INT0_vect, ISR_NAKED){
  PORTB|=0x01;
  asm volatile("RETI\n\t"::);
}

 

  • Pomogłeś! 1
Link to post
Share on other sites

Czuje się w obowiązku podkreślić, że nie liczę cykli potrzebnych do skoku do procedury obsługi przerwania.
Specjalnie zamieściłem instrukcję RETI, która w tych 4 cyklach zdejmuje ze stosu adres powrotu.

image.thumb.png.902f7aed7fe8fa5bbfdcb5954a6ec57c.png

Link to post
Share on other sites
Dnia 14.11.2021 o 17:58, farmaceuta napisał:

Ile cykli zajmuje obsluga pustego ISR?? W sensie nastepuje jakies przerwanie kod zostaje przerwany, i od tego momentu do ponownego kontynuowania kodu...?? Gdyby ktos wiedzial i sie podzielil to bylbym wdzieczny...bo tego raczej timerem nie zmierze...😕

@farmaceuta mógłbyś na koniec zdradzić czemu to Ciebie interesuje? Jakiś praktyczny problem starasz się rozwiązać?

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

45 minut temu, pmochocki napisał:

@farmaceuta mógłbyś na koniec zdradzić czemu to Ciebie interesuje? Jakiś praktyczny problem starasz się rozwiązać?

Tak jakos zainteresowalo mnie sterowanie krokowcami...ale biblioteki zazwyczaj nie chodza w "tle" wiec poprostu zamulajacy kod zamula silnik...no i tak sobie mysle ze cos na przerwaniach by machnal czlowiek...i sprawa taka ze dla jednego silnika to nie ma problemu, 7stawiam preskaler/TCNT na odpowiednia wartosc i poprostu uzyskuje dana czestotliwosc(ilosc krokow na sekunde)..no ale co gdybym chcial uzyc dwoch lub trzech silnikow? No wlasnie tu juz sie tak zrobic nie da, ale mozna wywolywac stala ilosc przerwan i sprawdzac kiedy wypusvic krok dla danego silnika...ale zeby to mialo rece i nogi to tych przerwan musi byc duzo...im wiecej tym lepiej bo wtedy rozdzielczosc jest lepsza p4zy wyzszych obrotach...ja zalozylem 10k przerwan (100us) i chcialem poprostu dokladnie zmierzyc ile % bedzie procek marnowal na te przerwania wraz z kodem w srodku...wyszlo mi 22 cykle na zwyklych zmiennych i 49cykli z alokacja pamieci (ten sam kod) i chcialem jeszcze wiedziec ile cykli zajmuje samo przerwanie bo tego juz timerem nie zmierze (a kod tak)...ot takie dyrdymaly...😅

Edytowano przez farmaceuta
Link to post
Share on other sites

Żeby mieć pogląd można użyć symulator avr kiedyś był w avr studio, nie wiem jak teraz. Co do tych krokowców: przecież na atmegach są budowane sterowniki bldc które wymagają jeszcze krótszych czasów przełączania plus sygnały komutacji i działa to bez problemu. Także nie gadajcie że up nie uciągnie kilku silników krokowych

Link to post
Share on other sites

Ależ uciągnie! Przecież atmega potrafi sterować czterema silnikami w jakiejś anecie czy innym enderze...

I tyle. Pytanie co rozumiemy przez "sterowanie silnikami".

 

Link to post
Share on other sites

Ja na to patrzę z innej strony. @farmaceutachce zbudować nie blokującego libsa dla tych silników , już teraz natknął się na kilka problemów które jeśli dobrze zrozumie - da mu solidną porcję wiedzy i doświadczenia na przyszłość. Ja od siebie mogę podpowiedzieć że przerwanie co 100µS zarżnie procesy nawet w stm z zegarem 70MHz. Także wołaj przerwania co 1ms a lepiej nawet 10ms i twój mikrokontroler będzie miał sporo więcej czasu na inne sprawy. Poza tym, wymień kwarc z 16 na 20Mhz 

Link to post
Share on other sites
11 minut temu, _LM_ napisał:

Ja na to patrzę z innej strony. @farmaceutachce zbudować nie blokującego libsa dla tych silników , już teraz natknął się na kilka problemów które jeśli dobrze zrozumie - da mu solidną porcję wiedzy i doświadczenia na przyszłość. 

Tak jest!...to nie jest mi do niczego potrzebne, ale przy okazji naucze sie czegos nowego a to zawsze potrzebne..😉

 

13 minut temu, _LM_ napisał:

 Ja od siebie mogę podpowiedzieć że przerwanie co 100µS zarżnie procesy nawet w stm z zegarem 70MHz. Także wołaj przerwania co 1ms a lepiej nawet 10ms i twój mikrokontroler będzie miał sporo więcej czasu na inne sprawy. 

Niestety to juz o wiele za wolno...silnik 1.8° przy 5 obrotach na s potrzebuje juz 1000Hz...a co jesli zamarzy sie 10obr? to juz minimum pasuje przerwanie co 500us...a tu tez rozdzielczosc strasznie kuleje jesli jest malo przerwan...

 

17 minut temu, _LM_ napisał:

 Poza tym, wymień kwarc z 16 na 20Mhz 

Nie no to tylko tak edukacyjnie, jak sam wyzej wspomniales🙂

 

18 minut temu, _LM_ napisał:

100µS zarżnie procesy

Niekoniecznie...kod powiedzmy 25cykli(1 silnik) + 15?? Na przerwanie i mamy 40...czyli zaledwie 2.5% zajetosci cpu dla tego dziadostwa...

 

50 minut temu, ethanak napisał:

Ot, taka próba wykorzystania czegoś do czegoś, co do tego czegoś się ni ch*ja nie nadaje...

Wiec jak zrobic sterowanie kilkoma sterami w czasie "rzeczywistm" biorac pod uwage ze jest jeszcze inny kod ktory jak by nie byl napisany to i tak spowalnia calosc..?? Nie wspominajac o tym ze moge miec kawalki kodu ktore jednak na jakies tam ms beda blokowac...

Link to post
Share on other sites
31 minut temu, ethanak napisał:

Pytanie co rozumiemy przez "sterowanie silnikami".

 

Sterowanie jak pwm...czyli ustalam gdzies jakby czestotliwosc i sobie pyka...ewentualnie pyka okreslona ilosc razy, ale to akurat banal...(podkreslam ze temat interesuje mnie edukacyjnie😉)

Link to post
Share on other sites
25 minut temu, _LM_ napisał:

Ja od siebie mogę podpowiedzieć że przerwanie co 100µS zarżnie procesy nawet w stm z zegarem 70MHz.

Być może... ale dwie próby (całkiem udane) z przerwaniem 125 µs na Pico i ESP pokazały, że się da.

No, a;le to dwa rdzenie i trochę więcej niż 70 MHz.

Link to post
Share on other sites

Aż szkoda że nie mam u siebie niczego czym da się zakręcić, pobawiłbym się trochę i sprawdził co można a czego nie 

Link to post
Share on other sites

Nie musisz kręcić - wystarczy że procek będzie potrafił w czasie rzeczywistym ustalać prędkości czy kroki silnika, a piny możesz mieć nawet niepodłączone.

 

Link to post
Share on other sites

Kontynuujac odnosnie problemu o ktorym wspominalem wczesniej...czemu jeden warunek zajmuje 1cykl a drugi 6?? ja to rozumiem  tak ze sprawdzam tylko warunek ktory jest nieprawdziwy i omijam blok kodu ktory jest podpiety pod tego ifa...czyli obie wersje powinny zajac tylesamo czasu, a jednak tak nie jest...🤔

uint8_t f1 = 0;
uint8_t f2 = 0;

bool flaga1 = 0;
bool flaga2 = 0;

void setup() {
   TCCR1B &= 0x00;
   TCCR1A &= 0x00;
   TCCR1B |= (1<<CS20);   
   
      
   sei();                    // przerwania globalne wlacz
   Serial.begin(115200);
   digitalWrite(2, LOW);
}
 
void loop() {
 //*********************** 
    TCNT1 = 0;
   if (flaga1) {
     // flaga1 = 0;
   }
   f1 = TCNT1;
 //***************************  
    TCNT1 = 0;
  if (flaga2) {
    flaga2 = 0;
  }   
   f2 = TCNT1;

    Serial.println(f1);
    Serial.println(f2);
    delay(1000);
  
 
 }

 

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.