Hw interrupt a assembler

pospa
Příspěvky: 6
Registrován: 19 led 2022, 07:51
Reputation: 0

Hw interrupt a assembler

Příspěvek od pospa » 23 bře 2022, 12:48

Ahoj
potřeboval bych, jak jinak, radu.
Vyrobil jsem si odměřování k soustruhu, dva 7 seg. displeje s MAX7912, nějaká tlačítka a numerická klávesnice.
Bastlířská hrdost mi nedovolila nákup v Číně... ;)
Vše zašroubováno v krabici a pěkně pohromadě, protože když nechám hw nakonec, tak to nikdy nedopadne...
Vstupem jsou od dvou senzorů, dvakrát dva kvadraturní TTL signály zavedené přes 74LS14 na čtyři hw INT vstupy Arduina.
Proto jsem použil Arduino Micro.
V programu čtu přes čtyři přerušení každou hranu a podle stavu na druhém pinu počítám dráhu.
Problém je, že přeložený kód Arduina krutě nestíhá.
V ISR mám zjištění stavu pinů, inkrement registru a návrat.

Pomocí avr-objdump jsem v zoufalství disassembloval projekt a tolik tun vaty nejen kolem interruptu, ale i třeba zápisu na port jsem nečekal...

Otázka je, jak do projektu Arduina vpašovat nastavení INT0 až INT3 mimo režii kompilátoru na úrovni práce s registry, jak definovat osm jednoduchých ISR v Assembleru a jak (kde) mít dvě styčné globální proměnné DWORD (32bitů) ?

Už jsem byl nachystán na berličku na straně hardware, ale když jsem viděl co leze z kompilátoru, tak :twisted:
Popravdě přepisovat celý projekt ze sketche do asm se mi vůbec nechce.

Díky

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Hw interrupt a assembler

Příspěvek od ondraN » 23 bře 2022, 14:42

No, tak to je cena za širokou kompatibilitu a odstínění uživatele od HW. Jedině přepsat ty kriticky náročné úseky a zbytek ponechat v C. I z tohoto důvodu jsem už arduino IDE před mnoha lety opustil a přešel i na STM32 MCu, které mi daleko více vyhovují. Ale byl to docela záhul, ten přechod :mrgreen:

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Hw interrupt a assembler

Příspěvek od kiRRow » 23 bře 2022, 14:53

ASM lze vpašovat do kódu takto

Kód: Vybrat vše

int i = 0;

asm("ldi r30, 1");
//asm("ldi r31, 1");
asm("ldi r31, 2");

asm("cpse r30, r31");
asm("jmp unequal");
asm("jmp equal");

asm("equal:");
Serial.println("Equal");
i += 10;
asm("jmp end");

asm("unequal:");
Serial.println("Unequal");
i += 10;
asm("end:");

Serial.println(i);
dále už budeš muset dle datasheetu k procesoru

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Hw interrupt a assembler

Příspěvek od Caster » 23 bře 2022, 16:13

Možná by bylo dobré uvést, jak rychle potřebuješ něco měřit, jaký typ Arduina používáš a jaká je jeho pracovní frekvence v programu. Pro běžné použití by to měl překladač zvládnout, pokud nejde o nějaký mimořádný časový extrém.

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Hw interrupt a assembler

Příspěvek od peterple » 23 bře 2022, 18:30

Tiež si myslím že to prekladač musí zvláduť. Ale programovanie ala arduino to dokáže pekne zabiť. Niekoľko rád ako to nezabiť
  1. nepoužívať digitalRead() a digitalWrite() Miesto toho pracovať priamo s portami cez PORTx PINx prekladač to potom dá na jednu alebo max 3 inštrukcie. Treba do toho vidieť ako to prekladač montuje a prečo.
  2. nepoužívať attachInterrupt() miesto toho si definovať vlastné ISR. Tu som to ukázal ako sa to robí pre obsluhu INT0viewtopic.php?f=20&t=3038&start=10#p18417
Ďalej by ma zaujímalo prečo máš 4 prerušenia a prečo na obe hrany. Nestačí len 2 prerušenia a len jedna hrana?

V najhoršom sa dá ísť do asm.

pospa
Příspěvky: 6
Registrován: 19 led 2022, 07:51
Reputation: 0

Re: Hw interrupt a assembler

Příspěvek od pospa » 23 bře 2022, 19:46

kiRRow píše:
23 bře 2022, 14:53
dále už budeš muset dle datasheetu k procesoru
Díky, to vypadá rozumně, kompilace funguje, vyzkouším co z toho vymáčknu.

pospa
Příspěvky: 6
Registrován: 19 led 2022, 07:51
Reputation: 0

Re: Hw interrupt a assembler

Příspěvek od pospa » 23 bře 2022, 19:51

