Forum: Mikrocontroller und Digitale Elektronik Frage zu Assembler und AVRStudio


von Ingo Stange (Gast)


Lesenswert?

Hallo @ All

ich habe eine Frage zu folgenden Code.

.include"2313def.inc"
loop:
 RCALL   Z1
 RCALL   Z2
rjmp loop
Z2:
 nop
 RET
Z1:
 nop
 RET

Wenn ich den Code zum testen durch den Simulator jage,
wird der bereich von Z2 nicht durchlaufen. Nach dem RET in Z1
wird dann an den Anfang von loop gesprungen.
Müsste es nicht dann bei RCALL Z2 weitergehen?

Zweitens,
Wie kann ich einzelnen Pins an den Ports von 0 auf 1 bzw. umgekehrt
ändern ohne die anderen Pins neu zu setzen?

Drittens,
Kann man bei dem AVRStudio die Simulationsgeschwindigkeit ändern?
Bei schleifen von 400000 Durchläufen dauert das ja sonst ewig bis es
dann mal weiter geht.

Gruß Ingo

von Jochen Pernsteiner (Gast)


Lesenswert?

Du musst den Stackpointer initialisieren.

von Daniel R. (Gast)


Lesenswert?

Hi,
zu Erstens:
In deinem Programm rufst du ja mit rcall eine Funktion auf. Der AVR
pusht jetzt automatisch die
Rücksprungadresse auf den Stack(also den Wert im Program Counter). Der
ProgramCounter wird nach jedem
ausgeführten Befehl 2 mal inkrementiert und beinhaltet immer die
physikalische Adresse, an der der Prozessor
gerade den Befehl ausführt. Also in deinem Fall ist "RCALL Z1" an
Adresse 0 im Speicher, da es der erste
Befehl ist, der in deinem Programm steht. Also schreibt der AVR 2 auf
den Stack, damit er später wieder
weiß, wohin er springen muss(bei dem RET Befehl). In deinem Fall zeigt
der Stackpointer irgendwo in
den Speicher. D.h. der AVR schreibt seine 2 an eine beliebige Stelle
und kapiert später dann selbst
nicht mehr, wohin er die 2 geschrieben hat. Dann startet er das
Programm neu. Deswegen fängt er dann direkt
bei RCALL Z1 wieder an.
Abhilfe: Den Stackpointer initialisieren.

ldi r16,LOW(RAMEND)
out SPL,r16
ldi r16,HIGH(RAMEND)
out SPH,r16

Nun zeigt der Stackpointer auf eine definierte Adresse(RAMEND) und
alles klappt.

Zu Zweitens:
mit sbi portX,Y    ;SetBit In I/O Register
und cbi portX,Y    ;ClearBit In I/O Register

DAs steht alles im InstructionSet!!!

Drittens:

Mit ALT+O kannst du im AVR Studio beim Debuggen die Einstellungen
ändern. Man kann dann je nach AVR Typ
bis an dessen max. Taktfrequenz gehen.

Gruß Daniel!

von dave (Gast)


Lesenswert?

Zu 3tens:
wenn du mit dem Finger auf F11 bleibst, dann dauerts echt ewig.
Wenn du das machst, dann klicke auf einen Punkt nach der Schleife und
nimm STRG+F10, dann gehts schneller.
Die Taktfrequenz hat damit glaub ich nix zu tun.

dave

von Ingo Stange (Gast)


Lesenswert?

Super das hat mir sehr weiter geholfen.

Vielen Dank für euer Hilfe.

Gruß Ingo

von Hauke Radtki (Gast)


Lesenswert?

das ist der AT90S2313 (nach def datei) also brauchst du nicht die
unterteilung in low und high (bessergesagt er wird die register nicht
finden)
Also besser:

ldi r16,RAMEND
out SPL,r16

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.