Blikání LED

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Blikání LED

Příspěvek od pavel1tu » 23 črc 2020, 09:33

ondraN píše:
22 črc 2020, 08:52
Šo by to jistě ještě zoptimalizovat, ale jsem na dovolené a nemám už čas. Nastavováni a zastavení blikání by bylo vhodnější udělat přes funkci a v ní ošetřit všechny stavy, které se teď musí řešit v interruptu. Nicméně, tohle bude fungovat i tak, jak je to napsané.
Pěkné Ondro,
jednou jsem se nějak snažil rozblikad LED pomocí časovače, bez nutnosti volat nějaké přerušení a digitalWrite - právě pro alarm
pro trvalé blikání stačilo mít v SETUP (já chtěl volat funkci kde bylo)

Kód: Vybrat vše

  TCCR1A = 0;
  TCCR1B = 0;
  bitSet(TCCR1B, CS12);  
  OCR1A = 62500;
  bitSet(TCCR1A, COM1A0); 
  pinMode(9, OUTPUT);
ale nepřišel jsem na to, jak to vypínat/zapínat a také myslím že to nelze použít na jakýkoliv výstup - takže to není řešení co se zde požaduje
Až budeš mít čas, jen pro zajímavost, mohl bys na to Ondro kouknout, je to výhodné, že se nemusí votat žádné přerušení.
Kdyby to šlo vypínat, zapínat, testoval jsem to jako funkci, kterou jsem volal s parametrem 1/0 a snažil se to nějak ovlivnit řádkem "bitSet(TCCR1A, COM1A0);" ale je to už asi mimo moje možnosti co sám pochopím.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

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

Re: Blikání LED

Příspěvek od kiRRow » 23 črc 2020, 16:19

Nejsem školený programátor, jsem programátor amatér samouk. Přerušení by mělo trvat co nejkratší dobu a co jsem tak pochopil, tak ty příjemné arduiňácké příkazy jako digitalWrite, bitSet a podobně jsou mnohonásobně časově náročnější než přímý zápis do registru. Já osobně příkazy co jsou v interupt vektoru, tak píšu v ASM. Když chci blikat na pinu 13, zapisuji u UNA do registru PORTB. Abych si ho nepřepsal celý tak ho maskuji |= B00100000, pro vypnutí ho maskuji &= B11011111. https://www.arduino.cc/en/Reference/PortManipulation zkus kouknout na tohle.

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

Re: Blikání LED

Příspěvek od ondraN » 24 črc 2020, 08:17

kiRRow píše:
23 črc 2020, 16:19
Nejsem školený programátor, jsem programátor amatér samouk. Přerušení by mělo trvat co nejkratší dobu a co jsem tak pochopil, tak ty příjemné arduiňácké příkazy jako digitalWrite, bitSet a podobně jsou mnohonásobně časově náročnější než přímý zápis do registru. Já osobně příkazy co jsou v interupt vektoru, tak píšu v ASM. Když chci blikat na pinu 13, zapisuji u UNA do registru PORTB. Abych si ho nepřepsal celý tak ho maskuji |= B00100000, pro vypnutí ho maskuji &= B11011111. https://www.arduino.cc/en/Reference/PortManipulation zkus kouknout na tohle.
Je to přesně tak. Pohodlné arduino příkazy schlamstnou navíc spoustu instrukcí. Na druhou stranu zvyšují přehlednost a variabilitu kódu. Když všude použiju digitalWrite a po nějaké době chci změnit pin layout, tak jen změním hodnotu jedné konstanty a je to (tedy v případě že je to tak napsané). Pokud někde,třeba z důvodu rychlosti, použiju maskování a přímý zápis na specifický port, ztratím jednoduchost i také trochu tu přehlednost. Asi to bude vždycky na úvaze programátora, aby se rozhodl, co ztratí, co získá, co potřebuje a zvolil vhodnou cestu.

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

Re: Blikání LED

Příspěvek od ondraN » 24 črc 2020, 08:34

pavel1tu píše:
23 črc 2020, 09:33

Pěkné Ondro,
jednou jsem se nějak snažil rozblikad LED pomocí časovače, bez nutnosti volat nějaké přerušení a digitalWrite - právě pro alarm
pro trvalé blikání stačilo mít v SETUP (já chtěl volat funkci kde bylo)

Kód: Vybrat vše

  TCCR1A = 0;
  TCCR1B = 0;
  bitSet(TCCR1B, CS12);  
  OCR1A = 62500;
  bitSet(TCCR1A, COM1A0); 
  pinMode(9, OUTPUT);
ale nepřišel jsem na to, jak to vypínat/zapínat a také myslím že to nelze použít na jakýkoliv výstup - takže to není řešení co se zde požaduje
Až budeš mít čas, jen pro zajímavost, mohl bys na to Ondro kouknout, je to výhodné, že se nemusí votat žádné přerušení.
Kdyby to šlo vypínat, zapínat, testoval jsem to jako funkci, kterou jsem volal s parametrem 1/0 a snažil se to nějak ovlivnit řádkem "bitSet(TCCR1A, COM1A0);" ale je to už asi mimo moje možnosti co sám pochopím.
Tady je výstup z časovače, tedy shoda counteru a porovnávacího registru, využitá rovnou na nastavení modulačního obvodu a k němu připojeného pinu. Takhle se třeba generuje PWM. Nejvíce se o tom dozvíš z datasheetu MCU, kde by to mělo být v sekci Timer1, PWM generation. Pro vypnutí, myslím, stačí, dát OCR1A=0, pro zapnutí zase zpět tu hodnotu (ale nejsem si jistý a nemohu se mrknout do datasheetu). Podívám se příští týden.
Lze to použít na výstupy co mají možnost přiřazení PWM a taky to zároveň vylučuje možnost PWM používat (tedy analogWrite).

Odpovědět

Kdo je online

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