Forum: Mikrocontroller und Digitale Elektronik Atmel Studio 6 und seltsame Werte


von Matthias S. (matstorm)


Lesenswert?

Hallo alle zusammen.

Erst einmal: Das Programm handelt vom Debugger vom Atmel Studio 6. Ich 
wusste nicht wohin mit dem Thread. Zu PC-Programmierung passt es ja 
nicht und bei PC Hard- & Software denke ich eher, dass da eher alles 
rund um PC geht. Da Atmel Studio zur Programmierung von Atmel 
Microcontrollern dient, dachte ich, dass ich hier evtl. doch richtig 
bin. Wenn nicht, dann bitte ich darum, mich zu korrigieren ^_^

Ich hätte eine Frage zum Debugger von Atmel Studio. Und zwar 
programmiere ich schon seit einer geraumen Zeit in C++, unter anderem 
Netzwerksoftware und Datenbanken, und dachte mir, dass etwas Übung im 
Bereich Microcontroller-Programmierung bestimmt in Zukunft hilfreich 
sein wird, da ich dieses Schuljahr mit dem Informatikstudium anfange. 
Kurz: ich habe bereits Erfahrung in C/C++ Programmierung.
Ich habe Atmel Studio 6 unter Windows 8 installiert und ein C++ Projekt 
erstellt. Danach hab ich eben den ATmega8 ausgewählt und wollte einfach 
ein "Lauflicht" auf Port B ausgeben. dazu habe ich eine char-Variable i 
mit 0 initialisiert und in einer For-Schleife laufen lassen. Das ganze 
läuft natürlich in einer Endlosschleife. Vor der Endlosschleife habe ich 
DDRB = 0xFF; gesetzt (bedeutet ja, alle 8 Pins von Port B auf Ausgang 
schalten wenn ich mich nicht irre, oder? DDR = Data Direction Register?)
Dann habe ich über PORTB = pow(2, i); die Potenz mit Basis 2 und 
Exponent i eingeschrieben (math.h natürlich eingebunden). So sieht dann 
der Code etwa aus:

DDRB = 0xFF;
1
char i = 0;
2
3
while(1)
4
{
5
 for(i = 0; i < 8; i++)
6
 {
7
  PORTB = pow(2,i);
8
 }
9
}

Normalerweise müsste ich doch jetzt bei Step-by-Step durchlauf mithilfe 
des Simulators im Debugger im IO View-Fenster bei PORTB folgendes 
angezeigt bekommen:

00000001 (da 2^0 = 1)
00000010 (da 2^1 = 2)
00000100 (da 2^2 = 4)
00001000 (da 2^3 = 8)
00010000 (da 2^4 = 16)

Seltsamerweise bekomme ich jedoch folgendes Muster (welches ich nicht 
nachfvollziehen kann).

00000001 (2^0 = 1 | okay)
00000010 (2^1 = 2 | ebenfalls okay)
00000011 (2^2 = 3 | Falsch)
00000111 (2^3 = 7 | Falsch)
00001111 (2^4 = 15 | Falsch)

Kann mir vll jemand erklähren woran das liegen könnte?

Mit freundlichen Grüßen,
Matthias

von Stone (Gast)


Lesenswert?

Rückgabewert ist ein Double kein Int !


Gruß Matthias

von Peter II (Gast)


Lesenswert?

Matthias S. schrieb:
> Kann mir vll jemand erklähren woran das liegen könnte?

sieht mir wie ein rundungsproblem wegen float aus. (double macht der 
atmel nicht)

Außerdem ist der VIEL zu langsam, dafür nimmt man doch keine pow 
funktion
Char ist zeichen und keine Zahl!
1
while(1)
2
{
3
 for(uint8_t i = 0; i < 8; i++)
4
 {
5
  PORTB = 1 << i;
6
 }
7
}

das << ist auch nicht ideal aber erstmal ok.

von Stefan E. (sternst)


Lesenswert?

Matthias S. schrieb:
> Kann mir vll jemand erklähren woran das liegen könnte?

pow() gibt eine Gleitkommazahl zurück, und das Gleitkomma-Format (IEEE 
754) kann nicht jede ganze Zahl exakt darstellen. Und so ist eine 16 in 
dem Format eben eine 15,999... und zu einem Integer konvertiert dann 15.

von Matthias S. (matstorm)


Lesenswert?

hmm, verstehe, also kommen diese krummen Werte durch die Konvertierung 
von Fließkommazahl zur Ganzzahl. Wenn ich aber jetz auf Windows oder 
Linux programmiere, geben mir die Programme immer exakte Werte, liegt 
das an der pow()-Funktion?

jaaa, ich benutz char ab und zu wenn ich nur Zahlen von einem Byte 
brauche, an uint8_t usw. hab ich nicht gedacht (mal abgesehen davon dass 
ich das unsigned vergessen hab :D)

Hab auch grad den Code von Peter II ausprobiert. Ich wüsst nur noch 
gern, wie ich das 1 << i zu verstehen habe. Aber ich glaube, ich lese 
mir mal das Tutorial hier einfach mal durch ^^

Vielen Dank für die schnelle Antwort.

von Bernd S. (bernds1)


Lesenswert?

Matthias S. schrieb:
> ...wie ich das 1 << i zu verstehen habe...

Die "1" wird um "i" Stellen nach links geschoben (jeweils eine 
Multiplikation mit 2).
Hast du aber im Tut bestimmt schon gefunden...

von Karl H. (kbuchegg)


Lesenswert?

Matthias S. schrieb:
> hmm, verstehe, also kommen diese krummen Werte durch die Konvertierung
> von Fließkommazahl zur Ganzzahl. Wenn ich aber jetz auf Windows oder
> Linux programmiere, geben mir die Programme immer exakte Werte, liegt
> das an der pow()-Funktion?


Kann sein, dass deine PC-pow Funktion da einen speziellen Fall draus 
macht. Es kann aber auch sein, dass du nur deswegen eine ganze Zahl auf 
der Ausgabe siehst, weil 15.9999999999999999999 auf 6 Nachkommastellen 
für die Ausgabe gerundet nun mal eine 16.000000 ergibt. In dem Fall 
verwechselst du das, was du an der Ausgabe siehst mit der internen 
Repräsentierung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.