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!
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.
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.
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
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"
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!
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.