Heren,

Ik heb overlaatst het boek AVR microcontrollers van Elektuur gekocht en dan op het net nog wat zitten zoeken achter tutorials.

nu heb ik AVR studio 4 op mijn pc staan en ik tik mijn programma in en dan kun je gaan debuggen/simuleren.

Als oefenwerkje wil ik een night rider maken met 8 ledjes op een AT90S2313

enkel heb ik een probleempje, na de 'delay' subroutine zet ik RET (return from subroutine) maar dan springt ie terug naar het begin van mijn programma en niet na de regel waar ik rcall delay aanroep.

even mijn programmacode posten:

.include 	"2313def.inc"		;	include
.device		AT90S2313
.def 		temp = R16          ; Register R16 -> name temp
.def		tel = R17			; Register 17 -> name count
.org 0x0000     		        ;code address 0x0000
rjmp START ;

START:	;
	ldi		temp,0b11111111		; load 11111111 in temp
	out		DDRB,temp			; portB is output
	ldi		tel,0b11111111		; teller op 255 zette

RIDER:
	ldi		temp,0b00000001		
	out		PORTB,temp			; led1 aan
	rcall   DELAY				; DELAYen
	ldi		temp,0b00000010
	out		PORTB,temp			; led2 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b00000100
	out		PORTB,temp			; led3 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b00001000
	out		PORTB,temp			; led4 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b00010000
	out		PORTB,temp			; led5 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b00100000
	out		PORTB,temp			; led6 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b01000000
	out		PORTB,temp			; led7 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b10000000
	out		PORTB,temp			; led8 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b01000000
	out		PORTB,temp			; led7 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b00100000
	out		PORTB,temp			; led6 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b00010000
	out		PORTB,temp			; led5 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b00001000
	out		PORTB,temp			; led4 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b00000100
	out		PORTB,temp			; led3 aan
	rcall	DELAY				; DELAYen
	ldi		temp,0b00000010
	out		PORTB,temp			; led2 aan
	rcall	DELAY				; DELAYen
	rjmp	RIDER				;loop it

DELAY:
	cpi 	tel,0b00000000	; vergelijk count met 0
	dec 	tel
	brne	DELAY	
	ldi		tel,0b11111111
	ret

dus na die RET springt hij naar boven naar het regeltje RJMP start

ik ben nog vrij nieuw met die AVR's dus een beetje hulp van jullie graag :D

ha ha, nog een AVR freak.
Ben ook een beginneling met de AVR's, Koen
maar wat doet RETI in plaats van RET.
RETI wordt gebruikt als je uit een interupt terug komt.

met RETI doet hij net hetzelfde.
ik heb van een website een gelijksoortig assembler bestand gehaald ook met night rider maar dan met 6 leds en daar heb ik hetzelfde probleem. ik begin te twijfelen of het niet aan de software ligt ?

er schiet mij even iets te binnen, dat ik vergeten ben de stack te pointen naar RAMEND dus ik ga even verder proberen, ik laat het weten of dit de oplossing is :)

:EDIT:

Hij doet het!!!!!! :D


ldi    temp, RAMEND		;point stack in RAM
	out    SPL, temp

was ik vergeten, waardoor de stackpointer op een waarde kwam te staan die niet mogelijk was en daardoor deed ie raar :)

[Bericht gewijzigd door Koen Van Vlaenderen op ]

Yep, ik verdenk ook studio 4 van rare capriolen in zijn simulator.
Ben eens gaan zoeken tussen mijn projectjes, ik heb mij ook eens bezig gehouden met een looplicht in assembler, welliswaar met een AT90S8535 op een STK-200 board.
RET zou volgens mij toch moeten doen waar het voor bedoeld is, bij mij werkte alles ok,zo?
dit is de code, en ik heb toen ook RET gebruikt en het werkte "just fine":

.include "8535def.inc"

.def reg1 = r16
.def reg2 = r17
.def reg3 = r18
.def reg4 = r19
.def reg5 = r20
.def temp = r21

Reset: ldi reg3,0b11111111
out DDRB,reg3
ldi reg4,0b00000000
out PortB,reg4

ldi temp,low(ramend)
out spl,temp
ldi temp,high(ramend)
out sph,temp

Schema1: ldi reg5,10

Seq1: ldi reg3,0b01111110
out PortB,reg3
rcall Delay1

ldi reg3,0b10111101
out PortB,reg3
rcall Delay1

ldi reg3,0b11011011
out PortB,reg3
rcall Delay1

ldi reg3,0b11100111
out PortB,reg3
rcall Delay1

ldi reg3,0b11111111
out PortB,reg3
rcall Delay1
dec reg5
cpi reg5,0
brne Seq1

