-         

Ergebnis 1 bis 6 von 6

Thema: Bug im AVR Studio?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.01.2005
    Ort
    Germany
    Beiträge
    55

    Bug im AVR Studio?

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    10.02.2005
    Ort
    eastside, L.E.
    Alter
    46
    Beiträge
    104
    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...)

    Code:
    .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

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    08.01.2005
    Ort
    Germany
    Beiträge
    55
    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

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    10.02.2005
    Ort
    eastside, L.E.
    Alter
    46
    Beiträge
    104
    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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    08.01.2005
    Ort
    Germany
    Beiträge
    55
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •