Forum: Mikrocontroller und Digitale Elektronik Anfänger und Denkfehler beim zusammenfassen mehrere Register.


von Thomas G. (tomatos666)


Lesenswert?

Hallo,
Ich bin Anfänger und hoffe das ihr mir weiterhelfen könnt.
Ich programmiere in Assembler. Der µC ist ein ATMEGA8.Die dauer der 
Berechnung ist egal.
Ich möchte gerne per UART Schnittstelle eine lange Zahl bekommen und 
damit rechnen z.b. Einfach mal 2 und wieder per UART ausgeben.
Nur komm ich im Moment bei folgenden Problem nicht wirklich weiter.

Ich dachte mit für die Berechnung ein 32Bit langes Register vorzusehen 
und hab auch hier im Forum schon genug Beispiele gefunden. (32Bit 
Register bestehend aus 4*8Bit Register)
OK die Berechnung sollte im Moment kein Problem sein
Mein Problem ist aber folgendes.
Ich sende vom Computer aus eine lange Zahl z.b. 2147483647.
Im Controller allerdings wird aber das Empfangene Zeichen aber 
„normalerweise“ wie im tutorial in einem 8 Bit langem Register abgelegt.
Meine Frage ist wie kann ich eine so lange Zahl auf mehrere Register 
beim Empfang über UART aufteilen und damit berechnen.
Normalerweise wird bei einem 32Bit Register ja die Zahl auf 4 Register 
aufgeteilt.
Nur wie stelle ich es an das der µC mir eine solche lange Zahl direkt in 
einem auf 4 Registern aufgeteilten Registern schiebt?

PC --> 2147483647 -->UART --> Zahl in Bit ins Register 0111 1111 1111 
1111 1111 1111 1111 1111   --> in „32 Bir Register“ --> *2--> Ergebinis 
per UART wieder ausgeben und am PC Anzeigen.Fertig!

von LuXXuS909 (Gast)


Lesenswert?

Thomas Gruber schrieb:
> lange Zahl z.b. 2147483647

Wenn du über den UART was sendest, dann kommen in deinem Fall rein für 
die Zahl 2147483647 10Byte an Daten an. Die musst du schon selber wieder 
zusammenbauen.

2*1000000000
+
1*100000000
+
4*10000000
+
...
+
7

Die Zahl als ganzes kannst du nicht verschicken. Zumindest nicht wenn du 
über einen UART senden willst, der das ganze auf einem Terminalprogramm 
ausgeben soll.

Wenn du eine andere serielle Datenübertragung hättest, dann kannst du 
natürlich deine 32Bit Zahl in 4*8Bit zerlegen und am Empfänger wieder 
zusammenbauen.

von Thomas G. (tomatos666)


Lesenswert?

LuXXuS909 schrieb:
> Wenn du über den UART was sendest, dann kommen in deinem Fall rein für
> die Zahl 2147483647 10Byte an Daten an

Verstehe.
Das heißt ich brauche 10 Register oder schreibe es in den SRAM 
multipliziere jede Zahle (beginnend beim Kleinsten) einzeln und 
Kontrolliere den Überlauf und gebe dann die Zahl wieder einzeln per UART 
aus.

von Peter D. (peda)


Lesenswert?

Du mußt Dein Problem in mehrere Aufgaben aufteilen und das sind ne ganze 
Menge:

- Ausdenken eines Protokolls (z.B. als Text mit CR als Endezeichen).
- Wandlung ASCII nach binär
- Wandlung binär nach ASCII
- UART-Empfang (gepuffert)
- UART-Senden
- Deine Berechnungen


Peter

von Udo S. (urschmitt)


Lesenswert?

