True C code help. Example inside.

Hello everyone.

I tried to do this on a workshop and it worked great:

And this is our result (with VGA splitter, keep in mind): Workshop Zaal België on Vimeo

However, I couldn't find out what the arduino was doing exactly. This is the code it was running:

void setup() {
DDRD = B11111111;
}

void loop() {
PORTD = analogRead(0);
}

Is this true C? Or assembler or something? Can anyone explain it to me or give me some links for research?

The code is very simple, first of all:

DDRD = B11111111;

Sets PORT D to be all outputs, with DDRD being the Port D Data Direction Register. See:

Next:

PORTD = analogRead(0);

This reads the value from Analog pin 0 and converts it to a digital value, and then outputs it to Port D (which will be sent to the monitor)

See:

http://www.arduino.cc/en/Reference/AnalogRead

PORTD = analogRead(0);

So analogRead returns a unsigned int of 10 bits, what bits end up in the 8 bit PORTD register? Wouldn't one have to scale or map the 10 bit value to a 8 bit value before sending it out an 8 bit port?

Lefty

Thanks. I'll have a look into it.

@retrolefty, I think it just takes the last 8 bits of the 10 bit analog in.

That's at least what the original programmer states on the website.

I think it just takes the last 8 bits of the 10 bit analog in.

Last 8 bits meaning bits 0-7 of the int or bits 8-15 of the int? either is kind of useless as what I think one would want is to transfer the 8 most significant bits on the 10 bit A/D value (bits 2 to 9 of the returned int) into bits 0 to 7 of PORTD? I don't think the standard C casting rules will do that?

Lefty

either is kind of useless

I don't think it matters for the particular application it's being used for, which is essentially just showing random bars of colour on the screen, which change frequently. It gives a random-ish output, which is all they want, so the fact that some bits are being lost isn't a problem.

I don't think it matters for the particular application

After looking at the posted videos I can see what you mean, just cause changes and in that case it probably accomblish the desired effect.
Still I think it may be a bad example and not a good programming example. C casting rules are hard enough to understand and master to have examples like this to try and learn from. :wink:

Lefty

hello!

i've been trying the same thing using little scales former blog entry:

and its overall documentation photo
:slight_smile:

can't make everything out in detail on the picture (and i'm unsure with the diagram), therefore:

arduino digital pin -> right POT terminal (?)
female VGA pin -> middle POT terminal (?)
arduino ground -> left POT terminal (here i'm confused, for arduino duemilanove has exactly 3 GND pins (plain luck?!) - and in this case they seem to "leave" the POT to some place else)

cheers in advance..!

-jonas

(here i'm confused, for arduino duemilanove has exactly 3 GND pins (just luck?!)

You can edit your post now and put a real link in, 1st post can't as a spam filter.

I can answer this one. You can use any of the Arduino ground pins, they are all the same.

Lefty

hej lefty!

thanks for your help. it's just, that the background of the photo gets a bit blurry.

i'm not that familiar with breadboards yet. little scale seems to connect the left terminal from the poti to the bus strip. but i can't make out any connection between this bus strip and the arduino ground pin(s).

can anybody help me out? (too bad i don't have a bird's eye view on this one...)

cheers!

-jonas