Guten Tag liebe Programmierer Gemeinde, ich hänge grad an einer kleinen Sache fest wie werte ich das Ergebnis einer Rechnung richtig aus. Ich kann ja mit einem Register Zahlen von 0 - 255 darstellen aber was ist wenn die Rechnung über 255 geht, gut dafür hat man ja den überlauf und würde diesen einfach in ein anderes Register speicher. Sagen wir in R17 wird immer der Überlauf von R16 Gespeichert dann würde die zahl 300 so aussehen R17 0b0000-0001 und R16 0b0000-0101 aber wie bringe ich das nun auf ein Display woher weiß der Uc das wenn die Register so gesetzt sind sie den wert 300 haben ? Mfg Bqube
Naja. Indem man mit 16 bit Werten arbeitet, and dann jeweils beide Register auswertet. Um welchen Controller geht es denn?
Also müsste ich jede Bedingung abfragen ??? Z.b wenn das Register R17 0b0000-0000 ist hat das Register R16 Zahlen von 0 - 255 oder wenn das Register R17 0b0000-0001 ist hat das Register R16 Zahlen von 255 - 510 oder gibt es da einen leichteren weg ? Mfg Bqube
AVR-GCC unterstützt einfaches float (32 Bit) oder bis zu 64 Bit integer (9.223.372.036.854.775.807), das sollte doch reichen. Peter
Pierre Gnauck schrieb: > oder gibt es da einen leichteren weg ? C nehmen, dann nimmt einem der Compiler genau so etwas ab. Oder einen Controller mit 16 oder 32 Bit.
Naja. Es scheint um ASM zu gehn. Man merkt sich, dass eine Variable 16bit ist. myvar: .byte 2 Dann wandelt man die 16 bit nach BCD indem man schaut, ob groesser als 10000, falls ja 10000 sooft abzieht bis kleiner, und das ist dann die erste Zahl, dann sooft 1000 abziehen, bis kleiner als 1000, das ist dann die naechste Zahl. Dann sooft 100 abziehen, bis kleiner 100. Das ist dann die naechste Zahl. Dann sooft 10 abziehen, bis kleiner 10. Das ist dann die naechste Zahl. Und die letzte Zahl steht dann ja da. Diese Prozedur sollte man fertig codiert finden.
An Programmierung mit C hab ich auch schon gedacht nur ich finde C irgendwie schwieriger wie Assembler ... also meiner Meinung nach find ich Assembler übersichtlicher als C .... oder ich hab halt noch nicht das richtige Tutoriell gefunden... Mfg Bqube
Naja, solange du mit ein paar einzelnen Bytes hantierst, mag Assembler einfacher sein :-) Aber wenn du schon mit 2 Byte am Stück scheiterst, kann man auch Alternativen ins Auge fassen.
Damit könntest du recht haben nur mein problem ist bei C die ganzen ()/= {} usw wofür die auch immer in den Codes gebraucht werden z.b PORTB |= (1 << PB0); Setzen PORTB &= ~(1 << PB0); Löschen Da finde ich Assm leichter zu verstehen... sbi PORTB, 0 cbi PORTB, 0 oder etwa nicht :) Mfg Bqube
Für sowas kann man Definitionen verwenden. #define sbi(PORT,BIT) PORT |= (1 << BIT)
Pierre Gnauck schrieb: > PORTB |= (1 << PB0); Setzen > PORTB &= ~(1 << PB0); Löschen Ja, dieser Schreibaufwand ist völlig unnötig. Man definiert sich einmal alle Pins als Bitvariablen und gut is: Beitrag "Re: Problem mit Befehl SET" Peter
So kann man es natürlich auch machen ... aber mal wieder eine frage zum Thema Rechnen wenn ich 3-2 Rechnen möchte also 0b0000-0011 -0b0000-0010 ------------ Muss ich ja erst das 2er Komplement bilder also 0b0000-0010=0b1111-1101+1 Dann addiere ich das ganze 0b0000-0011 +0b1111-1110 ------------ 0b0000-0001 bekomme ich darbei dann auch einen überlauf ? Mfg Bqube
Hi >wenn ich 3-2 Rechnen möchte also Kannst du vielleicht mal erläutern, wo dein Problem genau liegt. Bei AVRs brauchst du kein 2er-Komplement. Es gibt sub ,sbc, subi und sbci. MfG Spess
Das Problem ist das wenn ich in den Negativen bereich komme müsste das MSB doch 1 sein und das N Flag gesetz werden oder etwa nicht ? mfg bqube
Hi >Das Problem ist das wenn ich in den Negativen bereich komme müsste das >MSB doch 1 sein und das N Flag gesetz werden oder etwa nicht ? Ja. Das N-Flag ist immer das MSB des Resultats einer Operation. MfG Spess
Nur bei meiner Rechnung kommt immer der falsche wert raus z.b
1 | .include "m8def.inc" |
2 | |
3 | LDI R16, 0xff |
4 | OUT DDRB, R16 |
5 | LDI R17, 0b00000001 |
6 | LDI R18, 0b00000000 |
7 | Sub R17, R18 |
8 | OUt PORTB, R17 |
9 | A: |
10 | Rjmp A |
Das Ergebniss ist dann immer 0000-0001 und nicht 1111-1111 (zusätzlich noch die Flags gesetz). Mfg Bqube
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.