Schema2: ldi reg5,20

Seq2: ldi reg3,0b11111110
out PortB,reg3
rcall Delay2

ldi reg3,0b11111101
out PortB,reg3
rcall Delay2

ldi reg3,0b11111011
out PortB,reg3
rcall Delay2

ldi reg3,0b11110111
out PortB,reg3
rcall Delay2

ldi reg3,0b11101111
out PortB,reg3
rcall Delay2

ldi reg3,0b11011111
out PortB,reg3
rcall Delay2

ldi reg3,0b10111111
out PortB,reg3
rcall Delay2

ldi reg3,0b01111111
out PortB,reg3
rcall Delay2

ldi reg3,0b10111111
out PortB,reg3
rcall Delay2

ldi reg3,0b11011111
out PortB,reg3
rcall Delay2

ldi reg3,0b11101111
out PortB,reg3
rcall Delay2

ldi reg3,0b11110111
out PortB,reg3
rcall Delay2

ldi reg3,0b11111011
out PortB,reg3
rcall Delay2

ldi reg3,0b11111101
out PortB,reg3
rcall Delay2

ldi reg3,0b11111110
out PortB,reg3
rcall Delay2
dec reg5
cpi reg5,0
brne Seq2

Schema3: ldi reg5,5

Seq3: ldi reg3,0b11111110
out PortB,reg3
rcall Delay1

ldi reg3,0b11111100
out PortB,reg3
rcall Delay1

ldi reg3,0b11111000
out PortB,reg3
rcall Delay1

ldi reg3,0b11110000
out PortB,reg3
rcall Delay1

ldi reg3,0b11100000
out PortB,reg3
rcall Delay1

ldi reg3,0b11000000
out PortB,reg3
rcall Delay1

ldi reg3,0b10000000
out PortB,reg3
rcall Delay1

ldi reg3,0b00000000
out PortB,reg3
rcall Delay1

ldi reg3,0b01111111
out PortB,reg3
rcall Delay1

ldi reg3,0b00111111
out PortB,reg3
rcall Delay1

ldi reg3,0b00011111
out PortB,reg3
rcall Delay1

ldi reg3,0b00001111
out PortB,reg3
rcall Delay1

ldi reg3,0b00000111
out PortB,reg3
rcall Delay1

ldi reg3,0b00000011
out PortB,reg3
rcall Delay1

ldi reg3,0b00000001
out PortB,reg3
rcall Delay1
dec reg5
cpi reg5,0
brne Seq3

Schema4: ldi reg5,10

Seq4: ldi reg3,0b11111111
out PortB,reg3
rcall Delay1

ldi reg3,0b11111110
out PortB,reg3
rcall Delay1

ldi reg3,0b11111100
out PortB,reg3
rcall Delay1

ldi reg3,0b11111000
out PortB,reg3
rcall Delay1

ldi reg3,0b11110001
out PortB,reg3
rcall Delay1

ldi reg3,0b11100011
out PortB,reg3
rcall Delay1

ldi reg3,0b11000111
out PortB,reg3
rcall Delay1

ldi reg3,0b10001111
out PortB,reg3
rcall Delay1

ldi reg3,0b00011111
out PortB,reg3
rcall Delay1

ldi reg3,0b00111111
out PortB,reg3
rcall Delay1

ldi reg3,0b01111111
out PortB,reg3
rcall Delay1

ldi reg3,0b11111111
out PortB,reg3
rcall Delay1
dec reg5
cpi reg5,0
brne Seq4

Schema4b: ldi reg5,10

Seq4b: ldi reg3,0b11111111
out PortB,reg3
rcall Delay1

ldi reg3,0b01111111
out PortB,reg3
rcall Delay1

ldi reg3,0b00111111
out PortB,reg3
rcall Delay1

ldi reg3,0b00011111
out PortB,reg3
rcall Delay1

ldi reg3,0b10001111
out PortB,reg3
rcall Delay1

ldi reg3,0b11000111
out PortB,reg3
rcall Delay1

ldi reg3,0b11100011
out PortB,reg3
rcall Delay1

ldi reg3,0b11110001
out PortB,reg3
rcall Delay1

ldi reg3,0b11111000
out PortB,reg3
rcall Delay1

ldi reg3,0b11111100
out PortB,reg3
rcall Delay1

ldi reg3,0b11111110
out PortB,reg3
rcall Delay1

ldi reg3,0b11111111
out PortB,reg3
rcall Delay1
dec reg5
cpi reg5,0
brne Seq4b

Schema5: ldi reg5,15

Seq5: ldi reg3,0b00000000
out PortB,reg3
rcall Delay1

