Hírek:

Fontos tudnivalók a migrációval kapcsolatban, kérlek olvasd el:

A régi fórumról áthozott hozzászólásoknál a felhasználó neve adatvédelmi megfontolásokból véletlenszerűen generált értékekre lett  lecserélve. Ez akkor tud a valódi értékre visszaállni, ha az adott felhasználó a régi fórumon nyilatkozik, hogy beleegyezik az adatainak az új fórumra továbbításához, majd ezután itt a régi felhasználónevével és email címével regisztrál.
8~20 óra között, 1~30 percen belül megtörténik a jóváhagyás, 30 percenként ellenőrizd email fiókodat (SPAM-ot is) mindenképp kapsz mail-t, a sikeres regisztrácioról, vagy a hibáról és, hogy mi a teendőd.
Nézd meg  "A régi fórumról, az új fórumra költözés útmutatót."
A régi fórumon használt email címmel de más felhasználói azonosítóval érkező regisztrációs kérelmek törlésre kerűlnek.

Main Menu

Arduino

Indította gaben, 2025 február 03, 18:09

Előző téma - Következő téma

dtb

Egy másik verzió, ez egyszerűbb...

  

Robsy1

A profi hozzáértőktől, AVR programozóktól kérdezném:
Van az Arduino utasítások közt olyan, ami csak egy-két sorból áll, és képes 8-16 bit szélességű adat Output műveletet egy porton végezni 0.5 mikrosec alatt?

Mert ahogy látom, szinte mindenütt csak ez a bitenkénti LED ki-be kapcsolgatási játék demo program van terítéken.

dezsoe

A portok 8 bites szélességben írhatók/olvashatók. Nem kell hozzá feltétlenül lemenni assembly-ig, C-ből is elérhetőek. A mellékelt képen PA, PB, PC és PD kezdetű lábak tartoznak egy-egy 8 bites egységbe. Láthatóan nincs minden láb kiépítve, ahogy más mikrokontrollereknél is szokott lenni.

  

Robsy1

Köszönöm.
A C nyelvű utasítás(ok) eredő futási idejéről van tapasztalatod?

TBS-TEAM

Ha nagy sebességet szeretnél arduino kód futtatására akkor:
Teensy 4.1
ARM Cortex-M7 600 MHz-en
Lebegőpontos matematikai egység, 64 és 32 bit
József

tibs

Szia!

Egy kiragadott példa az egyik programomból.


 int inicial2(int buf2, int br)
    {
       
         PORTD &= B00111111;

        _delay_loop_2(br);

       
       
        for(int i=0;  i<9; i++)
           
           
           {
              if((buf2>>i)&1)
              {
                   PORTD |= B11000000;
                    _delay_loop_2(br);

              }
              else
              {
                   PORTD &= B00111111;
                    _delay_loop_2(br);

              }
             
             
           }


        PORTD |= B11000000;
        _delay_loop_2(TX_P_STOP2);

    }



Egy cikuls idő alatt hajtja végre ha jól tévedek.

morvfer7

PORTx regiszterre való közvetlen hivatkozással a leggyorsabb.

Példaként, ha a 16 bites adatot egy adott portra (például PORTB) kiírni:


void setup() {
  // port - kimenet
  DDRB = 0xFFFF; // minden bit kimenet
}

void loop() {
  // 16 bites adatot a PORTB-re
  PORTB = 0xABCD; // Példa
}



Ez az ABCD értéket írja ki a PORTB regiszterbe.


Például Arduino UNO 328P mikrovezérlője 16 MHz-es órajellel ketyeg.

Az PORTx regiszterekhez történő közvetlen hozzáférés egy utasításnak számít, ez elég gyors, így amíg egy 16 bites adatot ki tudsz írni a portra, mindössze egy utasításciklus hosszúságú lesz, azaz körülbelül 62.5 nanoszekundum. (1 / 16 000 000 másodperc)

Fontos, hogy ez azt feltételezi, hogy az adott művelet szinkronizált a processzor órajelével, és nincs egyéb időveszteség a környezetben.
Eladó cuccok: webshop.morvaiferenc.hu

dezsoe

Nincs. Amit tudok, az annyi, hogy kifejezetten jól optimalizál a C fordító, de nem volt még szükségem ennél pontosabb megközelítésre.

dezsoe

A fordító el fogja dobni a felső 8 bitet, mivel a regiszterek 8 bitesek.

Robsy1

