Stránka 1 z 10
Bascom dynamický "alias"
Napsal: 01 lis 2021, 18:38
od scorpions-cz
Ahoj. Možná jsem to blbě pojmenoval. Potřebuju na 20 výstupních portů MCU postupně poslat ( v předem definovaném čase) log 1 na 100mS.
Jak to udělat samozřejmě vím, můžu udělat, že to jednotlivě napíšu řádek po řádku a použiju WAITms nebo použiju časovač, což bych chtěl a bude tam spousta podmínek a stejně se to bude muset napsat celý. Napadlo mě, zda by to nešlo vytvořit nějak inteligentněji, nějakou smyčkou, kde by byl použit ALIAS ( nebo nějak podobně)a ten by se měnil . Něco jako toto:
VYSTUP(1) ALIAS PIND.0
VYSTUP(2) ALIAS PIND.1
VYSTUP(3) ALIAS PIND.2
S tím, že bych potom použil SET VYSTUP(x) kde by se x měnilo a tím by se měnil i výstupní PIN.
V Helpu jsem nic nenašel, ale to určitě neznamená, že to nějak nejde
Dík za nasměrování
Napsal: 01 lis 2021, 19:21
od Crifodo
Na PIND.x toho moc nepošleš, tím se čte stav portu, pro výstup slouží PORTD.x
Který Atmel má 20 portů?
Napsal: 01 lis 2021, 19:27
od bdn
Jestli to máš 8bit. AVR, tak stejně bude oněch 20 I/O pinů "rozházeno" po ruzných portech PA, PB, PC. Myslím, že nějaký obří if-else if, nebo case bude nejelegantnější řešení.
Napsal: 01 lis 2021, 19:28
od scorpions-cz
OK napsal jsem to blbě. Potřebuju poslat log. 1 na 20 výstupních PINŮ, to jsou necelé 3 porty. Jo PINX.Y a PORTX.Y se mi plete a přijdu na to vždy při ladění.
Ale na co jsem se ptal jsi pochopil, že jo?

Napsal: 01 lis 2021, 20:20
od bdn
Nevím jak v Bascom, ale v C lze udělat na pár řádků ...
Kód: Vybrat vše
#define BSET(port, bitmask) ((port)|=(bitmask))
volatile int16_t time_is; // nastaven v ISR(TIMER0_OVF)
int16_t time_past;
uint8_t code;
// ...
void set_pin_100ms( void)
{
if((signed)(time_is - time_past - 100)>=0) // automaticky kazdych 100ms
{
time_past = time_is;
if (code<20)
{
set_pins(code);
code++;
}
}
}
void set_pins(uint8_t code)
{
switch (code)
{
case 1:
BSET(PORTA, 0x01);
break;
case 2:
BSET(PORTA, 0x02);
break;
case 3:
BSET(PORTA, 0x04);
break;
// ...
default:
;
}
}
Napsal: 01 lis 2021, 20:24
od ZdenekHQ
Já si taky myslím, že pokud to umí case, tak to bude nejrozumnější řešení a snadno modifikovatelné.
Sice si ten výpočet a modifikaci pinů přes jejich adresy třeba na MCU51 dokážu představit, ale elegantní by to moc nebylo.
Napsal: 01 lis 2021, 20:34
od scorpions-cz
No v C se nevyznám. Já potřebuju aby se na výstupu objevila log.1 na dobu 100mS, ale prodleva mezi jednotlivými výstupy bude nastavitelná od 0,1 do 9,9 sec. po 0,1sec. Nevím co je "break" vC jestli je to jenom zastavení programu, nebo hodnota od časovače. V Bascomu mohu použít WAITms X, ale tomu se chci vyhnout. Mám nastaveno přerušení každých 100mS.
Šlo mi o to zda vy to nešlo vyřešit nějakou smyčkou, pokud to nepůjde, tak to rozřádkuji.
Napsal: 01 lis 2021, 20:39
od Crifodo
Nevím teď jak do detailu, ale snad by šlo definovat si dlouhou celočíselnou proměnnou - DWORD, a pak smyčka: v ní SHIFTovat bit doleva, maskovat a posílat stav do těch tří portů, jen v jednom bude vždycky ten bit v log 1. Ve smyčce nakonec testovat dosažení dvacáté pozice. To je nějaký běžící světlo?
Napsal: 01 lis 2021, 20:41
od scorpions-cz
ZdenekHQ
Na to CASE asi dojde. Mě jenom napadlo, že pokud by šel použít proměnný ALIAS tak by to bylo nejkratší řešení. Něco jako když načítám hodnotu z ADC, Taky nemusím vypisovat včechny kanály a můžu použít:
GETADC (x) , kde hodnotu x si měním jak chci.
No nemůžu mít asi všechno.

Napsal: 01 lis 2021, 20:43
od scorpions-cz
Crifodo
Né, je to seqencer pro ohňostroje.
Nějaký posuny bych tam nerad dělal, protože to možná nepůjde po sobě( zjednodušení plošňáku a pod)
Napsal: 01 lis 2021, 20:46
od termit256
Pokud te netlaci velikost programu, tak CTRL+C / CTRL+V byva casto nejrychlejsi reseni. I kdyz urcite ne nejhezci nebo nejelegantnejsi, ale zase nez pul dne vymejslet a testovat nejake opicarny, tak to radeji sproste zkopcim a mam za 5minut hotovo.
Napsal: 01 lis 2021, 20:52
od scorpions-cz
Jo velikost je mi celkem jedno, Čip má paměti dost a Bascom mám ofiko, takže bez omezení velikosti kodu.
Napsal: 01 lis 2021, 20:57
od bdn
Ono obecně, čekání může být pasivní tj. nějaké to delay(ms) nebo aktivní, kde obvykle if-else testuje časovou událost a mezi tím se vykonává zbytek smyčky. Záleží na konktrétní aplikaci, požadované přesnosti, velikosti chipu atd. Výrobce čipu dává obvykle i nějké návody, jak to udělat ...
https://www.google.com/search?q=atmel+process+scheduling
Napsal: 01 lis 2021, 21:12
od scorpions-cz
Čekání mám vyřešený. Každých 0,1s se generuje přerušení a při něm vyresetuju výstupní piny. Zároveň ty přerušení počítám a při shodě s nastaveným intervalem se provede zapsání log.1 na patřičný pin.
Při dalším přerušení se opět pin nastaví na log.0 a při dvojnásobném čase se nastaví další pin na log.1 Tak celkem 20x.
Napsal: 01 lis 2021, 21:19
od termit256
Nebo si proste napis tabulku se stavy tech portu a vycitej ji pomoci toho cisla poctu preruseni.