PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bug im AVR Studio?



gulliver
28.02.2007, 18:08
Hallo

Kann es sein, daß AVR Studio im Debug-Modus nicht richtig rollen kann? Mir ist aufgefallen, daß das rausgeschobene Bit zwar im Carry landet, aber nicht wieder eingeschoben wird. Dann braucht man sich nicht wundern, daß nur Murks bei rauskommt. Ich habe die Studio-Version 4.12.468 mit SP4. AVR Studio auf einem anderen Rechner installiert und da ist genau dasselbe Spiel.

mfg Roger

wkrug
28.02.2007, 19:30
Komisch, ich benutz die ROL und ROR Befehle relativ häufig - mir ist noch kein Fehler aufgefallen.

Bei einem ROR Befehl wird das aktuelle Carry links eingeschoben und dann das Carry mit dem rechten Bit aufgefüllt.

Wenn man dabei links eine 0 einschieben will muss man vorher das Carry mit CLC löschen, das ist klar.

Ich hab die Version 4.12 SP4 Built 498

bax
28.02.2007, 19:46
Kann ich auch nicht bestätigen, hab die 4.11.401.

Laß mal den Code hier laufen bzw. schreib mal noch etwas zu den Umständen (Typ, Register, Befehl...)


.INCLUDE "tn2313def.inc"


INC R0


TEST:

CLC

ROL R0
ROL R1
ROL R2
ROL R3
ROL R4
ROL R5
ROL R6
ROL R7
ROL R8
ROL R9
ROL R10
ROL R11
ROL R12
ROL R13
ROL R14
ROL R15
ROL R16
ROL R17
ROL R18
ROL R19
ROL R20
ROL R21
ROL R22
ROL R23
ROL R24
ROL R25
ROL R26
ROL R27
ROL R28
ROL R29
ROL R30
ROL R31

BRCC TEST

OK:
RJMP OK

greetz Rajko

gulliver
28.02.2007, 21:47
Hallo

Dieses "Programm" läuft bis zum Ende durch und macht auch das, was erwartet wird. Bisher habe ich auch kein Problem mit dem rol- oder ror-Befehl gehabt, solange das Carry ins nächste Byte übernommen wird.

Ich habe diesen Befehl bisher immer so verstanden, daß das Bit, was rausgeschoben wurde über Carry am anderen Ende wieder eingeschoben wird und das auch, wenn man nur ein Byte rotieren läßt. Genau dies macht er nicht. Er verhält sich wie ein Shift-Befehl.

Ihr könnt ja mal mein Beispielcode laufen lassen, dann seht ihr, was ich meine. Ich habe extra etwas üppig dokumentiert, denn in fremden Assemblerprogrammen durchzublicken ist manchmal ziemlich zeitaufwendig und das will ich niemandem auch noch zumuten ;-).



;************************************************* *******************
; Grundlagen - Rollen
; MCU: AT90S8515
; Quarz: 7,37MHz
;************************************************* *******************
;
.nolist
.include "C:\Programme\AVR Tools\AvrAssembler2\Appnotes\8515def.inc"
.list

;******** Konstanten **********
.equ Teiler = 0x04 ;Teiler=256
;
;Timerwerte für verschiedene Geschwindigkeiten
;.equ Timer_H = 0xfe ;0,01s
;.equ Timer_L = 0xe0

;.equ Timer_H = 0xfa ;0,05s
;.equ Timer_L = 0x61

;.equ Timer_H = 0xf4 ;0,1s
;.equ Timer_L = 0xc1

.equ Timer_H = 0xc7 ;0,5s
.equ Timer_L = 0xc5
;
.equ Bitmuster = 0b10101010
.equ Count_max = 40 ;maximaler Zählwert

.equ Ausgabe = PORTB
;
;******** Variablen (benutzte Register) ********
.def wreg = R16 ;Arbeitsregister
.def Anzeige = R17 ;Bitmuster für Ausgabeport
.def Counter = R18 ;Zähler
;
;********** Interruptvektoren **************
.org 0
rjmp main ;Sprung zum Hauptprogramm
reti ;INT0, externer Interrupt0
reti ;INT1, externer Interrupt1
reti ;TIMER1CAPT, Timer/Counter1 Capture Event
reti ;TIMER1COMPA, Timer/Counter1 Compare Match A
reti ;TIMER1COMPB, Timer/Counter1 Compare Match B
rjmp timer16 ;TIMER1OVF, Timer/Counter1 Overflow
reti ;TIMER0OVF, Timer/Counter0 Overflow
reti ;SPI, Serial Transfer Complete
reti ;UART_RX, UART_RX Complete
reti ;UART_UDRE, UART Data Register Empty
reti ;UART_TX, UART_TX Complete
reti ;ANA_COMP, Analog Comparator

