Re: Arduino generování pulzů

Petr Zapadlo zapik na email.cz
Pondělí Červenec 31 12:27:49 CEST 2023


Arduino je sada knihoven pro běžný překladač C++ pro platformu AVR.

Nikde není řečeno, že ty knihovny musíte využít,  můžete přístup 
kombinovat (část funkcí z Arduino knihoven a část přímým přístupem).

PORTD = 0b00001000;

je prosté C/C++ přiřazení  a identifikátor PORTD je vyvtořen tuším v 
této hlavičce:

#include <avr/io.h>

Petr

Dne 31. 07. 23 v 12:11 Martin Záruba napsal(a):
>
> 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
>
> _______________________________________________
> 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/78f4099f/attachment.htm>


Další informace o konferenci Hw-list