Hallo. Ich möchte ein PWM erzeugen mit einem ATMega64 mit Timer 3. Initialisierung habe ich durchgeführt --> PWM funktioniert. Regelt Stromausgang mit 0-20mA. Jetzt möchte ich eine gemessene Temperatur als Strom ausgeben. Messbereich: -40 - +80 °C also 120K. Das macht 0,16mA/K. Ich berechne mir intern den Zählwert um den Counter für das PWM zu laden. Mein Problem ist nun, das ich eine Dezimalzahl berechnet habe z.B. 100, muss diese aber in ein Register schreiben, welches ich nur mit Hexadizimalzahlen beschreiben kann. Wie kann ich dez in hex umrechnen? Kann mit jemand helfen? Danke
HEX und DEZ sind nur verschiedene Darstellungen! Oder hast du die "Zahl" als String vorliegen? Ansosnten noch Programmiersprache etc... wenn du die einzelnen Zahlen als Characters (z.B. von der Seriellen Schnittstelle) hast kannst du das so umrechnen: (c_hunderter-48)*100+(c_zehner-48)*10+(c_einer)
@Michael Wilhelm Ich möchte das der Controller die Umrechnung selber vornimmt @Läubi: Und kann ich die Zahl 100 einfach in das Register schreiben?
Hier gibts eine math-Library für AVR, http://users.i.com.ua/~birua/math32.zip u.a. auch Bcd zu Bin für 16 und 24 Bit: ;*********************************************************************** **** ;* BCD3bin == BCD to 24-Bit Binary Conversion ;* fBCD0:fBCD1:fBCD2:fBCD3 >>> tbin0:tbin1:tbin2 ;* dec hex ;* r16r17r18r19 >>> r20r21r22 ;*********************************************************************** ****
Der Controller liefert als Ergebnis der Umrechnung keine Dezimalzahl, sondern eine Binärzahl (die man natürlich auch in eine Dezimalzahl umrechnen könnte). Und die kann dann direkt an das Timer-Register übergeben werden. Oder meist du den Fall, dass du eine KONSTANTE Zahl von hand berechnet hast, udn diese verwenden willst? Dann kannst du bei den allermeisten Compilern einfach schreiben timerregister=zahl; und die Umwandlung wird automatisch vorgenommen.
Also irgenwo muß doch die Zahl gespeichert sein. Wenn sie schon im Speicher/Regsiter/wasweisich liegt, oder ergebnis einer Berechnung ist, kannst du die einfach ins steuerregister schreiben.
Wenn Du eine Zuweisung machst wie
1 | REGISTER = 100; |
oder in Assembler
1 | ldi r16, 100 |
dann steht in REGISTER bzw. r16 "01100100". Genausogut hättest Du auch
1 | REGISTER = 0x64; |
bzw.
1 | ldi r16, 0x64 |
schreiben können, das Ergebnis ist dasselbe.
Stefan KM wrote: > @Uwe > > Ist das in C auch so? Ja. Wie schon gesagt: Hex, Dezimal, Binär sind alles nur verschiedene Schreibweisen für ein und dasselbe Ding: Ein Zahl Ob du Register = 113; Register = 2 * 50 + 13; Register = 0x71; Register = 0b01110001; Register = 'q'; schreibst, ist völlig egal. Es sind nur verschiedene Schreibweisen für immer dasselbe: Das Register wird mit dem Bitmuster 0111 0001 geladen.
Der Controller kennt gar keine Hex- oder Dezimalzahlen. Der kennt nur binäre Bits und Bytes. Mit Hexzahlen kann der genausowenig anfangen, wie mit Dezimalzahlen. Weil aber die binäre Darstellung (z.B. 00001010 für dez 10) für den Meschen furchtbar schlecht lesbar ist, schreibt der lieber 10 (dezimal) oder 0x0A (hexadezimal). Der Compiler (und auch der Assembler) kennt beides, wandelt es ins Binärsystem um, und schreibt daraufhin 00001010 ins Register. Und auch in einer uint8_t-Variablen mit dem Wert dez 10 steht im Speicher 00001010, und nicht "10" oder "A". Insofern kannts du beruhigt deinen berechneten Wert einfach so ins Register schreiben - das kommt da schon richtig an. Oliver
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.