Ja, T2 ist ein async Timer, die anderen nicht.
Und PCInts hab ich beim Mega16 auch schon vermisst. Offenbar gibts die wirklich nicht :(
Beim Mega328 allerdings schon.
Druckbare Version
Ja, T2 ist ein async Timer, die anderen nicht.
Und PCInts hab ich beim Mega16 auch schon vermisst. Offenbar gibts die wirklich nicht :(
Beim Mega328 allerdings schon.
Na so als wenn du eine schriftliche Multiplikation machst. Heißt z.B: bei 49920*3 = 40000*3 + 9000*3 + 900*3 + 20*3 + 0*3 = 120000 + 27000 + 2700 + 60 + 0 = 149760 .
Im Link siehst du das ich erst 1low*2low + 1low*2high + 1high*2low + 1high*2high rechne
https://www.roboternetz.de/community...ine-Bibliothek unter Mathe.asm ;)
http://www.avr-asm-tutorial.net/avr_...nen/index.html
Das Wissen fehlt dir nicht sondern es ist nur verschüttet im Unterbewusstsein, man hats ja mal in der 2-4Klasse gelernt
Wo es gespeichert wird hängt von der Rechenart ab, Bei der Multiplikation fest verankert IMMER in R0:R1 heißt wenn dort die Werte vorher geladen werden, werden sie danach überschrieben.
Addition/Subtraktion Add r16,r17 wird das Ergebnis immer in das Register vor dem Komma geschrieben siehe Datenblatt Instructionset
Einfach mal im Simulator Werte laden und mit den Rechnarten probieren zum Verständnis.
Zum Timer 2 der kann ASYNCHRON bzw für SLEEP muss sogar ASYNCHRON betrieben werden.
Der MEGA16/32 sind die älteren Generationen Atmega 48/88/168/328 sind alles Atmega8 nur mit 4-32Kbyte Flash und kleinen Unterschiedlichkeiten in der Adressierung der Hawrdwere aber sonst identisch
Mein lieber Schwan!!
Das soll einer behirnen!?
Bei deinem "Mathe.asm" Beispiel steige ich komplett aus!!
Tut mir leid. Das pack ich einfach nicht. Das ist mir viel zu verwirrend.
Dafür gehts bei der Routine "Hardware Multiplikation von 16- mit 8-Bit-Zahl" aus dem Tutorial.
Danke!
Das stimmt so nicht!
103545 ist eine "Zahl"! Die kann ich am Display nicht anzeigen.
Einen 8-Bit Registerinhalt in Text umzuwandeln geht ja. Dazu hab ich eine Routine im Netz gefunden.
Aber wie geht das mit 3 Registern zu je 8-Bit?
Da kann ich nicht einfach jedes einzelne Register in Text umwandeln.
Für eine Zahl aus 3 Registern in ASCII bin ich im Netz leider nicht fündig geworden.
Ich kapier das alles leider (noch) nicht. :(
(fang mal irgendwann ganz sachte mit C++ an)
Ausgangsbasis sind immer 2*16bit Zahlen die jeweils aus 2*8bit Registern zu 1*16bit zusammen gefasst sind. Die Ergebnissregister sind 4*8bit somit ist der Zahlenbereich 0-4294967296 Zahlen möglich womit deine 103545 locker reinpasst.
Das Ergebnis steht auch relativ sichtbar
Was ist dennn angeblich so verwirrend ?
Nur weil das Carry also der Übertrag bei der Addition mit hinzukommt ? Wenn du selber schriftlich multiplizierst rechnest du doch genauso:
.....1234 * 5
.........20
.......150
......1000
......5000
.= ..6170
Rein in binär kann man das auch rechnen nur das wird absolut zuviel.
Das Problem bei dieser Routine ist das du die Restbildung zum Erweitern sich deutlich verkompliziert.
Denn hier bist du schon in der Floatingpointoperation heißt mit Kommastellen rechnen...
Warum kannst du diese Zahl im Display nicht dastellen ? Du wandelst die 8bit in Text ? Eher nicht du meinst du wandelst es von 8Bit in DEZIMAL.
Die Routine ist nichtsweiter als ein Vergleich z.B.:
von 2300
>=1000 ? ja 2300 minus 1000 = 1 Durchgang Rest 1300
>=1000 ? ja 1300 minus 1000 = 1 Durchgang Rest 300
Durchgänge incrementieren oder Subtrahieren Wert als 2 speichern = tausender Stelle
>= 100 ? ja 300-100 = 1 Durchgang Rest 200
>= 100 ? ja 200-100 = 1 Durchgnag Rest 100
>= 100 ? ja 100-100 = 1 Durchgang Rest 0
Speichern als hunderter Stelle 3
>= 10 ? nein also 0 speichern als Zehner Stelle
>= 1 ? nein also 0 speichern als einer Stelle
Jetzt zu deiner Frage wie macht man das für x-8Bit-Register?
1byte 8 bit = 255 = Zahlenbereich also 100 ist dein Grundwert mit dem man beginnt abzuziehen
2byte 16 bit = 65535 = Zahlenbereich also 10000 ist dein Grundwert mit dem man beginnt abzuziehen
3byte 24 bit = 16777215 = Zahlenbereich also 10Mio ist dein Grundwert mit dem man beginnnt abzuziehen
usw
Hinweis Wertebereich 8bit = 256 Zustände. Der Zahlenbereich ist immer Wertebereich minus 1 deshalb 255 Trotzdem bleiben es 256 Zahlen 0-255
SO und auch dafür gibs eine Lösung im selbigen Link und nennt sich HEX_DEZ_Wandlung auch in der MATHE.ASM zu finden nur mit dem Unterschied das es eben für 4*8Bit ausgelegt ist der Zahlenbereich 0-4294967296.
Wenn du nach der Wandlung dir die Werte ins SRAM speicherst, stehen diese gleich als DEZIMAL zu Verfügung und man kann sich das Ergebniss sofort anschauen. DEBUG-Option im Simulator
Wie stark nutzt du den Simulator ? Also spielst du jede Änderung durch ?
Nachtrag: Sich mit diesen Grundlagen zu beschäftigen ist im ersten Moment schwer nur ohne gehts einfach nicht. Rate mal warum viele soviele Probleme in Hochsprachen haben obwohl diese es eigentlich einfacher machen sollten...
Klar 2 Jahre erstmal den Syntax lernen ohne das man irgendwas am Controller als Ergebnis sieht.... Auch die Wandlungen macht C+/C++/C# und alle anderen Hochsprachen ebenso nur mit anderen Ausdrücken... ;)
Nein, das ist es nicht.
Wenn man, so wie du, mit der Materie auf du + du ist, ist das leicht(er) zu verstehen.
Das fehlt bei mir leider noch fast völlig. Ich hab solche Rechnereien bislang nicht benötigt und mich somit auch nicht damit befasst.
Deshalb brauche ich jetzt Zeit zum behirnen. Bitte um Geduld.
Das, was davor noch an Erklärung steht, muss ich erst ganz genau durcharbeiten ...
HEX_DEZ_Wandlung hilft mir nichts! Oder reden wir da aneinander vorbei?
Wenn ich zB einen Wert von 174 in einem 8-Bit Register habe, ist für mich dieser Wert DEZIMAL. Das kann ich aber nicht am Display anzeigen.
Ich muss die einzelnen Ziffern erst einzeln in ASCII/Text (1=$31,7=$37,4=$34) in einzelne Register umwandeln damit sie anzeigbar sind. Oder was meinst du mit dezimal anzeigen?
Das kommt auf den Code/die Änderung an. Wenn ich den Code "verstehe" und somit weiß wie er funktioniert, was er tut, meist nicht.
Bei diesen Rechnereien JEDE!
Deshalb ist mir, auch wenn es aufwändiger ist, Assembler lieber, weil ich weiß (oder hoffe zu wissen) was der Prozessor wie macht.
Ich hab wahrscheinlich noch einen Knopf im Hirn, den es erst gilt zu lösen.;)
Dann wirds mir leichter fallen diese Rechnereien zu verstehen und dann auch zu codieren. Ich lerne bei jedem Projekt wieder was dazu.
Bei diesem ist es halt im Moment heftig, weil mir ein gewisses Grundverständnis (und damit meine ich nicht der Codierung) fehlt.
Ich werd's schon noch hinkriegen ...
Dezimal sind Werte auf Basis von 10.
Hexadezimal Werte auf Basis von 16.
Binär oder Dual Werte auf Basis von 2.
In einem Bit kann nur Dual gespeichert werden.
In einem Byte, das aus 8 Bit besteht, wird Hexadezimal gespeichert. Hier sind Werte von 0 bis einschließlich 15 möglich.
Umgewandelt werden muss deshalb von Hexadezimal nach Dezimal , zur Ausgabe in einzelne Stellen (der darzustellenden Dezimalzahl) zerlegt und als ASCII-Wert abgebildet.
dezimal (Basis 10): 123
hexadezimal (Basis 16): 7B
binär (Basis 2) 8 Bit: 01111011
MfG
- - - Aktualisiert - - -
Na, na! Wenn man das erlernt, sieht man schon was... ;)
In der Tat sind die ersten Schritte schwer. Überall. Auch bei Assembler bzw. Maschinensprache braucht man Geduld. Nicht so schnell, immer eins nach dem andern. Ich glaube HeSt wird gerade etwas überrumpelt.
MfG
Na lass mal genau wie du hab ich auch damit angefangen ohne solche Umherrechnen nur irgendwann gehts halt nicht mehr weiter. Also keine Angst dieser Lernzustand ist ganz normal ;)
Das sind nur die Namen der Register und fügst diese in deiner Hauptdatei zum Anfang ein oder "schaltest" es in der Mathe-Datei einfach frei.
Also HEX_Dez_Wandlung brauchst du trotzdem. denn wie willst du das A als DEZ darstellen bzw es sind ja 2 ASCII-Zeichen §31 und $30 nur das wären doch schon 2byte für zwei einezelne Ziffern die als Zehn interpretiert werden.
Einfacher ist es doch 1byte mit HEX 10 zu beschreiben und in der Ausgabe zum LCD
1. Kopie von $10 anlegen
2. swapst du das Highbyte auf lowbyte und addierst $30 dazu
3. $31 als Datensatz zum LCD schicken, 1 wird angezeigt
4. Kopie Highbyte ausmaskieren und wieder mit $30 addieren
5. $30 als Datensatz zum LCD schicken, 0 wird angezeigt
Hinweis: Die Mathe.asm bringst das Ergebnis steht in den Registern richtig drin, je nach Ansicht in Dezimal oder HEX. Ich entnnehme deiner Aussage das du es auf Dezimal eingestellt hast im Simulator.
Es gibt jetzt verschiedene Ansätze wie du diese Ergebnis jetzt wann wandelst.
1. Du nimmst die Register wie sie sind und wandlest erst bei der Ausgabe in ASCII-Zahlen was aber die Ausgabe komplizierter macht.
oder
2. Ergebniss berechnen lassen dann von HEX in Dezimal wandeln und im RAM ablegen ACHTUNG je nach ANSICHT im Simulator: HEX-Ansicht dann sind es PSEUDO-HEXEN da du es schon in DEZIMAL betrachtest oder in Dezimal dann sind die Werte als DEZ interpretiert falsch, Ausgabe der DEZ-Zahlen da in der mit der Addition des Wertes von $30
Noch mal einfach.
Du brauchst eine reine:
TEXTAUSGABE
ZAHLENAUSGABE
Hab mal zwei Bilder angehängt. $1312 * $0100 = $131200 da die ALU nur in Binär/(HEX) rechnen kann funktioniert die Registerübergreifende Darstellung in DEZIMAL nicht da die Zahlen von UNS falsch interpretiert werden
Damit du es richtig interpretierst müsstest du
19*256 + 18 = 4882 und 1*256 +0 = 4882 * 256 = 1249792
Das Ergbeniss richtig zu interpretiern
19*65536 + 18*256 + 0*256 = 1249792
Anhang 33932
Wie gesagt das ist ein Frage deiner Darstellungsform im Simulator am besten auf HEX lassen wenn es Rgeisterübergreifend arbeitet.
genau moppi, ich dachte eigentlich, das wäre einem asm-Programmierer bekannt...
DAS stimmt natürlich nicht.Zitat:
Wenn ich zB einen Wert von 174 in einem 8-Bit Register habe, ist für mich dieser Wert DEZIMAL.
174 ist (ohne Vorzeichen) gespeichert als 10101110 bzw in 1 Byte-Register als 0xAE (editiert)
nun muss man diese Zahl in eine andere Schreibweise (mit dezimalen Ziffern) umwandeln (der Zahlenwert bleibt dabei ntl identisch), erst dann erhält man die drei Ziffern 1, 7, 4
und dann müssen die einzelnen Ziffernstellen 0-9 in Zeichen '0' bis '9' umgewandelt werden, erst dann lassen sie sich als Zeichen (nicht als Zahl) aufs Display bringen.