www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Auswerten von Zahlen


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Pierre Gnauck (bqube)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Siebzehn und Fuenfzehn (hacky)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Naja. Indem man mit 16 bit Werten arbeitet, and dann jeweils beide 
Register auswertet. Um welchen Controller geht es denn?

Autor: Pierre Gnauck (bqube)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Es handelt sich um einen Atmega8

Autor: Pierre Gnauck (bqube)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Umpa Lumpa (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
R17 0b0000-0001 R16 0b0010-1100 = 300dez

Autor: Peter Dannegger (peda)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Bonzo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: hans (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Für 16 (und 32) Bit gibt es doch was:

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

Hans

Autor: Jobst M. (jobstens-de)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert

Autor: Pierre Gnauck (bqube)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Pierre Gnauck (bqube)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Blah (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Für sowas kann man Definitionen verwenden.
#define sbi(PORT,BIT) PORT |= (1 << BIT)

Autor: Peter Dannegger (peda)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Pierre Gnauck (bqube)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Jobst M. (jobstens-de)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert

Autor: spess53 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Pierre Gnauck (bqube)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Pierre Gnauck (bqube)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Nur bei meiner Rechnung kommt immer der falsche wert raus z.b

.include "m8def.inc"

LDI R16, 0xff
OUT DDRB, R16
LDI R17, 0b00000001
LDI R18, 0b00000000
Sub R17, R18
OUt PORTB, R17
A:
Rjmp A

Das Ergebniss ist dann immer 0000-0001 und nicht 1111-1111 (zusätzlich 
noch die Flags gesetz).

Mfg Bqube

Autor: ??? (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>Sub R17, R18
Dreh das mal um: sub r18, r17

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net