Re: Arduino generování pulzů

Martin Záruba swz na volny.cz
Pondělí Červenec 31 12:11:59 CEST 2023


Je mi to zcela jasné, nemám problém s programováním v assembleru. Mě jen 
naprosto nenapadlo, že Arduino IDE dovoluje příkaz PORT. Já myslel, že 
pouze příkazy uvedené v Arduino Reference - Arduino Reference 
<https://www.arduino.cc/reference/en/>.

Je někde seznam povelů, které Arduino IDE přijme?

Martin Záruba

Dne 31.7.2023 v 7:03 Petr Zapadlo napsal(a):
>
> 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 bywww.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored bywww.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/e58aff5d/attachment.htm>


Další informace o konferenci Hw-list