Bascom dynamický "alias"

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
scorpions-cz
Příspěvky: 2004
Registrován: 19 bře 2011, 00:00
Bydliště: Jižní Čechy Dačicko

Bascom dynamický "alias"

#1 Příspěvek 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
:lol:
Dík za nasměrování
Uživatelský avatar
Crifodo
Příspěvky: 14779
Registrován: 11 říj 2005, 00:00

#2 Příspěvek 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ů?
Uživatelský avatar
bdn
Příspěvky: 560
Registrován: 16 led 2020, 00:00

#3 Příspěvek 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í.
Uživatelský avatar
scorpions-cz
Příspěvky: 2004
Registrován: 19 bře 2011, 00:00
Bydliště: Jižní Čechy Dačicko

#4 Příspěvek 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? :lol:
Uživatelský avatar
bdn
Příspěvky: 560
Registrován: 16 led 2020, 00:00

#5 Příspěvek 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:
      ;
   }
}
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#6 Příspěvek 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.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Uživatelský avatar
scorpions-cz
Příspěvky: 2004
Registrován: 19 bře 2011, 00:00
Bydliště: Jižní Čechy Dačicko

#7 Příspěvek 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.
Uživatelský avatar
Crifodo
Příspěvky: 14779
Registrován: 11 říj 2005, 00:00

#8 Příspěvek 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?
Uživatelský avatar
scorpions-cz
Příspěvky: 2004
Registrován: 19 bře 2011, 00:00
Bydliště: Jižní Čechy Dačicko

#9 Příspěvek 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. :roll:
Uživatelský avatar
scorpions-cz
Příspěvky: 2004
Registrován: 19 bře 2011, 00:00
Bydliště: Jižní Čechy Dačicko

#10 Příspěvek 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)
Naposledy upravil(a) scorpions-cz dne 01 lis 2021, 20:55, celkem upraveno 1 x.
termit256
Příspěvky: 10029
Registrován: 06 pro 2007, 00:00

#11 Příspěvek 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.
Uživatelský avatar
scorpions-cz
Příspěvky: 2004
Registrován: 19 bře 2011, 00:00
Bydliště: Jižní Čechy Dačicko

#12 Příspěvek 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.
Uživatelský avatar
bdn
Příspěvky: 560
Registrován: 16 led 2020, 00:00

#13 Příspěvek 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
Uživatelský avatar
scorpions-cz
Příspěvky: 2004
Registrován: 19 bře 2011, 00:00
Bydliště: Jižní Čechy Dačicko

#14 Příspěvek 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.
termit256
Příspěvky: 10029
Registrován: 06 pro 2007, 00:00

#15 Příspěvek od termit256 »

Nebo si proste napis tabulku se stavy tech portu a vycitej ji pomoci toho cisla poctu preruseni.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“