die serielle Schnittstelle überträgt generell 7 oder 8 Datenbits (Siehe 
Einstellung der Schnittstelle), heutzutage benutzt man meistens 8 Bits 
also 1 Byte.
Es liegt jetzt an dir, wie du das nutzt um größere Werte zu übertragen.
Du kannst einen 32 Bit Wert jetzt binär übertragen, also 4 einzelne 
Bytes mit dem Wert von 0 bis 255.
Du könntest auch die Werte in Hex übertragen also jeweils 2 Zeichen 
('00' bis 'FF' für ein Byte bzw 8 für ein 32 Bit Wert oder auch dezimal 
wie von LuXXuS909 vorgeschlagen.
Wie du das machst bleibt dir überlassen, du musst nur auf die 
Reihenfolge achten (höchstwertigestes Byte (oder Zeichen) zuerst oder 
niederwertigstes zuerst. Und du musst die Werte entsprechend auf der 
Gegenseite wieder richtig zusammensetzen.
Wenn du z.B. binär überträgst und die Werte in R12 - R15 sollen mit dem 
höchstwertigsten Byte in R12, dann überträgst du das höchstwertigsts 
Byte zuerst, dann das 2. höchstwertige etc. und auf der Empfangsseite 
machst du eine einfache Schleife mit folgender Logik:

i=0;
Wenn UART meldet Byte angekommen
dann {
  schreibe Byte aus Empfangsregister nach R(12 + i)
  i = i+1;
  Wenn (i == 4) dann Ende
}

Im Falle von Hex müsstest du erst 2 Zeichen empfangen, die dann in ein 
binäres Byte konvertieren und das dann in das entsprechende Register 
schreiben.

Nachtrag: In Assembler heisst das Zauberwort "indirekte Adressierung"

von Thomas G. (tomatos666)


Lesenswert?

Peter Dannegger schrieb:
> Du mußt Dein Problem in mehrere Aufgaben aufteilen und das sind ne ganze
> Menge:
>
> - Ausdenken eines Protokolls (z.B. als Text mit CR als Endezeichen).
> - Wandlung ASCII nach binär
> - Wandlung binär nach ASCII
> - UART-Empfang (gepuffert)
> - UART-Senden
> - Deine Berechnungen
>
>
> Peter

Ja klar,
nur habe ich total einen anderen und falschen Gedankengang gehabt.
Grosse Zahl = Grosses Register --> + UART = Grosses Problem.
Nun ist es schon sehr viel "Klarer".
In dem man jede Zahl einzeln behandelt.
Danke!

von LuXXuS909 (Gast)


Lesenswert?

Thomas Gruber schrieb:
> In dem man jede Zahl einzeln behandelt.

Das musst du ja nicht, bleibt ja dir überlassen. Nur falls du es z.B. 
mit einer Eingabe aus HTerm oder dem Hyperterminalprogramm machen 
willst, dann wird ein Zeichen byteweise übertragen. Da gibt es halt nur 
die Zahlen 1,2,3,...,0 und jede größere Zahl, sei es die 11, wird halt 
in zwei übertragenden Bytes resultieren.

von LuXXuS909 (Gast)


Lesenswert?

Die einzelne Übertragung wird natürlich dadurch etwas komplizierter, als 
dass das Hyperterminal die Daten so verschickt, wie du sie eingibst, 
also bei 3425 die 3 zuerst. Du kannst also nicht direkt anfangen mit 
3*1000 + 4*100 usw., da du nicht weisst, wieviele Zahlen insgesamt 
kommen. Würde die Einser-Stelle zuerst gesendet werden, wäre die Sache 
natürlich einfacher.

Also erstmal alles sammeln und einen Zähler mitlaufen lassen bis das 
Ende der Nachricht kommt - ein ENTER oder was auch immer. Dann die Zahl 
zusammenbauen.

von Peter D. (peda)


Lesenswert?

LuXXuS909 schrieb:
> Du kannst also nicht direkt anfangen mit
> 3*1000 + 4*100 usw., da du nicht weisst, wieviele Zahlen insgesamt
> kommen.

Macht ja auch keiner, sondern:
Wert = Wert * 10 + Ziffer


Peter

von LuXXuS909 (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Macht ja auch keiner, sondern:
> Wert = Wert * 10 + Ziffer

Ja stimmt natürlich.

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.