Forum: Mikrocontroller und Digitale Elektronik Auswerten von Zahlen


von Pierre G. (bqube)


Lesenswert?

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

von Purzel H. (hacky)


Lesenswert?

Naja. Indem man mit 16 bit Werten arbeitet, and dann jeweils beide 
Register auswertet. Um welchen Controller geht es denn?

von Pierre G. (bqube)


Lesenswert?

Es handelt sich um einen Atmega8

von Pierre G. (bqube)


Lesenswert?

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

von Umpa Lumpa (Gast)


Lesenswert?

R17 0b0000-0001 R16 0b0010-1100 = 300dez

von Peter D. (peda)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Bonzo (Gast)


Lesenswert?

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.

von hans (Gast)


Lesenswert?

Für 16 (und 32) Bit gibt es doch was:

http://www.mikrocontroller.net/articles/AVR_Arithmetik

Hans

von Jobst M. (jobstens-de)


Lesenswert?


von Pierre G. (bqube)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Pierre G. (bqube)


Lesenswert?

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

von Blah (Gast)


Lesenswert?

Für sowas kann man Definitionen verwenden.
#define sbi(PORT,BIT) PORT |= (1 << BIT)

von Peter D. (peda)


Lesenswert?

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

von Pierre G. (bqube)


Lesenswert?

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

von Jobst M. (jobstens-de)


Lesenswert?


von spess53 (Gast)


Lesenswert?

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

von Pierre G. (bqube)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Pierre G. (bqube)


Lesenswert?

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

von ??? (Gast)


Lesenswert?

>Sub R17, R18
Dreh das mal um: sub r18, r17

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
Noch kein Account? Hier anmelden.