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   731 / 842
(#) gordonfreemN hozzászólása Feb 27, 2022 /
 
Sziasztok.

Az arduino uno-n hogyan tudnék letárolni változó értékét (4érték), oly módon, hogy egy ki és bekapcsolást követően elérhető legyen?
A hozzászólás módosítva: Feb 27, 2022
(#) Massawa válasza gordonfreemN hozzászólására (») Feb 27, 2022 / 1
 
Elrakod az eepromba, és minden inditás után abbol olvasod ki az utolso beirt értéket.
(#) gordonfreemN válasza Massawa hozzászólására (») Feb 27, 2022 /
 
köszi szépen, király vagy! (nem tudtam, hogy van eeprom, adatlapot bogarásztam épp).
(#) gordonfreemN hozzászólása Feb 27, 2022 /
 
Elkészültem, nem tudom van-e arra ehetőség, hogyha ide megosztom a programot, megnézitek, követtem-e el valami oltári hibát?
Első találkozásom a mikrovezérlőkkel...
(#) GPeti1977 válasza gordonfreemN hozzászólására (») Feb 27, 2022 /
 
Mekkora értékek lennének? Byte?
(#) gordonfreemN válasza GPeti1977 hozzászólására (») Feb 27, 2022 /
 
neeem, int típusba mentem, 0,1,2,3 és 4 ami előfordulhat de tárolásra csak az 1,2,3, azaz 2bit.
(#) gordonfreemN válasza gordonfreemN hozzászólására (») Feb 27, 2022 /
 
De maga a valtozó természetesen 2byte-ot foglal.
(#) GPeti1977 válasza gordonfreemN hozzászólására (») Feb 27, 2022 /
 
A 4 nem fér bele az egy byteba? Engem is meglepett az arduino mert előtte használtam a bascomot ami lekezelte a változók tipusait, viszont az arduino nál neked kell a változókat byteokra szedni úgy beleirni, értelemszerűen kiolvasáskor bytokból összerakni, szerencsére akár float változóra is van megoldás.
(#) Jonni válasza gordonfreemN hozzászólására (») Feb 27, 2022 /
 
Meg tudod osztani ha akarod. Alul van egy zöld gomb Kód felirattal , oda lehet beilleszteni a kimásolt kódot.
(#) Josi777 válasza GPeti1977 hozzászólására (») Feb 27, 2022 /
 
Idézet:
„viszont az arduino nál neked kell a változókat byteokra szedni úgy beleirni”

Nem kell. Az EEPROM.h könyvtár kezeli a változók típusát, valamint a magad által létrehozott változók struktúráját is. A következő EEPROM címet pedig a sizeof() függvénnyel lehet kiszámítani.
(#) Josi777 válasza gordonfreemN hozzászólására (») Feb 27, 2022 /
 
Itt megtalálod a megoldást: EEPROM kezelése
(#) gordonfreemN válasza Jonni hozzászólására (») Feb 27, 2022 /
 
  1. #include <EEPROM.h>
  2. const int led1=5;
  3. const int led2=7;
  4. const int led3=8;
  5. const int led4=9;
  6. const int led5=11;
  7. const int led6=13;
  8. const int button1=2;
  9. const int button2=3;
  10.       int buttonstate1 = HIGH;
  11.       int buttonstate2 = HIGH;
  12.       int lastbuttonstate1 = HIGH;
  13.       int lastbuttonstate2 = HIGH;
  14.       int ca = EEPROM.read(0); //counter variable a
  15.       int cb = EEPROM.read(1); //counter variable b
  16.  
  17.  
  18. void setup()
  19. {
  20.   Serial.begin(9600);
  21.   pinMode(led1, OUTPUT);
  22.   pinMode(led2, OUTPUT);
  23.   pinMode(led3, OUTPUT);
  24.   pinMode(led4, OUTPUT);
  25.   pinMode(led5, OUTPUT);
  26.   pinMode(led6, OUTPUT);
  27.   pinMode(button1, INPUT);
  28.   pinMode(button2, INPUT);
  29.   Serial.println("counter value:");
  30. }
  31.  
  32. void loop()
  33. {
  34.   if (ca == 0) {ca = 1;} //első bekapcsoláshoz, amikor az eepromba még nem írt
  35.   buttonstate1=digitalRead(button1); //gomb állapot kiolvasása
  36.   if (buttonstate1 != lastbuttonstate1) //gombnyomás történt? Gomb állapota változott az előzőhöz képest?
  37.   {
  38.     delay(50); //ha történt változás az előző állapothot képest, várj 50ms-ot
  39.     if (buttonstate1 == LOW) //ha a gomb nyomva, azaz bemenet értéke alacsony akkor
  40.     {
  41.      //Serial.println(buttonstate1); //irja ki a gomb aktuális állapotát
  42.      ca++; //növelje ca változó értékét egyel, kiindulóérték egy
  43.      Serial.println(ca); //írja ki ca változó értékét
  44.     }
  45.   }
  46.     switch (ca) { //ca változó használata
  47.     case 1: //ha értéke egy
  48.     digitalWrite(led1, HIGH);
  49.     digitalWrite(led2, LOW);
  50.     digitalWrite(led3, LOW);
  51.     break;
  52.     case 2: //ha értéke kettő
  53.     digitalWrite(led1, LOW);
  54.     digitalWrite(led2, HIGH);
  55.     digitalWrite(led3, LOW);
  56.     break;
  57.     case 3: //ha értéke három
  58.     digitalWrite(led1, LOW);
  59.     digitalWrite(led2, LOW);
  60.     digitalWrite(led3, HIGH);
  61.     break;
  62.     case 4: //ha értéke 4
  63.     ca=1; //ca értéke legyen ismét egy
  64.     break;
  65.     }  
  66. lastbuttonstate1 = buttonstate1; //gomb előző állapotát írja be a gomb aktuális állapotának
  67. EEPROM.update(0, ca); //tegye eepromba a ca változó értékét
  68. //-----------------------------------------------------
  69.   if (cb == 0) {cb = 1;}
  70.   buttonstate2=digitalRead(button2);
  71.   if (buttonstate2 != lastbuttonstate2)
  72.   {
  73.     delay(50);
  74.     if (buttonstate2 == LOW)
  75.     {
  76.      //Serial.println(buttonstate1);
  77.      cb++;
  78.      Serial.println(cb);
  79.     }
  80.   }
  81.     switch (cb) {
  82.     case 1:
  83.     digitalWrite(led4, HIGH);
  84.     digitalWrite(led5, LOW);
  85.     digitalWrite(led6, LOW);
  86.     break;
  87.     case 2:
  88.     digitalWrite(led4, LOW);
  89.     digitalWrite(led5, HIGH);
  90.     digitalWrite(led6, LOW);
  91.     break;
  92.     case 3:
  93.     digitalWrite(led4, LOW);
  94.     digitalWrite(led5, LOW);
  95.     digitalWrite(led6, HIGH);
  96.     break;
  97.     case 4:
  98.     cb=1;
  99.     break;
  100.     }  
  101. lastbuttonstate2 = buttonstate2;
  102. EEPROM.update(1, cb);
  103. }
(#) GPeti1977 válasza gordonfreemN hozzászólására (») Feb 28, 2022 / 1
 
Ez így jól működik?
Kicsit módosítottam de nem próbáltam
  1. #include <EEPROM.h>
  2. const int led1 = 5;
  3. const int led2 = 7;
  4. const int led3 = 8;
  5. const int led4 = 9;
  6. const int led5 = 11;
  7. const int led6 = 13;
  8. const int button1 = 2;
  9. const int button2 = 3;
  10. int buttonstate1 = HIGH;
  11. int buttonstate2 = HIGH;
  12. int lastbuttonstate1 = HIGH;
  13. int lastbuttonstate2 = HIGH;
  14. byte ca;
  15. byte cb;
  16.  
  17. void setup()
  18. {
  19.   Serial.begin(9600);
  20.   pinMode(led1, OUTPUT);
  21.   pinMode(led2, OUTPUT);
  22.   pinMode(led3, OUTPUT);
  23.   pinMode(led4, OUTPUT);
  24.   pinMode(led5, OUTPUT);
  25.   pinMode(led6, OUTPUT);
  26.   pinMode(button1, INPUT);
  27.   pinMode(button2, INPUT);
  28.   delay(200);
  29.   ca = EEPROM.read(0); //counter variable a
  30.   cb = EEPROM.read(1); //counter variable b
  31.   Serial.println("counter value:");
  32. }
  33.  
  34. void loop()
  35. {
  36.   if (ca == 0) {
  37.     ca = 1; //első bekapcsoláshoz, amikor az eepromba még nem írt
  38.   }
  39.   buttonstate1 = digitalRead(button1); //gomb állapot kiolvasása
  40.   if (buttonstate1 != lastbuttonstate1) //gombnyomás történt? Gomb állapota változott az előzőhöz képest?
  41.   {
  42.     delay(50); //ha történt változás az előző állapothot képest, várj 50ms-ot
  43.     if (buttonstate1 == LOW) //ha a gomb nyomva, azaz bemenet értéke alacsony akkor
  44.     {
  45.       //Serial.println(buttonstate1); //irja ki a gomb aktuális állapotát
  46.       ca++; //növelje ca változó értékét egyel, kiindulóérték egy
  47.       Serial.println(ca); //írja ki ca változó értékét
  48.     }
  49.   }
  50.   switch (ca) { //ca változó használata
  51.     case 1: //ha értéke egy
  52.       digitalWrite(led1, HIGH);
  53.       digitalWrite(led2, LOW);
  54.       digitalWrite(led3, LOW);
  55.       break;
  56.     case 2: //ha értéke kettő
  57.       digitalWrite(led1, LOW);
  58.       digitalWrite(led2, HIGH);
  59.       digitalWrite(led3, LOW);
  60.       break;
  61.     case 3: //ha értéke három
  62.       digitalWrite(led1, LOW);
  63.       digitalWrite(led2, LOW);
  64.       digitalWrite(led3, HIGH);
  65.       break;
  66.     case 4: //ha értéke 4
  67.       ca = 1; //ca értéke legyen ismét egy
  68.       break;
  69.  
  70.     default:
  71.       ca = 1;
  72.   }
  73.   lastbuttonstate1 = buttonstate1; //gomb előző állapotát írja be a gomb aktuális állapotának
  74.   EEPROM.update(0, ca); //tegye eepromba a ca változó értékét
  75.   //-----------------------------------------------------
  76.   if (cb == 0) {
  77.     cb = 1;
  78.   }
  79.   buttonstate2 = digitalRead(button2);
  80.   if (buttonstate2 != lastbuttonstate2)
  81.   {
  82.     delay(50);
  83.     if (buttonstate2 == LOW)
  84.     {
  85.       //Serial.println(buttonstate1);
  86.       cb++;
  87.       Serial.println(cb);
  88.     }
  89.   }
  90.   switch (cb) {
  91.     case 1:
  92.       digitalWrite(led4, HIGH);
  93.       digitalWrite(led5, LOW);
  94.       digitalWrite(led6, LOW);
  95.       break;
  96.     case 2:
  97.       digitalWrite(led4, LOW);
  98.       digitalWrite(led5, HIGH);
  99.       digitalWrite(led6, LOW);
  100.       break;
  101.     case 3:
  102.       digitalWrite(led4, LOW);
  103.       digitalWrite(led5, LOW);
  104.       digitalWrite(led6, HIGH);
  105.       break;
  106.     case 4:
  107.       cb = 1;
  108.       break;
  109.     default:
  110.       cb = 1;
  111.   }
  112.   lastbuttonstate2 = buttonstate2;
  113.   EEPROM.update(1, cb);
  114. }
(#) gordonfreemN válasza GPeti1977 hozzászólására (») Feb 28, 2022 /
 
Igen, teljesen jól ment, kikapcs után is megmaradtak az állapotok. Mit kellett módosítani?
(#) gordonfreemN válasza gordonfreemN hozzászólására (») Feb 28, 2022 /
 
Látom. Byte-ként hataroztad meg a számlálókat, azok változóit. Ezt nem ismerem, majd utánanézek. Jobb gondolom mint a var, esetleg nem foglal le, csak egy byte-ot a kettő helyett?

A másik, hogy te a void setupba állitottad be az eepromból ezek értékeit nem a változók deklarásánál.
Ez csak így korrektebb, vagy van egyéb oka a modszernek? Azért kérdezem, hogy a jóvöben hogyan járjak el. En eddig azt gondoltam, a void setup a ki és bemenetek beállitására van.
(#) sargarigo válasza gordonfreemN hozzászólására (») Feb 28, 2022 / 1
 
Idézet:
„En eddig azt gondoltam, a void setup a ki és bemenetek beállitására van.”

Majdnem. A setup a program indulásakor fut le, és pontosan egyszer. A ki és bemenetek beállítása is itt célszerű pontosan ezért. De nem "erre van", hanem az olyan dolgokat elvégezni, amiket egyszer induláskor kell elvégezni. Tehát a fent említett beállításokat is.
(#) gordonfreemN válasza sargarigo hozzászólására (») Márc 1, 2022 /
 
Már csak egyet nem értek. Akkor a konstansok értékadását vagy pl a buttonstate = HIGH értékbeállítást miért nem ebben a setup-ban végzik el általában? Hiszen a buttonstate-nek is ezt a HIGH értéket csak induláskor kell egyszer beadni.
Mint esetemben is, az egyéb (globális) változók nem bántották a szemed, egyedül a counter.
Akkor tulajdonképpen a setup előtti részt is (frame? nem tudom mi a neve) lehetne a setupban létrehozni ha csak egyszer kellene beállítani, a könyvtárhasználatot kellene csak a setup előtt megadni?
A hozzászólás módosítva: Márc 1, 2022
(#) gordonfreemN válasza gordonfreemN hozzászólására (») Márc 1, 2022 /
 
Bocs, nem a te szemed, hanem GPeti1977-ét
(#) sargarigo válasza gordonfreemN hozzászólására (») Márc 1, 2022 / 1
 
Változóknak lehet kezdeti értékadni a deklarációnál is, de a setup-ban is. A setup futásidőben dolgozik, de ha a deklarációs részben adsz értéket, akkor azt még a fordító végzi el. Tehát ebben az esetben maga a tárgykód már úgy van elkészítve, hogy a változód értéke be van állítva. A setup mivel induláskor teszi meg ezt, alkalmas arra is, hogy a processzor regisztereit, portjait beállítsa. Tehát deklarációként nem tudod pl a timert indítani, mert az egy hardveres eszköz, muszáj futásidőben. Nem tudom érthetően sikerült-e leírnom
(#) sdrlab válasza sargarigo hozzászólására (») Márc 1, 2022 /
 
Ezek a választható opciók!
De pl modulszintű konstansokat nem tudsz létrehozni a setupban(vagy máshol), csakis deklarálással!
Ez igaz a változókra is...
(#) gordonfreemN válasza sargarigo hozzászólására (») Márc 1, 2022 /
 
A nagy része úgy érzem teljes mértékben világos.
Mindjárt kiderül a többi.
A korrekt megoldás, ha a setupban van kiolvasva és átadva bármi az eeprom-ból, de a tapasztalat szerint akkor az atmega tud forditáskor is eeprom-ból olvasni, de ez kicsit vagy vagy? Értem ezt általanosságban, nem kifejezetten az atmegánál.

Modulszintü konstans az, amivel pl. kimenetet állitok be?
A hozzászólás módosítva: Márc 1, 2022
(#) majkimester válasza sargarigo hozzászólására (») Márc 1, 2022 /
 
Idézet:
„A setup futásidőben dolgozik, de ha a deklarációs részben adsz értéket, akkor azt még a fordító végzi el.”

A fordítás eredménye az amit a FLASH-be töltesz. A RAM-ba nem töltesz direktben semmit, ami a fordítás eredménye, azaz mindegy, hogy a deklarációnál vagy a setup-ban adsz értéket egy változónak, az bizony a kód futtatása által lesz inicializálva. A különbség csak annyi, hogy az egyik ténylegesen a setup-ból fordított kódból történik, a másik meg előtte egy a fordító által generált inicializáló kódrészletből.
A hozzászólás módosítva: Márc 1, 2022
(#) Massawa hozzászólása Márc 1, 2022 /
 
Valahol láttam egy megoldást, ahol a PWM kimenetet egy változoba töltötték, amit ezután elvben bármelyik portra fel lehet használni. Sajnos nem jut az eszembe hol is volt.
Egy olyan szerkezeten dolgozok, aminek kimenetei egy-egy LEDet hajtanak. Minden kimenetet idöben lehet ki-be kapcsolni, és 3 különféle változot rávezetni.
1. Sima High/Low ( ki be kapcsol)
2. PWM fényeröség változot elalszik majd ujra lassan elkezd világitani.
3. Véletlen jelekkel villog ( Random)
Még nincs kész a végleges cucc, de az 1. meg 3. dolog már egy régebbi berendezésben müködik. Igaz az csak a codeban programozhato ( a PCröl), most meg magán a berendezésen lesz programozási lehetöség ( egy tömb tartalmának a manuális bevitele néhány nyomogombbal meg kis displayjel).
Elvben nagyon hasonlit egy zenei sequencerre, vagy egy disco világitás meghajtojára.
(#) Josi777 hozzászólása Márc 7, 2022 /
 
Sziasztok.
Valaki meg tudná mondani, hogy egy ATmega168-as procinál, aminek 1k RAM-ja van, mennyi marad szabadon a bootloader feltöltése után?
(#) vargham válasza Josi777 hozzászólására (») Márc 7, 2022 / 2
 
A bootloader nem csökkenti a felhasználói program által elérhető RAMot, csak a flasht.
(#) melorin hozzászólása Márc 7, 2022 /
 
Sziasztok!
Szenvedek egy motor PWM szabályzásával.
Találtam a neten egy nagyon rövidke programot, abban ha átírom az analogwrite értékét akkor változik a motor fordulatszáma. De ahogy implementálom a saját kódomba, meg sem moccan a motor. Mit ronthatok el? A csatolt képen baloldalt az enyém, jobboldalt a működő kód.
(#) sargarigo válasza melorin hozzászólására (») Márc 7, 2022 /
 
Mivel a lényegi rész ugyanaz, szerintem a megszakítás akad össze benne. Próbáld meg kikommentelni a megszakításos részt, és úgy nézd meg hogy működik-e a motorod!
(#) melorin válasza sargarigo hozzászólására (») Márc 7, 2022 /
 
Elég komplex a megszakításos rész, melyik részét kommentáljam ki?
Egyébként az még hozzátartozik a történethez, hogy ugyanez a kód működik ha a motorvezérlőt át-jumperelem és szimplán amit az in1 in2-ről kap jelet, maxon forgatja a motort. Egyszerűen csak az analóg kimenetet nem tudja értelmezni és így meg sem nyikkan.
(#) mateatek válasza melorin hozzászólására (») Márc 7, 2022 /
 
Talán az zavarhat be, hogy a loop-ban van, másodpercenként nagyon, de nagyon sokszor lefut. Nem olvastam át teljesen az analogWrite() forrását, de lehet, hogy nem kellene másodpercenként százezerszer beállítani az 500 Hz-es PWM-et.
(#) melorin válasza mateatek hozzászólására (») Márc 7, 2022 /
 
Akkor a példa kódban miért működik?
Következő: »»   731 / 842
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