Ein Versuch in C

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ein Versuch in C

Beitrag von Xin » Fr Jun 05, 2009 10:01 pm

GerdV hat geschrieben:Grund dafür ist, dass ich den Pythagoras bemühen muss um meinen Kurs zu bestimmen.
Ich brauche die Funktionen cos(x) und arctan(x) dafür, das ist der einzige Grund für mich im Moment um C zu lernen bzw. damit zu Programmieren.
Naja, C macht einige Dinge einfacher und übersichtlicher als Asm.
GerdV hat geschrieben:Meine Frage zielte bislang immmer darauf hin, ob das Ergenis meiner Rechenfunktion, bislang ja nur die Subtraktion, fest im RAM erhalten bleibt und ob das so mit den Werten als globale Variablen funktioniert.
Solange das Programm läuft, bleibt der Inhalt der Variablen selbstverständlich erhalten.
GerdV hat geschrieben:Ich rede zwar hier von Assembler, meine aber damit nicht den Source-Code!
Wovon dann?
Maschinensprache, also die aneinanderreihung von Op-Codes?
GerdV hat geschrieben:Ich weiss nicht wie im Maschinencode eine Variable double abgespeichert bzw. aufgelöst wird.
Doubles sind Floating-Points. (http://de.wikipedia.org/wiki/Gleitkommazahl)
Das erste bit ist das Vorzeichen, es folgt ein Exponenent von 11 Bit (welcher binär 100'0000'0000 == 0, kleiner entsprechend -1, -2 ... und größer entsprechend 1, 2...). Es folgt die Mantisse über 52 Bit, der das erste '1'-Bit feht - das sogenannte Hidden-Bit.

1 ist entsprechend ( Vorzeichen | Exponennt | [HiddenBit:1] Mantisse )
0 | 100'0000'0000 | 0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000
1,25 entspricht ( 1 * 2^0 + 0 * 2 ^ -1 + 1 * 2 ^ -2)
0 | 100'0000'0000 | 0100'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000
2 entspricht ( 1 * 2 ^ 1 - Exponent um 1 erhöht)
0 | 100'0000'0001 | 0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000
0,25 entspricht ( 1 * 2 ^-2, Exponent um 2 erniedrigt)
0 | 011'1111'1101 | 0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000'0000
GerdV hat geschrieben:Meine einzige Frage zum meinem C-Code ist nun:
Werden für die Rechenoperation die globalen Variablen mit ihren Werten verwendet, so wie ich sie deklariert habe?
Wird das Ergebnis auch in der entsprechenden globalen Variable gespeichert?
Bleiben die Variablen A_Breite und Z_Breite mit ihren Werten erhalten?
Variablen bleiben unverändert erhalten, solange Du sie nicht veränderst ( Zuweisung: =, Erhöhung: ++ oder Erniedrigung: --)
GerdV hat geschrieben:Register und Ports fallen auch flach, denn die errechnete Zahl kann ja ewig lang sein.
In meinem Beispiel benutzt der Compiler laut Assemblerlisting wohl 4 Byte für je einen double-Wert mit Komma.
Die errechnete Zahl kann nicht ewig lang werden. Ein Double ist 8 Byte groß. Ist die Zahl zu groß, kann sie nicht gespeichert werden.
Macht der Compiler aus den Doubles nur 4 Byte, so sind es Floats: Dann ist die Mantisse und der Exponent entsprechend kleiner: Die Werte laufen schneller über.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Ein Versuch in C

Beitrag von cloidnerux » Sa Jun 06, 2009 9:51 am

Du konntest wohl dienene Variablen nciht auslesen, da du dien programm sofort mit return beendet hast.
http://www.mikrocontroller.net/articles ... C-Tutorial
Da hast du ein sher gutes tutorial zum porgrammieren deines Atmels mit C.
Damit du diene Variablen auslesen kannst, musst du das Porgramm also laufen lassen:

Code: Alles auswählen

int main()
{
   BZ = BA -BZ;
   var1 = var2 + var3;
   while(1);                  //<--Endlosschleife sehr wichtig, damit dein Programm nicht einfach so sich beendet
   return 0;                  //Mit return wird dein programm beendet, was aber in diesem beispiel nie geschehen wird
}
Die Endlosschleife musss so sein, da ist die Mikrokontrollerprogrammierung ein wenig naderst als C fürn PC.
Wenn du das Porgramm so testest, du musst natürlich noch es so für dich anpassen, solltest du die Varibalen aulesen können.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ein Versuch in C

Beitrag von Xin » Sa Jun 06, 2009 10:07 am

cloidnerux hat geschrieben:Die Endlosschleife musss so sein, da ist die Mikrokontrollerprogrammierung ein wenig naderst als C fürn PC.
Ich habe keine Ahnung von Mikrokontrollerprogrammierung... aber wie endet dieses Programm? Wie kommt der Mikrokontroller wieder zurück in das aufrufende Programm?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Ein Versuch in C

Beitrag von cloidnerux » Sa Jun 06, 2009 10:45 am

Wie kommt der Mikrokontroller wieder zurück in das aufrufende Programm?
Der Microcontroller hat kein Aufrufendes Programm.
Dises Programm ist das erste was Startet, quasi ein Kernel.
aber wie endet dieses Programm?
Mietsens soll es nciht enden, der Microkontroler ist kein PC.
Z.B auf einen Roboter.
Der Microcontroller soll im weiter prüfen ob irgendwas Passiert ist und dann hanldung ausführen.
Wenn er ncioht mehr laufen soll, schaltest du einfach den Strohm ab.
Der Microcontroller startet autmatisch sobald Strohm da ist.
Dann ruft er das programm auf.
Und das Arbeitet solange, oder soll solange Arbeiten, bis es nicht mehr gebraucht wird.
In der Endlosschleife kannst du natürlich auch irgendwas machen, das evt. eine Abbruchbedingun hat, also prüfen ob ein taster gedrückt wurde und dann das Porgramm beednen oder so, aber im Grunde genommen soll das Programm ewig weiter laufern.
Redundanz macht wiederholen unnötig.
quod erat expectandum

GerdV
Beiträge: 4
Registriert: Mi Jun 03, 2009 2:30 pm
Wohnort: Aham

Re: Ein Versuch in C

Beitrag von GerdV » Sa Jun 06, 2009 11:04 am

Hallo Kerli,

vielen Dank für den Hinheis!
Kerli hat geschrieben:Du musst beachten das 'double'-Zahlen normalerweise 8 Byte groß sind und als Gleitkommazahl gespeichert werden. Gleitkommazahlen sind speziell kodiert und bestehen aus einem Vorzeichenbit gefolgt von 11 Bit für den Exponenten und weiteren 52 Bits für die Mantisse. Genauere Informationen darüber findest du zb. auf Wikipedia
Das war der entscheidende Hinweis, nun kann ich mein Problem einen Schifffahrtskurs nach den allgemeinen Regeln der Nautik mit der Programmiersprache C zu berechnen, angehen.

Die speziellen Microcontrolleransteuerungen mittels C werden wohl kein so grosses Problem werden ...schaun mir mal.

Danke auch allen anderen die mir geantwortet haben.

Schönes WE

Gerd

Antworten