Stránka 4 z 10
Re: Arduino pomoc
Napsal: 30. 11. 2014, 10:00
od juko
Ak ti vyhovuje použitie
digitalWrite a chceš len vytvorenie skupín ktoré môžeš potom volať, tak skús toto:
Kód: Vybrat vše
#define LED1 1 // priradenie pin-u k LED
#define LED2 2
#define LED3 3
#define LED4 4
// definovanie skupín (sú to funkcie, ktoré zapnú LED v skupine)...
// skupina vypni vsetko
void clr()
{
//Vypne vsetky LED (ak mas LED medzi pin a GND, ak mas LED medzi +VCC a pin, vymen vsade LOW a HIGH)
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
// skupina zapni vsetko
void all()
{
//Zapne vsetky LED
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk1()
//zapne LED1
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk2()
// zapne LED1 a LED2
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk3()
// zapne LED1, LED2 a LED3
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
}
void sk4()
// zapne LED1 a LED3
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
}
void setup()
{
pinMode(LED1, OUTPUT); // nastaveni pinu 1 jako vystup
pinMode(LED2, OUTPUT); // nastaveni pinu 2 jako vystup
pinMode(LED3, OUTPUT); // nastaveni pinu 3 jako vystup
pinMode(LED4, OUTPUT); // nastaveni pinu 4 jako vystup
}
void loop() //postupne zavola vsetky skupiny
{
clr (); // zhasne vsetky
delay(1000);
sk1 ();
delay(1000);
sk2 ();
delay(1000);
sk3();
delay(1000);
all ();
delay (1000);
sk4();
delay(1000);
}
Re: Arduino pomoc
Napsal: 30. 11. 2014, 10:13
od Hades
To: juko
asi víš, co píšeš, což já, a asi ani Mex nevíme, bo Arduino nemáme. Ale ty je rozsvítíš postupně...
jasně, bude to tak rychlé, že to oko nepostřehne, ale packovi jde IMHO o to, rozsvítit řadu najednou.
Ale mně šlo spíš o rozložení pinů na konektoru desky. To co jsem napsal (a vlastně i Mex) by mělo postupně rozsvítit ledky jednu po druhé v nějakém pořadí.
Tim bychom oba (moje maličkost i Mex) zjistili, jak je to zapojené a rozložené.
Tož asi tak...
Re: Arduino pomoc
Napsal: 30. 11. 2014, 10:42
od juko
To: Hades
No mal by sa tu vyjadriť packa, lebo prepínanie portu naraz tu riešime iba my dvaja a Mex.
Lebo podľa jeho príspevku z 20:33 to píše zaradom a má už 300 riadkov. Takže o rýchlosť prepínania mu asi nejde.
A ako odpoveď na môj príspevok napísal
... to arduino umí pracovat přímo s čísly pinu na arduinu-( ikdyž neodpovídají pinum procesoru) a těm by měla jít i přiřadit i skupina , jen jsem se nikde nedočet jak ...
Preto som zmenil svoj prístup.
PS: Arduino mám v krabičke, programujem (skúšam) skôr v C priamo Atmeg-u. Ale kukol som Reference manual a to čo som postol by malo ísť.
Re: Arduino pomoc
Napsal: 1. 12. 2014, 7:10
od packa
juko píše:Ak ti vyhovuje použitie
digitalWrite a chceš len vytvorenie skupín ktoré môžeš potom volať, tak skús toto:
Kód: Vybrat vše
#define LED1 1 // priradenie pin-u k LED
#define LED2 2
#define LED3 3
#define LED4 4
// definovanie skupín (sú to funkcie, ktoré zapnú LED v skupine)...
// skupina vypni vsetko
void clr()
{
//Vypne vsetky LED (ak mas LED medzi pin a GND, ak mas LED medzi +VCC a pin, vymen vsade LOW a HIGH)
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
// skupina zapni vsetko
void all()
{
//Zapne vsetky LED
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk1()
//zapne LED1
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk2()
// zapne LED1 a LED2
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk3()
// zapne LED1, LED2 a LED3
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
}
void sk4()
// zapne LED1 a LED3
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
}
void setup()
{
pinMode(LED1, OUTPUT); // nastaveni pinu 1 jako vystup
pinMode(LED2, OUTPUT); // nastaveni pinu 2 jako vystup
pinMode(LED3, OUTPUT); // nastaveni pinu 3 jako vystup
pinMode(LED4, OUTPUT); // nastaveni pinu 4 jako vystup
}
void loop() //postupne zavola vsetky skupiny
{
clr (); // zhasne vsetky
delay(1000);
sk1 ();
delay(1000);
sk2 ();
delay(1000);
sk3();
delay(1000);
all ();
delay (1000);
sk4();
delay(1000);
}
přesně takhle to zatím píšu , ale hrozně to narůstá , já potřebuju sepnout třeba 6 led zápisem na jednom řádku
Re: Arduino pomoc
Napsal: 1. 12. 2014, 7:24
od robokop
o co vlastne jde, jake jsou kombinace toho spinani?
nevyplatilo by se na to napsat funkci nebo makro?
Re: Arduino pomoc
Napsal: 1. 12. 2014, 7:28
od oscar
packa: podle mne ty to knihovny arduina neumoznuji.
takhle je to definovano ve wiring_digital.c
Kód: Vybrat vše
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN) return;
// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
uint8_t oldSREG = SREG;
cli();
if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}
SREG = oldSREG;
}
a fce digitalPinToBitMask pracuje pouze s poradovym cislem pinu. tj nelze je scitat
jedine sahnout primo na porty jak Ti tu radi ostatni.
Re: Arduino pomoc
Napsal: 1. 12. 2014, 7:32
od Hades
což je přesně to, co ti píšeme s Mex-em
to
#define sk-x (00000000); // všechny piny "LOW"
#define sk-y (11111111); // všechny piny "HIGH"
ti vlastně nastavuje masku pro jednotlivé výstupy najednou a jedním řádkem zapínáš OR vypínáš
PORTD = sk-y; //zapne všechny
PORTD = sk-x; //vypne všechny
vezmi znovu kod z
http://www.c-n-c.cz/viewtopic.php?f=48& ... 30#p154607" onclick="window.open(this.href);return false; zapíchej do D-portu ledky proti zemi a měly by postupně blikat
Re: Arduino pomoc
Napsal: 1. 12. 2014, 10:21
od packa
jelikož nejsem programátor a nikdy asi nebudu tak arduino používám na úrovni jakou běžně nabízí , a díky vám vím že to co jsem po něm chtěl prostě neumí - nebo neumožnuje bez použití sahání přímo na porty , tudíž to radši budu psát zdlouhavě , ale pro mě srozumitelně.
díky všem zůčastněným
Packa
Re: Arduino pomoc
Napsal: 1. 12. 2014, 10:54
od Hades
no ono to Arduino možná umí, ale neumíme to mi s Mexem (tedy já určitě ne, protože ho nepoužívám a tudíž neznám).
Ale jak už napsal Mex, není to nic jiného než procesor obestavěný nadstavbou a bootloaderem.
A časem tě k tomu IMHO stejně donutí okolnosti.
Držím palce

