Re: Arduino generování pulzů
Petr Zapadlo
zapik na email.cz
Pondělí Červenec 31 07:03:32 CEST 2023
digitalWrite je obalovací funkce, která jako vstup má číslo pinu, které
však nemá žádnou vazbu na "přirozené číslování" pinů = identifikaci
portu a konkrétního bitu. Tj například PORTB, bity 0-7.
Tady mátě jak je to vlastně rozložené:
https://camo.githubusercontent.com/c55beef2f138da61fe671a1e4a307ff4ffbc318d/68747470733a2f2f692e696d6775722e636f6d2f715849456368542e6a7067
podstatné jsou pro vás hned ty zelené čísla u nožek.
Tedy "arduino" pin označené jako 4 je ve skutečnosti PD4 = port D, bit
4. Stejně tak arduino pin 8 je ve skutečnosti PB0, tj port B, bit číslo 0.
Proto digitalWrite musí vždy před nastavením udělat překlad co vlastně
chcete nastavovat a to stojí nemalý čas. proto je digitalWrite dost pomalé.
Přímý přístup může vypadat takto:
//pojmenuji si pin signálem
#define RED PD4
//nastavím pin jako výstupní, ekvivalent pinMode
//set port D
DDRD |=(1<<RED);
//nastavení bitu jako jednička
PORTD |= (1<<RED);
//nastavení bitu jako nula
PORTD &= ~(1<<RED);
ty nastavovačky možná vypadají jako magie, ale nejsou, je třeba si to
rozložit co to dělá:
(1<<RED), RED se přeloží (při překladu na číslo pinu, tj v tomto případě
4) a ta rotace posune jedničku ze základní pozice 4x, tj výsledkem
tohoto je 0b00010000
No a tohle číslo potom pomocí operace OR (to je to svislítko)
vypropagujete na portD. OR se používá proto abych nastavením jedničky na
pinu 4 neovlivnil ostatní porty.
Stejně tak nulování bitu:
PORTD &= ~(1<<RED); (1<<RED) mi vyrobí (při překladu) číslo
0b00010000, vlnovka před závorkou je negace, tj 0b11101111 a & je
operace AND. Z toho plyne, že bit 4 je nulován (cokoliv* nula je nula)
a ostatní bity zůstanou nedotčené.
Pochopitelné?
Petr
Dne 30. 07. 23 v 22:15 Martin Záruba napsal(a):
>
> No a jak jinak nastavit příslušný bit?
>
> A jak nastavit u PWM jinou frekvenci, než těch 400 Hz? A jak jej
> ovládat? Můžete poslat kousek kódu?
>
> Martin Záruba
> Dne 30.7.2023 v 21:15 Petr Zapadlo napsal(a):
>> Ještě upozorním na to, že digitalWrite na atmega není moc efektivní
>> - kdysi jsem to měřil a je asi tak 3x pomalejší než klasický přístup
>> přes registry.
>>
>> smyčka digitalWrite (pin, 0); digitalWrite(pin,1); nedal ani těch
>> 20kHz (jestli si správně pamatuju)
>>
>> Jinak na PWM těch 20kHz je úplně v poho - ale nesmí se k tomu použít
>> analogWrite - to nastaví PWM do nějakého základního stavu s frekvencí
>> někde kolem 400Hz. prostě musíte načíst a ručně ponastavovat
>> registry nějakého časovače-
>>
>> Petr
>>
>>
>> Dne 30. 07. 23 v 19:51 Jaroslav Buchta napsal(a):
>>> Cekat v preruseni to se opravdu nedela. Neslo by to delat jako se
>>> hejbe krokovyma motorama?
>>> V preruseni nastavit novou hodnotu pro casovac odpovidajici
>>> pozadovane delce 0/1 a hejbnout GPIO. Klika je, ze u AVR ma
>>> preruseni dost malou rezii, treba u ARMu to takhle moc delat nejde.
>>>
>>> Dne 30.07.2023 v 19:45 Petr Simek napsal(a):
>>>> On Sun, 30 Jul 2023, Martin Záruba wrote:
>>>>
>>>>> // Obsluha přerušení od časovače Timer/Counter1
>>>>> ISR(TIMER1_OVF_vect) {
>>>>> // Generování pulzu 1 na pinu 9 (při logické 1)
>>>>> digitalWrite(9, HIGH);
>>>>>
>>>>> // Počkejte na dobu odpovídající šířce pulzu 1
>>>>> delayMicroseconds(pulseWidth1);
>>>>
>>>> Kdyz v preruseni vyvolate cekaci smycku, tak se to v tom preruseni
>>>> zablokuje ne ? Pak zalezi na prioritach - bud to jine preruseni
>>>> neprerusi, takze druhy puls bude zmrseny-zpozdeny, nebo prerusi
>>>> a protoze v nem to taky uvizne v cekaci smycce tak to zmrsi-prodlouzi
>>>> prvni puls.
>>>>
>>>>
>>>>
>>>>> Martin Záruba
>>>>
>>>> *------------------------------------------------------------------------*
>>>>
>>>> | Petr Simek APS
>>>> JU |
>>>> | psimek na jcu.cz |
>>>> *------------------------------------------------------------------------*
>>>>
>>>>
>>>> _______________________________________________
>>>> HW-list mailing list - sponsored by www.HW.cz
>>>> Hw-list na list.hw.cz
>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>
>>>
>>> _______________________________________________
>>> HW-list mailing list - sponsored by www.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20230731/eb75f83e/attachment.htm>
Další informace o konferenci Hw-list