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
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!
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
Super das hat mir sehr weiter geholfen. Vielen Dank für euer Hilfe. Gruß Ingo
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.