středa 30. června 2010

C/C++: Funkce a její návratová hodnota

Velice užitečné je si u funkcí, které nemusí dopadnout jak se od nich na první pohled čeká, vracet zda vše proběhlo v pořádku.

Obecně se vrací TRUE při správném průběhu a FALSE pokud se vyskytne nějáká chyba. Při volání funkce, která vrácí takovouto hodnotu, můžeme na případnou chybu nějak zareagovat anebo ji předat zase v podobě návratové hodnoty o úroveň výše.

byte setX(byte x){
  if (x>100)
    return 0; //chyba.. X lze nastavit jen v rozsahu 0-100
  sGlobal.x = x;
  return 1; //ok
}


Definujme podobně funkci byte setY(byte y);
Tyto dvě využijeme ve funkci pro nastavení x i y.

byte setXY(byte x, byte y){
  if(setX(x)&&setY(y))
    return 1;
  return 0; //chyba
}

A konečně samotné nastavení x a y by mohlo vypadat nějak takhle..

úterý 29. června 2010

Arduino a jeho minimalistický kód

Už před časem mi přistál v RSS čtečce článek z Tinkerblogu a sice Arduino powered Braitenberg vehicle. Vozítko s dvěma servomotůrky pohybující se za světlem ukazuje krásu a jednoduchost arduina.

Tohle je celý kód, který ovládá vozítko..

#include "Servo.h"

Servo leftServo;
Servo rightServo;
int leftValue = 0;
int rightValue = 0;

void setup() {
  leftServo.attach(10);
  rightServo.attach(9);
}

void loop() {
  // sensor values between 50..900
  leftValue = (analogRead(0) - 50) / 50;
  rightValue = (analogRead(1) - 50) / 50;
  leftServo.write(89 + rightValue);
  rightServo.write(89 - leftValue);
  delay(10);
}


Není to krásné? :D

pondělí 28. června 2010

Rozhraní SPI

Líbí se mi. Je jednoduché a elegantní.

Master se dá velmi jednoduše SW emulovat (např. pokud regulérní spi piny už využíváme k něčemu jinému). Chceme-li vysílat, prostě jen generujeme hodiny a k nim fázově posunutá data, toť vše. Slave dokonce ani nemusí být procesor, postačí posuvný registr. To může být šikovné např. pro buzení LEDek (shift registr s paralelním výstupem) nebo pro snímaní tlačítek (shift registr s paralelním vstupem).


neděle 27. června 2010

C/C++: Makra pro bitové operace

#define BIT(x) (1 << (x))
#define SETBITS(x,y) ((x) |= (y))
#define CLEARBITS(x,y) ((x) &= (~(y)))
#define SETBIT(x,y) SETBITS((x), (BIT((y))))
#define CLEARBIT(x,y) CLEARBITS((x), (BIT((y))))
#define BITSET(x,y) ((x) & (BIT(y)))
#define BITCLEAR(x,y) !BITSET((x), (y))
#define BITSSET(x,y) (((x) & (y)) == (y))
#define BITSCLEAR(x,y) (((x) & (y)) == 0)
#define BITVAL(x,y) (((x)>>(y)) & 1)
Osobně mi nepřirostly k srdci a nějak jsem si je prostě nezvykl používat. Několikrát jsem jim dával šanci, ale dopadlo to tak, že někde jsem použil makro, někde zapomněl a maskoval. To druhé zejména při vícenásobném nahazování nebo shazování bitů, kde je jednořádková maska určitě přehlednější a úspornější. Teď už beru pokaždé kousek papíru, načmárám si těch pár jedniček a nul a.. ..a je to :D