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 .

Code:
;********************************************************************
; 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