Arduino ,vytvorenie funkcie s premennými

Ak hľadáte nejaký softvér do PC prípadne ak s ním máte nejaký problém.

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
cartmantt
Stály člen
Stály člen
Príspevky: 362
Dátum registrácie: 13 Mar 2009, 00:00
Bydlisko: Bratislava
Vek: 24

Arduino ,vytvorenie funkcie s premennými

Príspevok od používateľa cartmantt » 13 Aug 2021, 20:26

Zdravím ,mám takto napísanú funkciu ...

void SaveToEeprom() {
TL_Eeprom1 = pcf.read(1);
if ((TL_Eeprom1 == false) && (menu == 11)) {
EEPROM.write(0,rychlostM1);
delay(10);
temporary = menu;
menu = 100;
updateMenu();
delay(1000);
menu = temporary;
updateMenu();
}
else if ((TL_Eeprom1 == false) && (menu == 12)) {
EEPROM.write(1,smerM1);
delay(10);
temporary = menu;
menu = 100;
updateMenu();
delay(1000);
menu = temporary;
updateMenu();
}
else if ((TL_Eeprom1 == false) && (menu == 13)) {
EEPROM.write(2,OnOffM1);
delay(10);
temporary = menu;
menu = 100;
updateMenu();
delay(1000);
menu = temporary;
updateMenu();
}

tri podmienky ,okrem prvých dvoch riadkov sa všetko opakuje ,
chcel by som to skrátiť a zapísať funkciou podľa vzoru:
int uloz (int a ,int b)
EEPROM.write(a,b);
zbytok programu jednej podmienky...

a tuto funkciu by som potom 3x volal ,vie mi niekto poradit ako by to vyzeralo ,
alebo aspon trocha naviesť? dakujem..
0

Používateľov profilový obrázok
feros
Stály člen
Stály člen
Príspevky: 414
Dátum registrácie: 23 Sep 2010, 00:00
Bydlisko: okres Nitra

Re: Arduino ,vytvorenie funkcie s premennými

Príspevok od používateľa feros » 14 Aug 2021, 07:40

nechápem celkom čo chceš spraviť
ale možno cez switch , case prepinať podľa "menu"

void SaveToEeprom ( int menu)

void mkflk ()
delay(10);
temporary = menu;
menu = 100;
updateMenu();
delay(1000);
menu = temporary;
updateMenu();

switch (menu)
case 11:
EEPROM.write(0, rychlostM1);
mkflk
case 12:
...
0

Používateľov profilový obrázok
mac26
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1298
Dátum registrácie: 01 Feb 2010, 00:00
Bydlisko: Martin

Re: Arduino ,vytvorenie funkcie s premennými

Príspevok od používateľa mac26 » 14 Aug 2021, 07:45

Nieco taketo?

Kód: Vybrať všetko

void SaveToEeprom() {
	TL_Eeprom1 = pcf.read(1);
	if(TL_Eeprom1)
		return;

	switch(menu){
		case 11:
			EEPROM.write(0,rychlostM1);
			break;
		case 12:
			EEPROM.write(1,smerM1);
			break;
		case 13:
			EEPROM.write(2,OnOffM1);
			break;
		}
		
		delay(10);
		temporary = menu;
		menu = 100;
		updateMenu();
		delay(1000);
		menu = temporary;
		updateMenu();
}
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Arduino ,vytvorenie funkcie s premennými

Príspevok od používateľa peterple » 14 Aug 2021, 17:16

Vyzeralo by to takto. Funkcia:

Kód: Vybrať všetko

void uloz (int adr, int value){
  int temporary;
  EEPROM.write(adr,value);
  delay(10);
  temporary = menu;
  menu = 100;
  updateMenu();
  delay(1000);
  menu = temporary;
  updateMenu();
  }
Volanie

Kód: Vybrať všetko

if ((TL_Eeprom1 == false) && (menu == 11)) {
  uloz(0,rychlostM1);
}
Funkciu som dal void (nevracia nič) lebo nevidím že by si tam niečo potreboval vrátiť. Toto bude samozrejme fungovať iba za predpokladu že premenná menu, je globálna. Samozrejme to testovanie môže byť aj cez switch to je viac menej fuk.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
cartmantt
Stály člen
Stály člen
Príspevky: 362
Dátum registrácie: 13 Mar 2009, 00:00
Bydlisko: Bratislava
Vek: 24

Re: Arduino ,vytvorenie funkcie s premennými

Príspevok od používateľa cartmantt » 03 Sep 2021, 12:02

Ďakujem peterple ,presne to som potreboval..
len mám ešte jeden problém s funkciou millis..
prepínam 4 výstupy na motor pomocou joysticku ,aj do jedného ,
aj druhého smeru ,predtým som to mal robené funkciou delay a
išlo to bezchybne.. potom som to spravil cez millis ,funguje tiež ,
ale po pár prepnutiach smeru joystickom ,či už ním prepnem smer
rýchlo ,alebo pomaly ,zostane svietiť jeden výstup a znova rozhýbať
ho pomôže jedine reset arduina.. aj som si dal monitorovať sériovým
portom hodnotu pri pohybovaní joystickom a tú ukazovalo správne..
kde môže byť chyba? ďakujem za rady..
tu je program..

Kód: Vybrať všetko

//joystick M1
int joyM1 = A1;       
int stredM1;           
int aktM1;             
int DH_M1;            
int HH_M1;

 //motor M1
int c1 = 5;
int c2 = 6;
int c3 = 7;
int c4 = 8;
int krokM1 = 1;
int merkerM1;
byte rychlostM1 = 100;

unsigned long cas = 0;


void setup() {
   pinMode(c1,OUTPUT);
   pinMode(c2,OUTPUT);
   pinMode(c3,OUTPUT);
   pinMode(c4,OUTPUT);
   stredM1 = analogRead(joyM1);
   HH_M1 = stredM1+50;
   DH_M1 = stredM1-50;
}

void loop() {
   manualAuto();
}

void krokovanieMotoraM1() {
  switch (krokM1) {
    case 1: 
      digitalWrite(c1,1);
      digitalWrite(c2,0);
      digitalWrite(c3,0);
      digitalWrite(c4,0);
      break;
    case 2:
      digitalWrite(c1,0);
      digitalWrite(c2,1);
      digitalWrite(c3,0);
      digitalWrite(c4,0);
      break;
    case 3:
      digitalWrite(c1,0);
      digitalWrite(c2,0);
      digitalWrite(c3,1);
      digitalWrite(c4,0);
      break;
    case 4:
      digitalWrite(c1,0);
      digitalWrite(c2,0);
      digitalWrite(c3,0);
      digitalWrite(c4,1);
      merkerM1 = 0;
      break;
  }
    if (krokM1 < 1) {
      merkerM1 =1;
      (krokM1 = 5); 
    }
    if ((krokM1 > 4) && (merkerM1 != 1)) {
      (krokM1 = 0); 
    }
}

void manualAuto() {
     aktM1 = analogRead(joyM1);
   if (aktM1 > HH_M1) { 
    if (millis() >= cas + rychlostM1) {
    krokM1++;
    krokovanieMotoraM1();
    cas = millis();
    }
  }
   if (aktM1 < DH_M1) { 
    if (millis() >= cas + rychlostM1) {
    krokM1--;
    krokovanieMotoraM1();
    cas = millis();
    }    
  }  
}
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Arduino ,vytvorenie funkcie s premennými

Príspevok od používateľa peterple » 03 Sep 2021, 23:51

celý bordel ti tam robí premenná merker (pravdepodobne marker). Keby si písal do programu aj komentáre nemusel som 5 min dumať na čo je.

Scenár chyby je nasledovný. Ide to do do plusu - žiadny problém.
dáš smer do mínusu - zatiaľ žiadny problém
dáš to do plusu v momente keď máš krokM1 práve 5.
Od tohoto momentu to už stojí lebo switch s hodnotou 5 neuvažuje (ani s hodnotou 0)
a ten druhý if čo by to mal vynulovať to nevynuluje lebo (madam) merkel je 1
krokM1 sa potom síce každých 100ms posunie o 1 Ale je to int a maximum je 32000 a nejaké drobné.
To je skoro hodina než to pretečie do záporu a ani to nepomôže. Lebo if to nastaví znova na 5 a merker zostane na 1 a sme tam kde sme začali.

Merkel vôbec nepotrebuješ ak použiješ vhodne else.

Potom tam máš ďalšiu chybu ktorá sa síce prejaví len raz za 50 dní tak že 100ms budeš krokovať motor strašnou rýchlosťou čo tie slučky dokážu. Lebo nevieš správne použiť millis a nevieš ako funguje celočíselná aritmetika. Kedže si na tomto fóre jeden v rade a preto som o tom dávnejšie spísal tento elaborát
http://www.plesnik.sk/Sim/millis.html

Také detaily že ti vypadávaju na 100ms impulzy keď pretáčaš cyklus fáz si hádam poriešiš sám.
Úplne posledná vec ktorá je fakt už len nepodstatný detail je že máš vďaka tým strašne pomalým funkciam digitalWrite zapnuté na niekoľko desiatok μs obe fázy ale to hádam ničomu nevadí. Leda tak pre reverzácii ale to som úplne neanalyzoval.

Moje doporučenie kód vyhodiť a napísať inak od znova.
Profík by nepoužil digitalWrite, ale zapisoval by naraz celý port. Teda dúfam že je to na jednom porte. A ak by to bolo pekne po susedných bitoch tak by použil rotácie a nie tú divočinu so switch.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
cartmantt
Stály člen
Stály člen
Príspevky: 362
Dátum registrácie: 13 Mar 2009, 00:00
Bydlisko: Bratislava
Vek: 24

Re: Arduino ,vytvorenie funkcie s premennými

Príspevok od používateľa cartmantt » 05 Sep 2021, 17:55

Takže v tom merkeri je chyba ,tipoval som ,že možno nejako zblbne
funkcia millis.. Zo začiatku som chcel aj ja použiť rotáciu ,lenže
budem mať obsadené všetky piny na porte ,resp. na celom arduine
okrem analógových..takže asi by nebolo možné vykonávať rotáciu len
na 4 bitoch ,kedže ostatné bity menia tiež svoj stav.. navyše ,ak by som
mal aj ostatné 4 bity prázdne ,tiež by som riešil prehodenie fáz z prvého
bitu na štvrtý a naopak rovnakou podmienkou – merkerom ,pretože na
lepší sposob som neprišiel.. a to vypadávanie impulzov na 100ms mi
vadí ,ale zatiaľ neviem ako to vyriešiť.. nejaké tipy pre zelenáča? :yawinkle:
Je vidieť ,že máš s programovaním veľa skúseností ,to ja píšem toto svoj
prvý vačší program v ,ktorom chcem ovládať dva unipolárne motory
joystickom ,alebo automat a rýchlosť ,smer atď. budem ovládať
enkodérom v menu na LCD displeji.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Arduino ,vytvorenie funkcie s premennými

Príspevok od používateľa peterple » 05 Sep 2021, 20:40

ked chceš riadiť 4 piny portu plus ďalšie piny. Robí sa to tak, že sa požívajú funkcie and a or. Volá sa to aj maskovanie. Prečítaš si port. Bity čo chceš zmeniť vymaskuješ a pridáš tie čo tam treba a pošleš na port.

Kód: Vybrať všetko

char tmp = PORTB;
tmp &= 0xF0;  //zachova horne 4 bity
if (phase==0 || phase>0x08) phase=1; //pociatocna inicializacia, kontrola ci tam nie je blba hodnota
if (dir) { //podla smeru otacania
  phase <<=1;
  if (phase>0x08) phase=1;
} else {
  phase >>=1;
  if (phase==0) phase=0x08;
}
tmp |=phase;
PORTB=tmp;
Takto nejako. A zvyčajne sa to rieši v prerušení od časovač. Riadenie rýchlosti cez millis je možné ale ak má MCU aj robiť nejaké užívateľské rozhranie tak vlastné riadenie časovačov je lepšie. Ale to až potom čo trochu očervenieš.

Jáj a ešte by som dodal že analógové bity sa dajú použiť aj ako digitálne. Že sa dajú pripojiť na AD prevodník je len spešl funkcia. Ale inak je to pin ako každý iný. Takže môže byť aj digitálny vstup alebo výstup. Treba čítať dokumentáciu k MCU.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok