Bis nachher Sebastian! *rette mich, ich kann das nicht erklären -> lol*
Der muß aber manchmal sein, kenn ich von mir!Holzhammer war nicht gewollt
Gut gemacht bis jetzt,
Ich muß leider los (bin gerade im Büro, und sehe da PC an)
melde mich später wieder, bin gespannt, wie weit Ihr kommt.
Gruß Sebastian
Bis nachher Sebastian! *rette mich, ich kann das nicht erklären -> lol*
Also bräuchten wir noch ein Register, wo wir die Zahl der eingelesenen Zeichen aufbewahren. Und vergleichen ob diese Zahl = 6 ist.
(In unserem Fall). Wenn ja, Abbruch.
So in etwa?
Oh, hi Sebastian und auch wieder tschö *g* Genieß die letzten Arbeitsstunden noch
Florian: Doch du kannst das :P
Ich hab nicht viel über cp und cpc rausgefunden, nur das cp die unteren Bits vergleicht und cpc die oberen.
Aber so richtig verstanden hab ichs nicht. Wo find ich denn die oberen und unteren Bits?
Hallo Tekeli!
So in etwa stimmt das, aber Du musst das, was Du zu Anfang in ZL und ZH lädst nur nochmal in die Register laden und plus die 6 Bytes rechnen!
Das ist dann die Endbeschränkung!
Ich möchte die Codes sehen! *lol*
*ich geh mal kurz was essen, bin gleich wieder da*
Hmm...ich hab das jetzt so gelöst:
Sorry, versteh die Befehle cp und cpc aber leider nicht (wegen untere Bytes und obere?) Aber mein Code geht auch.Code:;Programm ;CDurTonleiter rauf und runter spielen .include "m8def.inc" .def tmp = r16 ;Mein Universallregister .def lpm_reg = r0 ;Mein lpm-Register .def zaehler = r17 ;Mein Zählregister, prüft, ob das Wort zu Ende ist .org 0x000 rjmp reset ;Interruptvektor "reset:" reset: ;Stack einrichten ldi tmp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse out SPH, tmp ldi tmp, LOW(RAMEND) ;Low-Byte der obersten RAM-Adresse out SPL, tmp ldi ZH, HIGH(daten1 * 2) ldi ZL, LOW(daten1 * 2) ldi zaehler, 0b00000000 ;Zähler auf 0 setzen sei ;Interrupts zulassen loop: cpi zaehler, 0b00000110 ;Vergleich Zähler mit 6 breq loop ;wenn Zähler != 6, dann wieder zu "loop:" springen einlesen: lpm ;nächstes Byte des String nach r0 einlesen mov tmp, lpm_reg ;Inhalt von R0 nach "tmp" kopieren adiw ZL,1 ;Adresse des Z-Pointers um 1 erhöhen inc zaehler ;Zähler um 1 erhöhen rjmp loop ;wieder zurück zu "loop:" daten1: .db "Hallo!" ;immer eine gerade Anzahl an Bytes
Nachteil ist eben, dass von Anfang an klar sein muss, aus wieviel Zeichen dsa Wort besteht.
[edit]
Ich bin auch mal eben was essen.
Nochmal eine Anmerkung (wie gut, daß mein Chef jetzt feiern ist)
Ein String wie "hallo!" von Florian ist nichts anderes als 6 Bytes die hintereinander im Speicher stehen.
Der Assembler erkennt aber, daß es sich um eine Zeichenkette handelt und wandelt selber
jeden Buchstaben in ASCII Zahlen um. ASCII ist steinalt, hat aber bis heute überlebt,
weil es recht simpel ist. Solltet Ihr Euch damit noch nicht auseinandergesetzt haben
hier ist eine Tabelle, wo man schön entnehmen kann welcher Buchstabe, welchem Wert entspricht.
Der Assembler wandelt auch selber um wenn man das so schreibt:
db. 'H','a','l','l','o','!'
Das ist Praktisch, sonst müßten wir uns selber darum kümmern.
Das werden wir auch nicht bei unsere Tonleiter brauchen,
hier werden wir sicher irgendwelche Werte im Speicher ablegen, um unsere Frequenzen
abzuspeichern.
Der Florian hat es nur mit dem Hallo genommen, um in die Thematik einzusteigen, denke ich
Sinnvoll sind nur ASCII Zeichen, wenn man z.B. über ein Terminal mit dem µC komuniziert, oder irgendwas auf dem LCD ausgeben möchte.
Das ist aber im Moment nicht das Ziel unserer Übung.
So jetzt verschwinde ich hier lieber![]()
Gruß Sebastian
Hallo Sebastian!
Danke nochmal für Deine Nacherklärung! ;o)
@ Thomas:
Was verstehst Du derzeit nicht?
@ Tekeli:
Was verstehst Du derzeit nicht?
Ps:
Bisher wollte ich nur zeigen, wie man Daten, die man im AVR-Flash speichert (.DB bzw. .DW), ausliest und in ein anderes Register schiebt, mehr nicht! ;o)
Das ganze hat bisher noch nichts mit Tönen zu tun!
cp und cpc sind die wichtigsten Befehle im Assembler, und glaub mir Thomas, du hast
sie (zumindest cp) schon unbewußt benutzt!
cp hat aber nur Sinn in Verbindung mit SREG.
oder was meinst Du was die ganzen brne, breq usw. machen?
es sind keine Befehle für sich wenn Du Dir anschaust wieviele Takte sie brauchen, steht dort meistens 1/2 .
und warum? weil dort immer cp ausgeführt wird und jenachdem welcher Flag im SREG danach gesetzt (oder nicht gesetzt ist) wir gesprungen, oder halt nicht.
schreibe Dir ein Miniprogramm, wo Du zwei Register mit Werten fütterst.
Behandle sie dann mit hilfe von cp uns schaue, was sich im SREG so tut.
Schaue auch was die Bits von SREG zu bedeuten haben, und ändere die Zwei Werte im Register.
Dann wirst Du schon um einiges schlauer!
Gruß Sebastian
Na ihr Beiden, wie siehts aus?
Komt ihr voran?
Soll ich noch was erklären?
Ihr kennt doch auch cpi, oder?
Lesezeichen