Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   47 / 851
(#) proba válasza kovacs gabor daniel hozzászólására (») Szept 16, 2014 / 1
 
Vegyél inkább hozzá egy usbasp-t. Ezzel bootloader nélkül tudod programozni, ugyan úgy az arduino keretrendszerén belül. igaz más lábakat kell bekötni hozzá.
(#) pepe1125 hozzászólása Szept 16, 2014 /
 
Sziasztok!

Egy érdekes dolog történt amire eddig nem is gondoltam.

Arduino UNO -val játszottam, teszteltem egy egyszerű program megírással, hogy milyen gyorsan képes kapcsolgatni az egyik port kimenetét.

1. program eredménye 100kHz négyszögjel a kimeneten:

  1. void setup(){
  2. pinMode(13,OUTPUT);
  3. }
  4. void loop(){
  5. digitalWrite(13,HIGH);
  6. digitalWrite(13,LOW);
  7. }


2. program eredménye 1MHz impulzusok a kimeneten:
  1. void setup(){
  2. DDRB = 0xFF;
  3. }
  4. void loop(){
  5. PORTB=0xff;
  6. PORTB=0x00;
  7. }


3. program eredménye mikroC-ben megírva a 2. program, lefordítva, és közvetlenül áttöltve az Atmega328-ra avrisp-vel 2,6MHz impulzusokat produkált a kimenetre.

Na ilyenkor mi van? Mit csinál még az Arduino fejlesztőkörnyezete, hogy ennyire belassulnak a ciklusok?

* Amit szintén észrevettem az, hogy ha Arduino 1.5.7 BETA verzióval fordítottam az 1. program még 100kHz-en sem futott. Az Arduino 1.0.5 compiler hozta csak a 100kHz-et. :S Tehát Arduino fordítón belül is vannak eltérések. És még egy kis extra, ha a soros port kezelés be van kapcsolva még még még lassabb az egész!
Nekem most egy nagyon gyors művelet elvégzésére lett volna szükségem. Minél gyorsabb annál jobb. De így Arduino-val nehéz lesz.
A hozzászólás módosítva: Szept 16, 2014
(#) GPeti1977 válasza pepe1125 hozzászólására (») Szept 16, 2014 / 1
 
Az spi porton tudsz generálni nagyon gyors négyszögjelet, 16MHz órajellel akár 8MHz is lehet.
SPSR = (1<<SPI2X); // SPI double speed - we want 8 mhz output speed.
(#) Kovidivi válasza pepe1125 hozzászólására (») Szept 16, 2014 / 1
 
Szia!
Erről pont most olvastam én is.
Ezt olvasd el, hátha segít: Bővebben: Link.
(#) Kovidivi hozzászólása Szept 17, 2014 /
 
Sziasztok!
SPI-t szeretnék használni, ezzel egy időben a 10-es lábon PWM-et generálok. Működik a PWM, de nem tudom, hogy az SPI mikor vezérli a 10-es lábat, ami SS, vagyis reset? Ha vezérli, akkor GND-t, vagy +Vs-t ad ki?
Köszönöm!
(#) csabeszq válasza Kovidivi hozzászólására (») Szept 17, 2014 /
 
SPI kommunikációnál az SS láb:
- SPI slave - az SS láb dönti el, hogy ki van-e választva, ha alacsony akkor igen, egyébként az SPI tiltva lesz
- SPI master - ha az SS láb output, akkor arra használod, amire akarod. Ha input és alacsony, akkor olybá veszi a rendszer, hogy másik master akar adni a buszon és átkapcsol téged slave módba.

Magyarul amíg mester vagy és az SS output, addig arra használod, amire akarod. Egyébként meg lesz vele bajod rendesen, ha össze-vissza áll.
A hozzászólás módosítva: Szept 17, 2014
(#) Kovidivi válasza csabeszq hozzászólására (») Szept 17, 2014 /
 
Köszönöm szépen, érthetően leírtad!
(#) Kovidivi válasza csabeszq hozzászólására (») Szept 17, 2014 /
 
Olyan lehetőségről tudtok, hogy mikor írok egy programot, felosztom a monitort két részre? Így egymás mellett tudom olvasni a program elejét, és végét, tehát könnyebb átlátni az egészet. CodeBlocks-ban van ilyen split lehetőség, nagyon hasznos.
A hozzászólás módosítva: Szept 17, 2014
(#) kapu48 válasza Kovidivi hozzászólására (») Szept 17, 2014 /
 
Megnyitsz 1*re 2 arduniot ugyanazzal a projektal, és egymásmellé igazítod.
Mindkettőben szerkeszthetsz, csak ne feled elmenteni őket, mielőtt lefordítanád!
(#) proba válasza kapu48 hozzászólására (») Szept 18, 2014 /
 
Esetleg egy szomszéd ablakban egy szövegszerkesztővel.
(#) Kovidivi válasza kapu48 hozzászólására (») Szept 18, 2014 /
 
Köszönöm.
(#) Kovidivi hozzászólása Szept 18, 2014 /
 
Sziasztok!
Arduino Uno-ra írtam egy programot, ami egy gomb lenyomását figyeli, interruptban, tehát közben bármi csinálhat a proci. Megkülönbözteti a hosszú, és rövid gombnyomást is.
Ami kell hozzá: 3-as (interrupt 1-es) lábra kötni egy kapcsolót, a kapcsoló másik kontaktusa a GND-re. Soros monitoron keresztül kommunikál velünk a program.
Célja: egy Rotary Encoder gombját fogja kezelni, röviden nyomva menübe belép, hosszan nyomva kilép, vagy labortápnál ha tekered az encodert, akkor a feszültség változik, ha megnyomod a gombot, akkor az áram változik, ha hosszan nyomod, akkor beáll egy alapértelmezett értékre, vagy dupla tápnál a két oldal beállításai azonosak lesznek, stb.
A program minden változtatás nélkül futtatható, csak gomb kell hozzá, semmi más.
Aki akarja, nyugodtan használhatja.
  1. #define rotaryS 3       //3-as interrupt lábon van a kapcsoló
  2.  
  3. long changeido,changeidoelozo=0,gomballapot=0,gomballapotelozo=0;
  4.  
  5. void setup()
  6. {
  7.         Serial.begin(9600);
  8.         pinMode(rotaryS,INPUT);
  9.         digitalWrite(rotaryS,HIGH);
  10.         attachInterrupt(1,rotaryswitch, CHANGE);       
  11.                         //3-as lábra kötött kapcsoló
  12. }                       //interrupt1 - 3-as láb, interrupt0 - 2-es láb
  13.  
  14. void rotaryswitch()
  15. {
  16.   changeido=millis();                   //meghívás idejét eltárolom
  17.   if ((changeido-changeidoelozo)>(20))  //20mS pergésmentesítés
  18.   {
  19.     if (digitalRead(rotaryS)==LOW)      //benyomva = gnd-t kapok
  20.     {
  21.       gomballapotelozo=gomballapot;
  22.       gomballapot=1;                    //benyomva=1
  23.     }
  24.     else
  25.     {
  26.       gomballapotelozo=gomballapot;
  27.       gomballapot=0;
  28.     }
  29.     if ((gomballapotelozo==1)&&(gomballapot==0))        
  30.          //ha benyomott gomb el lesz engedve...
  31.     {
  32.       if ((changeido-changeidoelozo)<300)      
  33.               //kiszámolom az eltelt időt,ha ez kisebb, mint
  34.       {                     // 300mS, akkor rövid gombnyomás történt
  35.         Serial.print(" rovid <------ ");                //rövid gombnyomás volt
  36.         Serial.println(changeido-changeidoelozo);            //idő kiírása
  37.       }
  38.       else  
  39.         {
  40.           Serial.print(" -------> hosszu ");
  41.           Serial.println(changeido-changeidoelozo);
  42.         }
  43.     }
  44.     if (gomballapotelozo!=gomballapot)  //ha változás történt
  45.       changeidoelozo=changeido;
  46.   }
  47. }
  48.  
  49. void loop()
  50. {
  51.   //amit akarsz
  52.   Serial.print(".");
  53.   delay(300);
  54. }
A hozzászólás módosítva: Szept 18, 2014
(#) Brian88 válasza pepe1125 hozzászólására (») Szept 18, 2014 / 1
 
Szia

A kérdésedre a válasz:
Az 1. esetben, meghívsz egy függvényt ami ugye pár ciklus, ott bit összeadást hajt végre a program. (A PORTB lévő 8 bites értéket össze AND illetve OR műveletet végez vele attól függ LOW vagy HIGH értéket írtál-e be) ezért lassú.

2. esetben gyakorlatilag ezt mind kihagyod, és egyből írod a port értékét.

Továbbá amiért lassul a program: az arduinoba be van építve egy millis() függvény ami a bekapcsolástól számított eltelt időt méri. Ez a függvényben ugyan nem látszik a szerkesztőbe de beleíródik a programodba, és x időnként csinál egy megszakítást, és változtatja a millis() fgv értékét, ami ugye jó pár órajelet vesz időbe.
Ami még tovább lassít a soros port, nagyon összetett maga a soros port függvénye, mivel szinte univerzális, tud szöveget, karaktert szavakat stb kiírni, más más változót kezelni, és ez elég sok órajelbe telik. Ha nagyon gyors programot akarsz írni el kell felejteni az arduino környezetet sajnos
(#) kapu48 válasza Kovidivi hozzászólására (») Szept 18, 2014 /
 
Hi Kovidivi!

Igazán nem kötözködés! Csak egy pici logikai jó tanács.
Interupba ne használjál Serial.print-et!

Az ott túl hosszú lefutású, ezért felhalmozódnak a megszakítások.
És a végén verem túlcsordulás hibára fut a programod!

Interuptban csak be állítasz 1 jelzőt, hogy majd a programban ki kel írni a
Kiszámolt értékeidet.
(#) Kovidivi válasza kapu48 hozzászólására (») Szept 18, 2014 /
 
Szia!
Köszi a tanácsot. A soros monitor csak a visszaigazolásért felel, szemléltetés a célja.
Normál használat közben ki kell kommentezni, vagy törölni.
A hozzászólás módosítva: Szept 18, 2014
(#) ISF79 hozzászólása Szept 18, 2014 /
 
Sziasztok!

Leonardoval ismerkedem, az alábbi rövid kódban gombnyomásra egy háromjegyű számot kapok.
Viszont olyan problémám támadt, hogy "0" helyett "ö" betűt ír.
Ez mitől van, és hogy lehetne orvosolni?

Köszi

  1. int button = 4;
  2. int buttonState = 0;
  3.  
  4. void setup(){
  5.   Serial1.begin(9600);
  6.   Keyboard.begin();
  7. }
  8.  
  9. void loop(){
  10.   buttonState = digitalRead(button);
  11.   if (buttonState == HIGH){
  12.     delay(100);
  13.       Keyboard.print(random(0,9));
  14.       Keyboard.print(random(0,9));
  15.       Keyboard.print(random(0,9));
  16.       Keyboard.press(0xB0);
  17.       delay(50);
  18.       Keyboard.releaseAll();
  19.       delay(100);
  20.       Keyboard.end();
  21.   }
  22. }
(#) varttina válasza ISF79 hozzászólására (») Szept 19, 2014 / 1
 
Szia!

A Leonardo angol billentyűzetként működik, az operációs rendszer viszont magyar nyelvű eszközként kezeli. Ahol az angol billentyűzeten a "0" van ott a magyaron az "ö" betű.
Ha átállítom a billentyűkiosztást angolra a probléma megoldódik. Viszont az engem is érdekelne, hogy létezik-e olyan módszer, ami a billentyűzetkiosztás átállítása, valamint időigényes "fordító" szubrutin használata nélkül is helyesen működik.
(#) Kovidivi hozzászólása Szept 19, 2014 /
 
Sziasztok!
Ismerkedek az I2C kommunikációval, adatokat küldözgetnék oda-vissza master és slave között, egy feltételrendszer alapján. Azt nem tudom, hogy ha masterről kezdem a beszélgetést mindig, fixen egy wire.write(X); -tal, akkor a slave-en végrehajtódik a megfelelő függvény (Wire.onReceive(i2ckommunikacio), és ha én ezután masterről küldök egy request-et, akkor folytatódik az i2ckommunikacio függvényem, vagy kellene egy Wire.onRequest(i2ckommunikacio); a setup részbe? Nem tudtam még tesztelni a kódot sajnos. A lényeg, hogy beszélgetni szeretnék az Arduinok között, de nem tudom, hogy ez így jó-e.
  1. master:
  2.  
  3. void setup{
  4. Wire.begin();
  5. }
  6.  
  7. void i2ckommunikacio(){
  8. if (szinkronizalj)
  9.   {
  10.     Wire.beginTransmission(5);
  11.     Wire.write('A');  //szinronizálni kell! kérem az adatot slave-től
  12.     Wire.endTransmission();
  13.     Wire.requestFrom(5,2);  //2 byte kell, 2x8bit
  14.     reffeszA=Wire.read(); // 8 bit
  15.     refaramA=Wire.read(); // 8bit
  16.   }
  17.   else  //ha én nem szinkronizálok, akkor lehet a másik oldal akar?
  18.   {
  19.     Wire.beginTransmission(5);
  20.     Wire.write('B'); // kell szinkronizálni?
  21.     Wire.endTransmission();
  22.     Wire.requestFrom(5,1);
  23.     temp=Wire.read();
  24.     if (temp)  // kell hát! elküldöm neki az adatokat!
  25.     {
  26.       Wire.beginTransmission(5);
  27.       Wire.write(reffeszA);
  28.       Wire.write(refaramA);
  29.       Wire.endTransmission();
  30.     }
  31.   }
  32.   //most jön az alapeset, elkérem a 4 adatot a slave-től.
  33.     Wire.requestFrom(5,4);
  34.     reffeszB=Wire.read(); // 8 bit
  35.     refaramB=Wire.read(); // 8bit
  36.     mertfeszB=Wire.read();
  37.     mertaramB=Wire.read();
  38. }


  1. slave:
  2. void setup{
  3. Wire.begin(5);
  4. Wire.onReceive(i2ckommunikacio);
  5. }
  6.  
  7. void i2ckommunikacio(){
  8. char c=Wire.read();  // A vagy B lehet, más nem.
  9.   if (c=='A')
  10.   {
  11.     //szinkronizálni kell, elküldöm a 2byte-ot!
  12.     Wire.beginTransmission();
  13.     Wire.write(reffeszB); //fesz 8bit
  14.     Wire.write(refaramB); //aram 8bit
  15.     Wire.endTransmission();
  16.   }
  17.   if (c=='B') // megkérdezi master, hogy akarok-e szinkronziálni.
  18.   {
  19.     if (szinkronizalj) // ha kell szinkronizálnom, akkor
  20.     {                // elkérem az adatokat a mastertől
  21.       Wire.beginTransmission();
  22.       Wire.write(1); //ha kell, akkor 1-est küldök. egyébként nullát.
  23.       Wire.endTransmission();
  24.       //fogadom a 2 adatot:
  25.       reffeszB=Wire.read(); // 8 bit
  26.       refaramB=Wire.read(); // 8bit
  27.     }
  28.     else
  29.     {
  30.       Wire.beginTransmission();
  31.       Wire.write(0);    //nem kell szinkronizálni.
  32.       Wire.endTransmission();
  33.     }
  34.     //most jön az alap meló, 4 érték átküldése masternek
  35.     Wire.beginTransmission();
  36.     Wire.write(reffeszB);
  37.     Wire.write(refaramB);
  38.     Wire.write(temp1);
  39.     Wire.write(temp2);
  40.     Wire.endTransmission();
  41.   }
  42. }

Plusz egy kérdés: 10-12bit-es számot csak 8bitre felbontva tudok átküldeni?
Köszönöm.
A hozzászólás módosítva: Szept 19, 2014
(#) pepe1125 hozzászólása Szept 20, 2014 /
 
Nekem meg az lenne a kérdésem, hogyan lehet megoldani azt, hogy az egyik port bitjét átmásoljam egy másik portra?!

Egyszerűen csak továbbítani akarom az információt mondjuk a PIN5-ről a PIN13-ra.
Lehetőleg a leggyorsabban, és a digitalRead, digitalWrite nem elég...

  1. void setup() {
  2. DDRB = 0x00;
  3. DDRD = 0xFF;
  4. }
  5.  
  6. void loop() {
  7. PORTD = PINB; //Ezzel az a baj, hogy csak egy irányba működik és a teljes portot lefoglalja.
  8. }


Ötlet?!
(#) kapu48 válasza pepe1125 hozzászólására (») Szept 20, 2014 / 1
 
A kérdésed nem egyértelmű mi a feladat?

Ha csak 1 bit átvitel akkor:
int i = bitRead (PORTB, n);
if(i){
bitSet (PORTD, n);
}else{
bitClear (PORTD, n);
}
...?
(#) pepe1125 válasza kapu48 hozzászólására (») Szept 20, 2014 /
 
Köszi!

Igen, egy bit átvitele a cél, helyesebben kettő...

Egyik ad, másik vesz. Gyakorlatilag csak meg kell ismételnie a jelet amit kap.

Tehát akkor if nélkül nem úszom meg?!
(#) kapu48 válasza pepe1125 hozzászólására (») Szept 20, 2014 /
 
Esetleg próbáldmeg:
int i = bitRead (PORTB, 6);
bitWrite(PORTD,4, i); // Nem biztos, hogy rövidebb lessz a kód???
A hozzászólás módosítva: Szept 20, 2014
(#) kapu48 válasza pepe1125 hozzászólására (») Szept 20, 2014 /
 
Vagy:
bitWrite(PORTD,4, bitRead (PORTB, 6)); //?
(#) pepe1125 válasza kapu48 hozzászólására (») Szept 20, 2014 /
 
Na ez valamiért nekem nem ment:
  1. bitWrite(PORTD,4, bitRead (PORTB, 6));


próbáltam
(#) kapu48 válasza pepe1125 hozzászólására (») Szept 20, 2014 /
 
Én csak Ellenöriztem nem futtatam!

Esetleg?:
bitWrite(PORTD,4, (bitRead (PORTB, 6)));
Vagy?:
if(bitRead (PORTB, 6)){
bitSet (PORTD, 4);
}else{
bitClear (PORTD, 4);
}
(#) pepe1125 válasza kapu48 hozzászólására (») Szept 21, 2014 /
 
Nos, ez megy 100% (tesztelve) -->
1. verzió:
  1. int i = bitRead (PIND, 2); // ITT FIGYELNI, HOGY PINx kell és nem PORTx!!!
  2. if(i){
  3. bitSet (PORTB, 5);
  4. }else{
  5. bitClear (PORTB, 5);
  6. }


2. verzió:
  1. bitWrite(PORTB,5, bitRead (PIND, 2)); // Szintén a PINx és a PORTx probléma!!!


De amúgy nem értem az Arduino Referenciát sem, mert beleírhatott volna egy mintát legalább!!!
De rájöttem, hogy idióta voltam, mert folyamatosan a PORTD-vel próbálkoztam port beolvasásra, holott a PIND regiszter tárolja ezt!!! WÁÁÁÁÁÁ! Tessék tanulni a hibámból! És köszönöm a segítséget!
A hozzászólás módosítva: Szept 21, 2014
(#) kapu48 válasza pepe1125 hozzászólására (») Szept 21, 2014 / 1
 
Ez van, sajnos néha figyelmetlenek vagyunk!

A legtöbb hibakeresésre fordítót időt, emberi tényező idézi elő!

Az Arduino Helpje sajnos =0!
De sajnos szinte minden FRE program ilyen.
A hozzászólás módosítva: Szept 21, 2014
(#) kisedison hozzászólása Szept 22, 2014 /
 
Üdv mindenkinek!

Akadt egy kis gondom Arduino Nano 3-mal. Rákötöttem egy LCD modult sorba a lábaira (5, 6, 7, 8, 9, 10) de valamiért nem hajlandó működni. Még csak nem is inicializálja a modult mert azon változatlanul a felső sor aktív. 24x4-es modulról van szó, sima mezei HD44780 kompatibilis panel. MSP430G2553-as vezérlővel Energiából programozva kiválóan működik ugyan úgy a LiquidCrystal könyvtárral. Ha valaki tudja/sejti mi lehet a gond kérem ne hallgassa el.

Szép napot!

A kód:
  1. #include <LiquidCrystal.h>
  2.  
  3. // initialize the library with the numbers of the interface pins
  4. LiquidCrystal lcd(5, 6, 7, 8, 9, 10);
  5.  
  6. void setup() {
  7.   // set up the LCD's number of columns and rows:
  8.   lcd.begin(24, 2);
  9.   // Print a message to the LCD.
  10.   lcd.print("hello, world!");
  11. }
  12.  
  13. void loop() {
  14.   // set the cursor to column 0, line 1
  15.   // (note: line 1 is the second row, since counting begins with 0):
  16.   lcd.setCursor(0, 1);
  17.   // print the number of seconds since reset:
  18.   lcd.print(millis()/1000);
  19. }
A hozzászólás módosítva: Szept 22, 2014
(#) kisedison válasza kisedison hozzászólására (») Szept 22, 2014 /
 
Rájöttem mit csesztem el. Még új nekem az Arduino lábszámozása. Akár törölni is lehet a hozzászólásomat.
(#) Kovidivi hozzászólása Szept 22, 2014 /
 
Sziasztok!
Van valakinek CH340-es IC-vel szerelt Arduinoja? Ha veszek egy olyat is, akkor össze fog akadni a két driver, vagy a gép mindig felismeri, melyikkel van dolga? Kell vele szenvedni, vagy csak egyszer kell felrakni a drivert, és megy, mint a normál Arduino? Mennyire ajánlott? Köszönöm!
Következő: »»   47 / 851
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem