Arduino pomoc

Odpovědět
juko
Příspěvky: 48
Registrován: 30. 7. 2012, 10:46
Bydliště: IPD

30. 11. 2014, 10:00

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); 

}
Uživatelský avatar
Hades
Příspěvky: 1196
Registrován: 11. 10. 2012, 10:59
Bydliště: Praha; Mimoň

30. 11. 2014, 10:13

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...
juko
Příspěvky: 48
Registrován: 30. 7. 2012, 10:46
Bydliště: IPD

30. 11. 2014, 10:42

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ť.
Uživatelský avatar
packa
Příspěvky: 7047
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

1. 12. 2014, 7:10

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
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22975
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

1. 12. 2014, 7:24

o co vlastne jde, jake jsou kombinace toho spinani?

nevyplatilo by se na to napsat funkci nebo makro?
Vsechna prava na chyby vyhrazena (E)
oscar
Příspěvky: 1223
Registrován: 2. 5. 2010, 8:50
Bydliště: Perníkovice

1. 12. 2014, 7:28

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.
Uživatelský avatar
Hades
Příspěvky: 1196
Registrován: 11. 10. 2012, 10:59
Bydliště: Praha; Mimoň

1. 12. 2014, 7:32

což je přesně to, co ti píšeme s Mex-em :D

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
Uživatelský avatar
packa
Příspěvky: 7047
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

1. 12. 2014, 10:21

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
Uživatelský avatar
Hades
Příspěvky: 1196
Registrován: 11. 10. 2012, 10:59
Bydliště: Praha; Mimoň

1. 12. 2014, 10:54

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 :D
juko
Příspěvky: 48
Registrován: 30. 7. 2012, 10:46
Bydliště: IPD

1. 12. 2014, 11:39

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);

}
Naposledy upravil(a) juko dne 1. 12. 2014, 11:49, celkem upraveno 1 x.
oscar
Příspěvky: 1223
Registrován: 2. 5. 2010, 8:50
Bydliště: Perníkovice

1. 12. 2014, 11:47

to je proste peklo.
kvuli rozsviceni 4 ledek se vola x stovek radku kodu.
holt ta prenositelnost mezi deskami neco stoji.
juko
Příspěvky: 48
Registrován: 30. 7. 2012, 10:46
Bydliště: IPD

1. 12. 2014, 11:57

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, ...
Uživatelský avatar
packa
Příspěvky: 7047
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

1. 12. 2014, 12:00

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í
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

1. 12. 2014, 12:50

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);
Uživatelský avatar
packa
Příspěvky: 7047
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

1. 12. 2014, 1:31

nevím když to nadefinuje takto tak mi to nejde , asi dělám něco blbě .
Odpovědět

Zpět na „Ostatní elektronika“