ldi reg3,0b11111111
out PortB,reg3
rcall Delay1
dec reg5
cpi reg5,0
brne Seq5

Schema6: ldi reg5,20

Seq6: ldi reg3,0b10101010
out PortB,reg3
rcall Delay1

ldi reg3,0b01010101
out PortB,reg3
rcall Delay1
dec reg5
cpi reg5,0
brne Seq6

Schema7: ldi reg5,20

Seq7: ldi reg3,0b00001111
out PortB,reg3
rcall Delay1
rcall Delay1

ldi reg3,0b11110000
out PortB,reg3
rcall Delay1
rcall Delay1
dec reg5
cpi reg5,0
brne Seq7

Schema8: ldi reg5,15

Seq8: ldi reg3,0b01111110
out PortB,reg3
rcall Delay1

ldi reg3,0b00111100
out PortB,reg3
rcall Delay1

ldi reg3,0b00011000
out PortB,reg3
rcall Delay1

ldi reg3,0b00000000
out PortB,reg3
rcall Delay1

ldi reg3,0b11111111
out PortB,reg3
rcall Delay1
dec reg5
cpi reg5,0
brne Seq8

Schema9: ldi reg5,15

Seq9: ldi reg3,0b11100111
out PortB,reg3
rcall Delay1

ldi reg3,0b11000011
out PortB,reg3
rcall Delay1

ldi reg3,0b10000001
out PortB,reg3
rcall Delay1

ldi reg3,0b00000000
out PortB,reg3
rcall Delay1

ldi reg3,0b11111111
out PortB,reg3
rcall Delay1
dec reg5
cpi reg5,0
brne Seq9

Schema10: ldi reg5,10

Seq10: ldi reg3,0b01111111
out PortB,reg3
rcall Delay1

ldi reg3,0b01011111
out PortB,reg3
rcall Delay1

ldi reg3,0b01010111
out PortB,reg3
rcall Delay1

ldi reg3,0b01010101
out PortB,reg3
rcall Delay1

ldi reg3,0b01010100
out PortB,reg3
rcall Delay1

ldi reg3,0b01010000
out PortB,reg3
rcall Delay1

ldi reg3,0b01000000
out PortB,reg3
rcall Delay1

ldi reg3,0b00000000
out PortB,reg3
rcall Delay1

ldi reg3,0b11111111
out PortB,reg3
rcall Delay1
dec reg5
cpi reg5,0
brne Seq10

Schema11: ldi reg5,10

Seq11: ldi reg3,0b11111110
out PortB,reg3
rcall Delay2

ldi reg3,0b11111100
out PortB,reg3
rcall Delay2

ldi reg3,0b11111000
out PortB,reg3
rcall Delay2

ldi reg3,0b11110000
out PortB,reg3
rcall Delay2

ldi reg3,0b11100000
out PortB,reg3
rcall Delay2

ldi reg3,0b11000000
out PortB,reg3
rcall Delay2

ldi reg3,0b10000000
out PortB,reg3
rcall Delay2

ldi reg3,0b00000000
out PortB,reg3
rcall Delay2

ldi reg3,0b11111111
out PortB,reg3
rcall Delay2

ldi reg3,0b01111111
out PortB,reg3
rcall Delay2

ldi reg3,0b00111111
out PortB,reg3
rcall Delay2

ldi reg3,0b00011111
out PortB,reg3
rcall Delay2

ldi reg3,0b00001111
out PortB,reg3
rcall Delay2

ldi reg3,0b00000111
out PortB,reg3
rcall Delay2

ldi reg3,0b00000011
out PortB,reg3
rcall Delay2

ldi reg3,0b00000001
out PortB,reg3
rcall Delay2

ldi reg3,0b00000000
out PortB,reg3
rcall Delay2

ldi reg3,0b11111111
out PortB,reg3
rcall Delay2

dec reg5
cpi reg5,0
brne Seq11
rcall Schema1

Delay1: ldi reg4,3
rjmp LoopB

Delay2: ldi reg4,2

LoopB: ldi reg2,255
LoopA: ldi reg1,255

Loop1: dec reg1
brne Loop1

Loop2: dec reg2
brne LoopA

Loop3: dec reg4
brne LoopB
ret

.exit

o god, ja dienen stack was ik ook vergeten

Koen als het je intereseerd om in basic te proggrammeren voor de AVR, dit is een goede Basic-compiler, en de demo versie kan tot 2k compileren, wat voldoende is voor een AT90S2313.

http://www.mcselec.com/bascom-avr.htm

Het aansturen van LCD,serial port,enzv wordt hier heel wat makkelijker mee

just telling you
groetjes