Stránka 2 z 2
Re: Blikání LED
Napsal: 23 črc 2020, 09:33
od pavel1tu
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.
Re: Blikání LED
Napsal: 23 črc 2020, 16:19
od kiRRow
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.
Re: Blikání LED
Napsal: 24 črc 2020, 08:17
od ondraN
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.
Re: Blikání LED
Napsal: 24 črc 2020, 08:34
od ondraN
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).