Guten Morgen,
ich bin so langsam am verzweifeln.
Ich habe ein Programm geschrieben welches über Rs485 mit zwei anderen
Baugruppen kommuniziert.Soweit funktioniert auch alles wie es soll.
Hier die relevanten Codestellen.
1
uint16_toutput_Data[2];
2
3
output_Data[0]=0x0500;
4
output_Data[1]=0x0500;
5
6
if(requesttimeout==0)// Daten Austausch mit den Endstufen!
Zum meinem Problem.
im oberen Byte von output_Data wird der duty cycle vom Ventilator
übertragen im unterem Byte von output_Data werden Steuer Bit übertragen.
Nun passiert es das obwohl output_Data den Wert 0x0500 hat trotzdem das
3.Bit im unterem Byte gesetzt wird.
Wenn ich jedoch in Funktion POUT.data=data&=0b11111011; das 3.Bit aus
maskiere passiert nichts.
wie kann es passieren das ein Bit einfach so gesetzt wird.
Bin mit meinem Latein total am ende.
Danke für Eure hilfe
Fredi
Deine Ausmaskierung mittels &= halte ich für falsch. Da &= den gleichen
Vorrang hat wie = wäre ich mir nicht sicher, ob data vo oder nach der
Maskierung an POUT.data zugewiesen wird. Mag sein, daß es stimmt, wie Du
es gemacht hast, aber was passiert denn, wenn Du schreibst:
POUT.data = data&0b11111011;
und was passiert, wenn Du scheibst:
POUT.data = 0;
ist dann Bit 3 immer noch gesetzt?
J. L. schrieb:> Deine Ausmaskierung mittels &= halte ich für falsch. Da &= den gleichen> Vorrang hat wie = wäre ich mir nicht sicher, ob data vo oder nach der> Maskierung an POUT.data zugewiesen wird.
Ist rechts-assoziativ, also kommt erst der rechte Teil, dann der linke.
Du bildest die CRC über 5 Byte obwohl add, command und data zusammen
nur 4 haben. Was ist noch in der Struktur ? Wie ist ihr Alignment? Und
was heißt das dubiose chanal?
Danke für die Antworten.
J. L. schrieb:> was passiert denn, wenn Du schreibst:>> POUT.data = data&0b11111011;>> und was passiert, wenn Du scheibst:>> POUT.data = 0;>> ist dann Bit 3 immer noch gesetzt?
In beiden Fällen ist Bit 3 nicht gesetzt!
MaWin schrieb:> Du bildest die CRC über 5 Byte obwohl add, command und data zusammen> nur 4 haben. Was ist noch in der Struktur ? Wie ist ihr Alignment? Und> was heißt das dubiose chanal?
Die Struktur siet so aus
1
typedefvolatilestruct// 7 Byte
2
{
3
uint8_tstart;
4
uint8_tadd;
5
uint8_tcommand;
6
uint16_tdata;
7
unsignedintcrc;
8
}protoOut;
hp-freund schrieb:> Was passiert wenn chanal==3 ?
Dann passiert momentan nichts!
LG
Fredi
Man müßte erstmal wissen, welches Protokoll Du zur Übertragung benutzt
und ob sich dieses Protokoll nach einem Übertragungsfehler wieder selbst
synchronisieren kann.
Ein MC kann nämlich nicht hellsehen, welches Byte in einem Datenstrom
das erste und welches das letzte ist. Daher muß man erstmal eine
eindeutige Vorschrift zur Erkennung definieren. Diese Vorschrift ist das
Protokoll.
Peter Dannegger schrieb:> Man müßte erstmal wissen, welches Protokoll Du zur Übertragung benutzt> und ob sich dieses Protokoll nach einem Übertragungsfehler wieder selbst> synchronisieren kann.
Es gibt ein Protokoll das auch funktioniert.
Mein Problem ist das in meinem output_Data aus irgend einem Grund das 3.
Bit gesetzt wird!
Ich habe die meiner Meinung wichtigen Code stellen gepostet.
Ich kann aber wenn es zur Fehleranalyse hilft den Kompletten Code
posten.
Vielen Dank für Deine Hilfe
Fredi
Guten Morgen,
Walter S. schrieb:>> POUT.data=data&=0b11111011;>> ist das die Anweisung die nicht das macht was du willst?
Nein die Anweisung macht genau das was ich will!
Mit dieser Anweisung Maskiere ich das Fehlerhaft gesetzte Bit 3 aus(Ich
setze Bit3 im ganzen Programm nicht und trotzdem wird es am und zu
gesetzt )
Die Markierung Funktioniert ich möchte aber verstehen warum Bits
einfach von alleine gesetzt werden!
Vielen Dank
Fredi
ergo würde ich da mal ansetzen und nachsehen, was da eigentlich so für
Werte rauskommen, bzw. welcher Wert mit welchem anderen Wert verglichen
wird.
Du hast ein LCD. Benutze es, um dir Werte auszugeben. Verdonnere dein
Programm dazu, dir zu helfen und nicht nur irgendwelche Menüs
hinzuzaubern.
ziemlich sicher nicht das, was du willst. Man beachte, dass
MENU_LIMITS_MAX ohne Array Indizierung benutzt wird. Verblüfft mich,
dass dein Compiler dazu nichts zu sagen hatte.
Mit einer besseren Schreibweise, bei der man nicht auf alle Leerzeichen
verzichtet und nicht unbedingt alles in eine Zeile quetscht, sondern
auch mal einen Zeilenumbruch zur optischen Gliederung einführt
1
if((menuParameters[i]<MENU_LIMITS_MIN[i])||
2
(menuParameters[i]>MENU_LIMITS_MAX))
3
menuParameters[i]=MENU_LIMITS_MIN[i];
hätte man das sogar sehen können, dass es hier eine optische
'Inkonsistenz' gibt, weil die beiden schliessenden Klammern der
Einzelausdrücke nicht untereinander stehen.
Generell:
Wenn mehrere Dinge logisch zusammengehören, wie bei dir
Menüpunkt-Text
aktueller Wert
minimaler Wert
maximaler Wert
dann ist es vernünftig, diesen Zusammenhang dadurch zu unterstreichen,
dass du dir eine Struktur definierst, in der du diese Zusammenfassung
sichtbar machst. Parallele Arrays dafür zu führen ist eine
fehleranfällige Sache. Der wichtigere Zusammenhang ist der der
Einzelteile untereinander und nicht, dass es mehrere davon gibt. Genauso
wie bei einem Datum der Zusammenhalt Tag/Monat/Jahr der wichtigere ist,
und nicht, dass du 25 Tage, 25 Monate und 25 Jahre im Programm speichern
musst, weil du 25 Geburtstage (also 25 unterschiedliche Datümer)
speichern musst. Zuinnerst steht erst mal das Datum an sich, und dann
erst kommt die Hierarchieebene, dass es 25 Stück davon gibt.
1
structparamValue
2
{
3
int16_tactValue;
4
int16_tminValue;
5
int16_tmaxValue;
6
constchar*menueText;
7
};
damit hast du erst mal diesen Zusammenhang geschaffen. Ein paramValue
(also ein "Parameter-Wert" besteht IMMER aus diesen Komponenten.
Und dann definierst du dir ein Array derartiger Parameter-Werte.
und damit arbeitest du dann in weiterer Folge.
Du hast das komplette Array von paramValues.
Von diesem Array einen spezifischen Eintrag, zb
paramValues[0], oder paramValues[1], oder paramValues[i]
wobei jeder einzelne dieser Array-Einträge ein komplettes struct
paramValue Objekt ist. Du kannst zb einen Zeiger auf ein derartiges
Objekt an eine Funktion übergeben, und diese Funktion hat dann alles
beisammen, was sie zur Eingabebehandlung dieses Wertes benötigt.
zb. benötigt sie den minimalen Wert des i-ten Parameter Objektes. Dann
ist das
paramValues[i].minValue
Und strukturier deinen Code besser, in dem du ihn in Funktionsgruppen
aufteilst und dafür Einzelfunktionen machst.
Und: nein. Das Argument 'ich wusste nicht, dass es sowas wie Strukturen
gibt' lass ich nicht gelten. Wer reale Programme schreiben will, muss
zumindest das erste Drittel vom K&R durchgearbeitet haben. Wer echte
Arbeit machen will, muss auch sein Werkzeug wenigstens ansatzweise
kennen.
Karl Heinz Buchegger schrieb:> Und strukturier deinen Code besser, in dem du ihn in Funktionsgruppen> aufteilst und dafür Einzelfunktionen machst.
Was genau meinst Du damit?
Danke LG
Fredi
heinzelmännchen schrieb:> Karl Heinz Buchegger schrieb:>> Und strukturier deinen Code besser, in dem du ihn in Funktionsgruppen>> aufteilst und dafür Einzelfunktionen machst.>> Was genau meinst Du damit?
Das es nicht sinnvoll ist eine Funktion main() zu haben, die sich über 5
Bildschirmseiten hinzieht.