Re: Arduino pomoc
Napsal: 1. 12. 2014, 11:39
od juko
packa píše:juko píše:Ak ti vyhovuje použitie
digitalWrite a chceš len vytvorenie skupín ktoré môžeš potom volať, tak skús toto:
Kód: Vybrat vše
#define LED1 1 // priradenie pin-u k LED
#define LED2 2
#define LED3 3
#define LED4 4
// definovanie skupín (sú to funkcie, ktoré zapnú LED v skupine)...
// skupina vypni vsetko
void clr()
{
//Vypne vsetky LED (ak mas LED medzi pin a GND, ak mas LED medzi +VCC a pin, vymen vsade LOW a HIGH)
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
// skupina zapni vsetko
void all()
{
//Zapne vsetky LED
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk1()
//zapne LED1
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk2()
// zapne LED1 a LED2
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk3()
// zapne LED1, LED2 a LED3
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
}
void sk4()
// zapne LED1 a LED3
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
}
void setup()
{
pinMode(LED1, OUTPUT); // nastaveni pinu 1 jako vystup
pinMode(LED2, OUTPUT); // nastaveni pinu 2 jako vystup
pinMode(LED3, OUTPUT); // nastaveni pinu 3 jako vystup
pinMode(LED4, OUTPUT); // nastaveni pinu 4 jako vystup
}
void loop() //postupne zavola vsetky skupiny
{
clr (); // zhasne vsetky
delay(1000);
sk1 ();
delay(1000);
sk2 ();
delay(1000);
sk3();
delay(1000);
all ();
delay (1000);
sk4();
delay(1000);
}
přesně takhle to zatím píšu , ale hrozně to narůstá , já potřebuju sepnout třeba 6 led zápisem na jednom řádku
Ale veď na konci toho čo som napísal to tak je.
Program volá v jednom riadku funkciu (skupinu) ktorá zopne toľko LED, koľko si si ich na začiatku pre danú skupinu nadefinoval. Takže ak máš povedzme 6 rôznych kombinácíí (skupín), tak ich podľa vzoru nadefinuješ a potom ich už iba používaš.
To definovanie skupín robíš iba raz na začiatku a potom ich voláš v programe koľko krát potrebuješ (ale už iba jedným príkazom - v jednom riadku).:
...
void loop() //postupne zavola vsetky skupiny
{
clr (); // zhasne vsetky LED
delay(1000);
sk1 (); //zapne jednu LED
delay(1000);
sk2 (); //zapne dve LED
delay(1000);
sk3(); // zapne tri LED
delay(1000);
all (); // zapne vsetky LED
delay (1000);
sk4(); // zapne kazdu druhu LED
delay(1000);
}
Re: Arduino pomoc
Napsal: 1. 12. 2014, 11:47
od oscar
to je proste peklo.
kvuli rozsviceni 4 ledek se vola x stovek radku kodu.
holt ta prenositelnost mezi deskami neco stoji.
Re: Arduino pomoc
Napsal: 1. 12. 2014, 11:57
od juko
To: oscar
Preto mám Arduino iba ako dosku
http://arduino.cc/en/Main/ArduinoBoardProMini a tú programujem v C cez SPI. Za tú cenu nekúpim u nás ani Atmeg-u.
Ale to už treba vedieť C, študovať datasheet, mať kúpený programátor, ...
Re: Arduino pomoc
Napsal: 1. 12. 2014, 12:00
od packa
juko píše:packa píše:juko píše:Ak ti vyhovuje použitie
digitalWrite a chceš len vytvorenie skupín ktoré môžeš potom volať, tak skús toto:
Kód: Vybrat vše
#define LED1 1 // priradenie pin-u k LED
#define LED2 2
#define LED3 3
#define LED4 4
// definovanie skupín (sú to funkcie, ktoré zapnú LED v skupine)...
// skupina vypni vsetko
void clr()
{
//Vypne vsetky LED (ak mas LED medzi pin a GND, ak mas LED medzi +VCC a pin, vymen vsade LOW a HIGH)
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
// skupina zapni vsetko
void all()
{
//Zapne vsetky LED
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk1()
//zapne LED1
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk2()
// zapne LED1 a LED2
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}
void sk3()
// zapne LED1, LED2 a LED3
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
}
void sk4()
// zapne LED1 a LED3
{
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
}
void setup()
{
pinMode(LED1, OUTPUT); // nastaveni pinu 1 jako vystup
pinMode(LED2, OUTPUT); // nastaveni pinu 2 jako vystup
pinMode(LED3, OUTPUT); // nastaveni pinu 3 jako vystup
pinMode(LED4, OUTPUT); // nastaveni pinu 4 jako vystup
}
void loop() //postupne zavola vsetky skupiny
{
clr (); // zhasne vsetky
delay(1000);
sk1 ();
delay(1000);
sk2 ();
delay(1000);
sk3();
delay(1000);
all ();
delay (1000);
sk4();
delay(1000);
}
přesně takhle to zatím píšu , ale hrozně to narůstá , já potřebuju sepnout třeba 6 led zápisem na jednom řádku
Ale veď na konci toho čo som napísal to tak je.
Program volá v jednom riadku funkciu (skupinu) ktorá zopne toľko LED, koľko si si ich na začiatku pre danú skupinu nadefinoval. Takže ak máš povedzme 6 rôznych kombinácíí (skupín), tak ich podľa vzoru nadefinuješ a potom ich už iba používaš.
To definovanie skupín robíš iba raz na začiatku a potom ich voláš v programe koľko krát potrebuješ (ale už iba jedným príkazom - v jednom riadku).:
...
void loop() //postupne zavola vsetky skupiny
{
clr (); // zhasne vsetky LED
delay(1000);
sk1 (); //zapne jednu LED
delay(1000);
sk2 (); //zapne dve LED
delay(1000);
sk3(); // zapne tri LED
delay(1000);
all (); // zapne vsetky LED
delay (1000);
sk4(); // zapne kazdu druhu LED
delay(1000);
}
A už je mi to jasný , ale stejně je to dost krkolomné , ještě bych to samé musel dělat pro zhasínání různých skupin , , myslel jsem že to půjde elegantněji , ale děkuji za nakopnutí
Re: Arduino pomoc
Napsal: 1. 12. 2014, 12:50
od Mex
A proč se tak zásadně bráníš tomu používat procesor v Arduinu jako běžný procesor ATmega, tj. poslat mu přímo data na porty?
Místo nějakých stovek instrukcí jich bude jen pár, ušetříš spoustu paměti i strojového času.
A přehlednost je (podle mě) minimálně stejná nebo lepší.
Pokud se ti příčí psát:
PORTD |= SKUPINA1;
a
PORTD &= ~SKUPINA1;
tak si nadefinuj:
#define ROZSVIT(led) PORTD |= led
#define ZHASNI(led) PORTD &= ~(led)
A v programu pak budeš používat:
ROZSVIT(LED1);
ZHASNI(LED1);
ROZSVIT(SKUPINA1);
ZHASNI(SKUPINA1);
Pokud máš LED i na jiných portech, tak pak:
#define ROZSVIT(led, port) port |= led
#define ZHASNI(led, port) port &= ~(led)
ROZSVIT(LED1, PORTD);
ZHASNI(LED1, PORTD);
ROZSVIT(SKUPINA1, PORTD);
ZHASNI(SKUPINA1, PORTD);
Re: Arduino pomoc
Napsal: 1. 12. 2014, 1:31
od packa
nevím když to nadefinuje takto tak mi to nejde , asi dělám něco blbě .