Arduino ,vytvorenie funkcie s premennými
Moderátori: psichac, Moderátori
- cartmantt
- 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
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..
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
Re: Arduino ,vytvorenie funkcie s premennými
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:
...
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
Re: Arduino ,vytvorenie funkcie s premennými
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
-
- 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
Vyzeralo by to takto. Funkcia:
Volanie
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.
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();
}
Kód: Vybrať všetko
if ((TL_Eeprom1 == false) && (menu == 11)) {
uloz(0,rychlostM1);
}
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
- cartmantt
- 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
Ď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..
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
-
- 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
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.
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í.
- cartmantt
- 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
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?
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.
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?
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
-
- 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
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.
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.
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;
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í.
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 4 Odpovedí
- 1058 Zobrazení
-
Posledný príspevok od používateľa lucky62
-
- 20 Odpovedí
- 1110 Zobrazení
-
Posledný príspevok od používateľa jankrizan
-
- 11 Odpovedí
- 1778 Zobrazení
-
Posledný príspevok od používateľa mirosne
-
- 10 Odpovedí
- 684 Zobrazení
-
Posledný príspevok od používateľa budvar10
-
- 3 Odpovedí
- 4171 Zobrazení
-
Posledný príspevok od používateľa jankrizan