Köszönöm a segítségedet, ezek nagyon biztatóak, ha tényleg így megvalósíthatók C-ből is.
Bár az nagy kérdés, hogy ha egy port csak 8 bit szervezésű, szélességű, akkor mi lesz a 255 feletti adattal, ahogy Dezsoe ezt fekvetette. Én is azt gyanítom, hogy ehhez olyan Arduino típus kellene, ami 16 bites adat szervezésű, és képes egy utasításban a 0-FFFF adat mezőt "mozgatni" vagy azokkal műveletek végezni.
Mert az időnyerés miatt pont ez a bajom ezekkel a 8 bites utasításokkal, hogy ezekből több kell, mint amikor ezt egy soros utasítás is elintézi.

morvfer7

Úgy gondolom, hogy ha a fordító az PORTx regiszterekhez hozzáférést lát, 8 bites blokkokban fogja kezelni az adatokat.

Így ha egy 16 bites adatot írsz egy PORTx regiszterbe, akkor a fordító automatikusan fogja kezelni, akkor a 8 bites regiszterekhez tartozó két blokkot használ úgy, hogy az alsó 8 bitet a PORTx regiszter megfelelő bitjeire írja, majd az felső 8 bitet pedig a PORTx regiszter következő bitjeire.

Most nem tudom tesztelni, de kb így képzelem el.
Eladó cuccok: webshop.morvaiferenc.hu

TBS-TEAM

Ha minimum 16 bitre van szükséged, de egy kritikus (gyors) kódszakaszban szeretnéd használni, akkor az int_fast16_t definíciókat használhatod.



16 bites mesterkód

#include <Wire.h>
 
void setup()
{
Wire.begin();
Serial.begin(9600);
}
 
void loop()
{
delay(2000);
 
int16_t bigNum;
 
byte a,b;
Wire.requestFrom(54,2);
 
a = Wire.read();
b = Wire.read();
 
smallNum = a;
smallNum = smallNum << 8 | b;
 
Serial.print(bigNum);
Serial.print("\n");
}

____________________________________________

16 bit slave code

#include <Wire.h>
 
void setup()
{
Wire.begin(54);
Wire.onRequest(requestEvent);
}
 
void loop()
{
delay(100);
}
 
void requestEvent()
{
int16_t bigNum = 1234;
byte myArray[2];
 
myArray[0] = (bigNum >> 8) &amp; 0xFF;
myArray[1] = bigNum & 0xFF;
Wire.write(myArray, 2);
}


  
József

Robsy1

Köszi, de attól félek, hogy ennek a huroknak meg a benne lévő utasítás ciklusoknak az össz eredő végrehajtási ideje nagyobb lesz így már mint 0.5 us.

Lehet, hogy át kéne tanulmányoznom idővel egy 16 bites AVR assembly utasításkészletét. Csak azt a tapasztaltam, akikkel beszélgettem már erről, hogy manapság már szinte senki (a profi programozók se) fejlesztenek ilyen AVR programokat ASM-ben, mert ezek már nem azzal a pár száz (hanem akár több ezer), viszonylag áttekinthető utasításkészlettel dolgoznak, mint egy 8 bites PIC, amiket eddig volt szerencsém programozgatni, és viszonylag átláthatók, megtanulhatók még nekem is, csak ugye "lassúak" nekem. Ez a 16 bites adatkezelésű AVR vagy (akár a PIC világ is) ilyen szinten egy más világ, nyilván a profi programozó se fog kínlódni manapság ASM-ben, inkább egy jó minőségű C fordítót használnak, ha még beleférnek a szűkös futási idő keretbe.

De valami trükje, csínja-bínja csak van ennek az AVR  technikának, hiszen egy kis "vacak" Ardunió csak-csak elvezérelget egy 3D nyomtatót, néhány 10 kHz-es step/dir frekivel, ami azért nem annyira rossz eredő eredmény egy ilyen kis "kütyühöz" képest.

Na mindegy, köszi mindenkinek a segítséget.

dezsoe

A PIC, az AVR és az ARM processzorok RISC architektúrájúak: nemhogy több ezer, de sokszor még 100 utasításuk sincs.

Robsy1

Biztos úgy van, ahogy mondod, te vagy a szakértője a témának.
Én nem tudom pontosan mennyi van (volt aki jóval száz fölöttiről beszélt a 16 bites verzióknal, mert a 8 biteseket nagyjából még én is átlátom), ezért is érdeklődtem itt. Egy biztos: a korszerűség, kényelem jegyében azt érzékelem, hogy szinte minden programozó manapság "menekül" az AVR ASM programozástól, mindenki valamilyen C fejlesztő rendszert/fordítót javasol, hogy ott kezdejek ezekkel foglalkozni. És azért egy ilyen AT Mega pdf adatlap még terjedelemre is elég "ijesztő", ha megnyitja az ember.

Na majd meglátjuk, majd jobban beleásom magam, aztán ha elakadok, majd jelentkezem. Köszi neked is az infókat.