Frage zu Assembler und AVRStudio

Gast #168014
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
Gast #168016
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!
Gast #168017
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren