ATmega16: reléové karty řízené z PC (řízení výstupů UART-em)

Dobrý den,
už nevím kam bych se obrátil. Nedokázal by někdo z Vás vymyslet (zde uvést kód pro ASM) jak po přijetí znaků

“PAAY” Zapnout výstup PA0…
“PAAN” Vypnout výstup PA0…
“PABY” Zapnout výstup PA1…
“PABN” Vypnout výstup PA1…

Atmega16, kr. 14.7456

Nastavení UARTu:
LDI R16,LOW(0)
OUT UCSRA,R16
LDI R16,(1<<TXEN)|(1<<RXEN)
OUT UCSRB,R16
LDI R16,(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
OUT UCSRC,R16
LDI R16,HIGH(7)
OUT UBRRH,R16
LDI R16,LOW(7)
OUT UBRRL,R16

Jde mi o využití procesoru jako “releové karty” řízené z PC, ale nějak se mi nedaří porovnávat přijatá data s těmi danými pro jednotlivý výstupy. Případně navrhněte již hotové řešení někde na webu (Pro Assembler), budu vděčný. Děkuji

:arrow_right: administrator: přesunuto z "Elektronika s mikrokontroléry, procesory"

:arrow_right: administrator: přejmenováno z "Atmega16 řízení výstupů uartem"

Co na tom chceš vymýšlet, jelikož jsou první dva znaky vždy stejné tak bych je zahodil, druhé dva přijaté znaky sečet, porovnal s konstantou a podle shody zapnul nebo vypnul příslušný pin.

Díky za rychlou odpověď, přesně něco takového jsem čekal. Žádal jsem o kód… A stím zahazováním to nebude tak žhavý. První znak udává adresu procesoru (jeden bude A… druhý B…) A druhý znak udává port procesoru. A… B… C… D… Proto ty složitosti.

Kód po mě nežádej, v asm nepíšu a pro Atmega16 už vůbec ne.
Mám postaveno něco podobného, výběr mcu a přepínání pinů řeším posíláním jednoho bytu, není potřeba posílat čtyři.

Petr: Nijak neřešíš CRC a podobné vymoženosti?

Konkrétně v té mé aplikaci není nic takového potřeba, Jde o dvě desky každá s deseti relé ovládající dvacet elektrických ventilů u radiátorů topení v malé ubytovně.
Nejde tedy o žádný důležitý přenos.

A tak proc sem píšeš kdyz neděláš assembler? Ten dotyčný žádal asi něco jinýho než radu pro jiný procesor a jiný jazyk. :laughing:

Ta rada nebyla ani pro jiný procesor ani pro jiný jazyk, nýbrž byla obecná a použitelná v mnoha případech na různých platformách.
Dotyčný požadoval, aby za něj někdo udělal jeho práci a to se asi moc lidem nebude chtít. A ještě k tomu v asm…

Zdravicko, je fakt ze secist symboly neni spatny napad. Snazil jsem se porad porovnavat “znak po znaku” a to je evidentni problem. Takze diky. Nakonec bude reseni takove ze procesor porovna prvni znak, pokud neni retezec urcen jemu, zbytek zahodi. Pokud je urcen jemu, nasledujici tri znaky secte, porovna s daty v pameti a podle nich urci akci. CRC reseno nebude, to uz je nad moje chapani. :smiley: Jinak kdyby nekdo nasel nejake podobne reseni na internetu, rad poctu. Ja nic nenasel.

I porovnávání znaků by neměl být problém.
Přijmeš první znak a uložíš do první proměnné, pak druhý znak, zase uložíš do druhé proměnné …atd.
Až přijmeš všechny znaky skočíš do podprogramu pro testování znaků.
Testuješ první znak na shodu, je-li shoda, pokračuješ v testování druhého znaku
není-li shoda, opustíš podprogram.
Bude-li shoda na všech znacích, provedeš příslušnou akci a opustíš podprogram.
Nic na tom není. Samozřejmě tuto akci jde realizovat vícero způsoby.

piityy: díky… :slight_smile:

Teoreticky by tu mohl nastat problém, kdyby procesor 1 znak nechytil a kontroloval to po čtveřicích. Pak by už žádný další paket nevyhodnotil správně. Měl by totiž např. 3B z minulého příkazu a 1B z nového. Do dalšího resetu nebo do určité shody chyb v přenosu by bylo zařízení mimo.

Lepším řešením by bylo data nezahazovat po zpracování všechna, ale jen před zpracováním nejstarší byte nahradit novějším. Po každém novém přijatém bytu pak kontrolovat jesli daná čtveřice neodpovídá některému příkazu. Tím odpadne problém s detekcí začátku paketu. Je to nepatrně náročnější na procesorový čas, ale zato docela odolné.

M.Timmy: máš tu pár nápadů, můžeš začít psát… :smiley:

:smiley: To je pravda… Koukam co uzivatel to zajimavy napad. Nicmene se vratim k tomu scitani. To se mi zda jako pomerne dobry napad… Takze dekuji panove. :slight_smile: Jdu psat… :wink:

No urcite ak sa nejaku dobu neprijme ziadny znak, treba komunikacnu rutinu nastavit na zaciatok.