;******* Interruptroutinen *************
timer16:
in wreg,SREG
push wreg

clc ;erst C-Flag löschen
rol Anzeige ;Anzeige weiterschieben
out Ausgabe,Anzeige ;und auf Port ausgeben
dec Counter ;Counter=0?
breq Flag_setzen ;dann T-Flag setzen

ldi wreg,Timer_H ;Timer wieder laden
out TCNT1H,wreg
ldi wreg,Timer_L
out TCNT1L,wreg
;
pop wreg
out SREG,wreg
ende:
reti
;
Flag_setzen:
pop wreg
out SREG,wreg
set ;T-Flag setzen
rjmp ende
;
;******* Hauptprogramm ************
main:
ldi wreg,high(RAMEND)
out SPH,wreg
ldi wreg,low(RAMEND)
out SPL,wreg

ldi wreg,0x00
out TCCR1A,wreg ;Timer1 OC1 + PWM abschalten
ldi wreg,Teiler
out TCCR1B,wreg ;Timer1 prescaling 1/256
ldi wreg,0x80
out TIMSK,wreg ;Timer1 overflow erlauben

ldi wreg,$ff ;Port B Ausgabe
out DDRB,wreg

ldi wreg,Timer_H ;Timer1 bestücken
out TCNT1H,wreg
ldi wreg,Timer_L
out TCNT1L,wreg
sei
;
start:
clt ;T-Flag löschen
ldi Counter,Count_max ;Counter und Anzeige vorbelegen
ldi Anzeige,Bitmuster
;
loop:
brts start ;wenn T-Flag gesetzt ist,dann Neuanfang
rjmp loop


Bei diesem Schnipsel würde man sicher auch ohne Doku durchsehen.
Im Grunde soll es nur ein abwechselndes Bitmuster AAhex oder 55hex rotieren lassen und ausgeben.

mfg Roger

bax
28.02.2007, 22:21
Naja, der Befehl macht ja immer das gleiche, er kann ja nicht wissen, was Du danach mit dem herausgeschobenen Carry anfangen willst.

Wurde ja schon geschrieben, aber es wird der Carry vor Ausführung des Befehls eingeschoben, hinterher entspricht der Carry dem herausgeschobenen Bit.
Einen 'ringförmigen' Austausch gibt es da nicht, für den mußt Du selbst sorgen, in dem Du im Anschluß an einen dann sinnvolleren Shift-Befehl das ausgeschobene Bit wieder an die erste Stelle setzt.

Ist dann aber im Prozessor genauso wie im Simulator ;-)

greetz Rajko

gulliver
01.03.2007, 09:49
Nun ja, macht ja auch keinen Sinn, ein Byte immer im Kreis zu rotieren. Hab ich auch jetzt erst beim rumprobieren entdeckt.
Leider habe ich mir keine Sicherung von meiner Laufschrift gemacht und immer wieder überschrieben. Da habe ich Byte für Byte durchgeschoben und je nach Carry den Ausgang gesetzt oder gelöscht. Dabei kam es zu Fehlern und dies war der Ausgangspunkt zu weiteren Versuchen. Das Carry hatte ich vor dem schieben auch immer gelöscht.

Ich werde versuchen diesen Zustand wieder herzustellen und setze diesen Code dann hier rein. Es kann also ein Weilchen dauern. Ich werde mir mal angewöhnen, Änderungen unter anderen Namen abzuspeichern, dann kann ich immer mal auf frühere Versionen zurückgreifen. Leider ist das Studio in dieser Beziehung etwas unhandlich. Ich kann zwar unter anderem Namen abspeichern, aber zum kompilieren nimmt er immer die Ausgangsversion, auch wenn ich jetzt im Projekt mehrere Quelltexte habe. Von diesen habe ich aber nichts, wenn ich sie nicht im selben Projekt kompilieren kann. Die sind nur gut, wenn ich sie mit .inc "..." einbinden will. Ich bin also gezwungen für neue Versionen jedesmal ein neues Projekt zu erstellen.

Danke an alle für die Unterstützung und damit mache ich diese Kiste zu. Falls noch jemand etwas zu sagen hat, kann er es ruhig tun, ich behalte diesen Thread noch eine Weile im Auge und antworte gegebenenfalls auch.

mfg Roger