Caster píše:
23 bře 2022, 16:13
Možná by bylo dobré uvést, jak rychle potřebuješ něco měřit, jaký typ Arduina používáš a jaká je jeho pracovní frekvence v programu. Pro běžné použití by to měl překladač zvládnout, pokud nejde o nějaký mimořádný časový extrém.
Použil jsem Arduino Micro. Je to v dotazu.
Jaká je pracovní frekvence (čeho?) v programu nevím, jak to zjistím? :?
Běžné použití asi překladač zvládne, v mém případě ale ne, proto potřebuji zapsat do sketche obsluhu přerušení v assembleru bez překladačové vaty.

pospa
Příspěvky: 6
Registrován: 19 led 2022, 07:51
Reputation: 0

Re: Hw interrupt a assembler

Příspěvek od pospa » 23 bře 2022, 20:06

peterple píše:
23 bře 2022, 18:30
Tiež si myslím že to prekladač musí zvláduť. Ale programovanie ala arduino to dokáže pekne zabiť. Niekoľko rád ako to nezabiť
  1. nepoužívať digitalRead() a digitalWrite() Miesto toho pracovať priamo s portami cez PORTx PINx prekladač to potom dá na jednu alebo max 3 inštrukcie. Treba do toho vidieť ako to prekladač montuje a prečo.
  2. nepoužívať attachInterrupt() miesto toho si definovať vlastné ISR. Tu som to ukázal ako sa to robí pre obsluhu INT0viewtopic.php?f=20&t=3038&start=10#p18417
Ďalej by ma zaujímalo prečo máš 4 prerušenia a prečo na obe hrany. Nestačí len 2 prerušenia a len jedna hrana?

V najhoršom sa dá ísť do asm.
Kolega kiRRow nakopl správným směrem a spolu s tvým odkazem to dám dohromady. Mám za to, že pokud si ISR napíšu v ASM, tak se zbavím balastu funkcí a dostanu se tam, kam potřebuji. Jde o jednotky instrukcí. :)
Čtyři přerušení potřebuji proto, že mám dva dráhové snímače a každý má dva fázově posunuté výstupy o 90st. (kvadraturní), no a s každou hranou je definován dílek dráhy.
Trochu OT, ale při disassemblování kódu jsem zjistil, že Arduino má nejmenší datový typ Byte. Bool píše do bajtu a kouká na LSB. :o
Přílohy
images.png
images.png (4.93 KiB) Zobrazeno 2892 x

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Hw interrupt a assembler

Příspěvek od peterple » 23 bře 2022, 20:32

Viem ako pracuje inkrementalný snímač. Len mi je divné že to potebuješ na všetky 4 hrany. Ja som zatiaľ vždy vyšiel s jednou. Smer posuvu určuje ten druhý práve v dobe tej hrany. Ak bola treba vyššia presnosť tak sa použil snímač ktorý mal viac impulzov na otáčku (1000). Z toho meriam aj rýchlosť aj polohu.
inak to asm mozeš urobiť na viac spôsobov.
inline https://www.nongnu.org/avr-libc/user-ma ... e_asm.html
v speci subore https://www.nongnu.org/avr-libc/user-ma ... mbler.html

ohľadom počítadiel, to tiež vidno v mojom kóde. Treba aby tam bol modifikátor volatile a pri čítaní v hlavnom programe treba zabezpečiť atomický prístup.

Ohľadom bitových príznakov sa dá použiť C fičúra record. Ale ja si ORujem a ANDujem konštanty tak ako sa to robí v asm. Tiež treba dávať bacha na atomický prístup, najlepšie je to používať na asm úrovni kde sa to dá zmáknuť jedinou inštrukciou, takže netreba zakazovať prerušenie

Edit:
Ohľadom rýchlosti. Ide o frekvenciu oscilátora ktorým je taktované jadro CPU. Pre AVR based adruina to býva externý kryštál alebo rezonátor na 16Mhz. Podľa dokumentácie je to aj tu tak. MCU má okrem toho aj PLL a vie pre USB či čítače isť aj na vyššie frekvencie

pospa
Příspěvky: 6
Registrován: 19 led 2022, 07:51
Reputation: 0

Re: Hw interrupt a assembler

Příspěvek od pospa » 23 bře 2022, 21:28

Díky za odkazy, nějak se prokoušu. Myslím ale, že mi bude stačit vepsat těch pár ASM instrukcí do stávajícího kódu.
Zabředávat do něčeho co není přímo použitelné v Arduino prostředí se mi nechce. Potřebuji pořešit jen tento problém...

Když víš jak funguje inkrementál, tak ho použij se vším všudy.
Tvůj způsob použití mi nedává smysl, zvlášť když potřebuješ větší přesnost... :)
Koukej na každou příchozí hranu obou fází a máš čtyřikrát větší přesnost.
Vlastně tu základní přesnost, abych byl přesný.
Easy. Netřeba hned používat víc impulsů na otáčku, ty impulsy tam jsou.

BTW já používám lineární senzor s 0.01 mm mezi dvěma hranami. Byl to kompromis mezi potřebou a cenou.
Přílohy
download.png
download.png (6.67 KiB) Zobrazeno 2875 x

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů