Hallo,
irgendwas raffe ich nicht. Und zwar habe ich folgende Funktion:
1
voidsetRow(unsignedcharnr){
2
if(nr>1){
3
com74hc595_row[0]=pow(2,nr-2);
4
com74hc595_row[1]=0;
5
}
6
else{
7
com74hc595_row[0]=0;
8
com74hc595_row[1]=pow(2,nr+6);
9
}
10
com74hc595_row_out();
11
}
Bei zahlen >1 soll in Array[0] etwas eingetragen werden. Und zwar:
Parameter->Arrayinhalt
2->1
3->2
4->4
5->8
...
Bei 0 und 1:
1->128
0->64
Habe ich evtl. Problem mit den Datentypen?
Aufgerufen wird z.B. über setRow(1);
Danke schonmal
Michael N. schrieb:> Habe ich evtl. Problem mit den Datentypen?
Das wissen wir nicht. Du hast ja kein Problem beschrieben.
Was komisch wirkt:
> Bei zahlen >1 soll in Array[0] etwas eingetragen werden.
Wenn in com74hc595_row[0] etwas eingetragen werden soll, warum schreibst
Du dann:
1
com74hc595_row[1]=0;
und
1
com74hc595_row[1]=pow(2,nr+6);
Wo und wie ist überhaupt "com74hc595_row" deklariert?
Hatte schon ähnliche Antworten erwartet, deshalb nochmal genau:
Wenn ich nicht mit dem Parameter "nr" arbeite, funktioniert das ganze.
Uwe ... schrieb:> Im else-Zweig müsste noch abgefragt werden, ob 0 oder 1, und dann der> zugeordnete Wert in com74hc595_row[0] eingetragen werden
Wenn nr==0 oder nr==1 (negative Werte werden nicht an die funktion
übergeben), dann wird in meinem code folgendes ausgeführt:
com74hc595_row[1]=pow(2,nr+6); //Gibt bei nr=0: 2^6 und bei nr=1: 2^7
Das passt also. Und wenn ich statt nr direkt eine 1 oder 0 eintrage,
geht auch alles.
com74hc595_row ist ein Array. Element 1 ist das erste Schieberegister.
Element 1 das zweite. Wenn ich per Hand etwas hineinschreibe dann zeigt
mir die Matrix auch das richtige an. (sind die Reihen der Matrix)
A. K. schrieb im Beitrag #3041959:
> Ja. 1-2 ist -1. Auch in C.
1-2 wird nie ausgeführt werden, da obendrüber ein if nr>1 steht...
Service schrieb:> i=0: 0 64> i=1: 0 128> i=2: 1 0> i=3: 2 0> i=4: 4 0> i=5: 8 0> i=6: 16 0> i=7: 32 0> i=8: 64 0> i=9: 128 0>> Wo genau steckt das Problem?
Genau, du hast meine Idee verstanden. So soll es sein.
Und zwar leuchtet bei i=1 die Matrix so, als hätte ich i=0 übergeben
(also in Array[0]=0 und Array[1]=64). Bei i=0 leuchtet garnichts. Bei
anderen werten werden teilweiße mehrere Bit auf 1 gesetzt...
Michael N. schrieb:> com74hc595_row ist ein Array. Element 1 ist das erste Schieberegister.> Element 1 das zweite. Wenn ich per Hand etwas hineinschreibe dann zeigt> mir die Matrix auch das richtige an. (sind die Reihen der Matrix)
Was für ne Matrix? Würdest Du mal bitte Dein Problem beschreiben?
com74hc595_row[0]=pow(2,9-2);//Diese Zeile liefert in meinem Code etwas anderes als:
2
com74hc595_row[0]=pow(2,nr-2);//nr ist ein Parameter dieser Funktion. Ich habe 9 als Parameter übergeben...
Kann ich mir nur schlecht anzeigen lassen. Aber dieser Test zeigt, dass
wohl im Array schon das falsche steht. Es geht ja, wenn ich es so fest
eintrage...
Michael N. schrieb:> Aber dieser Test zeigt, dass> wohl im Array schon das falsche steht. Es geht ja, wenn ich es so fest> eintrage...
Dass Deine Funktion prinzipiell richig arbeitet, hat aber der User
"Service" schon demonstriert. Jetzt wäre zu klären, welchen Controller
Du verwendest und was Du sonst noch unötigerweise an Bibliotheken
verwendest (eventuell wird der Speicher knapp).
J.-u. G. schrieb:> Dass Deine Funktion prinzipiell richig arbeitet, hat aber der User> "Service" schon demonstriert.
Aber das hat er vmtl auf seinem PC gemacht. Nicht mit dem µC und mit dem
Compiler um den es hier geht. Integers mit Fliesskomma zu rechnen ist
etwas riskant.
Habe es mittlerweile auch auf meinem PC per C geschrieben. Da geht es:
1
voidsetRow(intnr){
2
printf("%i",nr);
3
if(nr>1){
4
inttest=pow(2,nr-2);//geht nicht direkt in printf
5
printf("Test:%i",test);
6
}
7
else{
8
inttest=pow(2,nr+6);
9
printf("Test:%i",test);
10
}
11
}
--> Die Funktion liefert alles passend zurück
Ich arbeite mit einem Atmega8-16
Bibliotheken:
#include <avr/io.h>
#include <util/delay.h>
#include "math.h"
#include "com74hc595_col.h"
#include "com74hc595_row.h"
Die beiden com74hc595 sind nur ansteuerroutinen für die schieberegister.
Michael N. schrieb:> Dann habe ich aber eine Kommazahl.
Die hast du ohnehin schon. pow() liefert double.
> Dann in unsigned int umwandeln oder wie?
Das geschieht bereits. Implizit.
Michael N. schrieb:> Wüsste trotzdem gerne was meine pow-Logik zu nichte gemacht hat.> Vielleicht wirklich ungenauigkeiten?
Es wird wohl 127 rausgekommen sein, was dann wie 64 wirkte. Die
Grundrechenarten sind im Rahmen der Stellenzahl exakt, aber pow() ist
das Ergebnis einer Approximationsrechnung. Und die ist bei ganzzahligen
Argumenten nicht zwingend exakt.
Okay, dann vielen Dank für die Hilfe :)
Ich sollte doch lieber bei anderen Sprachen bleiben. Hoffentlich kommt
bald ein Controller raus, der eine schönere Sprache beherrscht ;)