skillnad på kod? (avr asm)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

skillnad på kod? (avr asm)

Inlägg av Rymdninja »

Hejsan!
Jag bara undrar om det är någon essentiell skillnad på dessa två kod snuttar

charA är addressen till en konstant bara...

Kod: Markera allt

bigLoop:
	ldi ZL, low(charA*2)
	ldi ZH, high(charA*2)
	rcall writeChar
	rjmp bigLoop		; now we do this again


writeChar:	
	lpm     
	out PORTD, R0		; send it to the port			; 
	ret
och

Kod: Markera allt

bigLoop:
	ldi ZL, low(charA*2)
	ldi ZH, high(charA*2)
	lpm     
	out PORTD, R0		; send it to the port			; 
	rjmp bigLoop		; now we do this again

alltså bortsett från exekveringstid och längd på programmet.
Anledningen till att jag frågar är att när jag skickar data till PORTD med andra koden så blir resultatet som jag vill..men med den första snutten så börjar min led-display blinka. Precis som om att PORTD nollställs vid varje rcall eller nåt....

tack o hej
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Dom skall fungera exact likadant.

Skummt att det blinkar med ena.

Du är helt säker på att den inte manipulerar portD ngn annan stans i programmet?

Måste nästan vara så.

Prova annars o lägg in ett fast värde istället för att hämta det med stacken o se om det likadant då.
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Du har troligt vis inte stält in stack pekren den som håller reda på retur addressen...

lägg den här coden efter Reset så borde det fungera

Kod: Markera allt

ldi	temp,low(RAMEND)
out	SPL,temp      ;init Stack Pointer
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg av Rymdninja »

erixon: jag tror inte jag riktigt fattar vad du menar....efter reset?
Du menar alltså att stackpekaren inte initieras by default?
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Ahh det stämmer, Den raden måste du ha med.
Nej den initieras inte som default tyvärr.

Så när du hoppade så skrev den om alltihop o det blev knas.

Såhär någonting borde det se ut (om man använder den init som jag brukar köra med) fast den som föreslogs här kanske funegarr lika bra o är mindre?:

Kod: Markera allt

init:
	ldi	r16,ramend			;Init stackpointer
	out	spl,r16
	ldi	r16,high(ramend)
	out	sph,r16
	ldi	temp,$ff		
	out	ddrc,temp			;Init port c to output

bigLoop:
   ldi ZL, low(charA*2)
   ldi ZH, high(charA*2)
   rcall writeChar
   rjmp bigLoop      ; now we do this again

writeChar:   
   lpm     
   out PORTD, R0      ; send it to the port
   ret 
Senså brukar jag ha med ngt sånthär i toppen på varje projekt

Kod: Markera allt


.include "m32def.inc"
.def	temp   	= r16		;Temporärt register
.def	temp2	= r13		;Temporärt register
.def	count1	= r18		;Används för timer
.def	count2	= r19		;Används för timer
.CSEG
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg av Rymdninja »

tack för alla svar...efter en nogrannare titt i databladet så står det juh där med att man måste initiera stackpekaren :)

ha en bra dag :)
Användarvisningsbild
chille
Inlägg: 2469
Blev medlem: 25 juni 2003, 20:54:41
Ort: Stockholm
Kontakt:

Inlägg av chille »

Varför använder alla r16 som temp? :lol:
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Det kommer sig nog av att r16 är det första (lägsta) register som man kan köra "immediate"-instruktioner på.
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1652
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Inlägg av RDX* »

Det brukar vara standard att köra r16 som tempregister. Det underlättar att programmera assembler med "standard register" dvs. alla register är förbestämda vad de är till för. Om man tex använder en subrutin som någon annan har skrivigt så är det bra man inte använder ett register som temp när subrutinen har sparat något viktigt i registret. Vilket register som är vilket kan dock variera beroende på processor och programmeringsspråk.
Skriv svar