Tolka AVR ASM kod.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
luffare
EF Sponsor
Inlägg: 132
Blev medlem: 4 oktober 2005, 16:25:21
Ort: Uppsala
Kontakt:

Tolka AVR ASM kod.

Inlägg av luffare »

Har gjort ett program i codevision (c) och ska nu tolka en avbrottsfunktion, men jag har svårt att hitta nån förklaring till vad alla assembler instruktioner gör. Hittar inte nån vettig förklaring i atmels datablad. Det jag vill veta är vad SUBOPT gör och var man hittar koden som anropas.
Vad __ADDWRR gör?
Vart HIGH(1)/LOW(1) ligger?

Här är min tolkning hittils:

Kod: Markera allt

ASM format:				Förklaring:					Klockcykler:

_adc_isr:Kommentar.
	CALL SUBOPT_0x0		Anropar nån funktion i plats 0x0? 				4+?
					som antagligen ställer in 		
					LOW/HIGH till 0x0001

	LDI  R30,LOW(1)		Ladda in värdet i LOW till Registret plats 30,		1
	LDI  R31,HIGH(1)		Ladda in värdet i HIGH till Registret plats 31,		1
	__ADDWRR 5,6,30,31		Adderar registrets ord med ord i minnet(ADCIntCount)	2+?
	__ADDWRR 8,9,30,31		Adderar registrets ord med ord i minnet(ADCIntCount2)	2+?
	IN   R7,5			Värdet i port 5 (adc buffert) hamnar i R7				1

	CALL SUBOPT_0x1
	RETI				Återgår från interrupt: laddar in programadressen i pekaren	4
					och enablar interrupt.
Så här ser koden ut med C bortkomenterad:

Kod: Markera allt

;###     126 //**************************************************
;###     127 // ADC interrupt service routine
;###     128 interrupt [ADC_INT] void adc_isr(void)
;###     129 {    
_adc_isr:
	CALL SUBOPT_0x0
;###     130 
;###     131 ADCIntCount++;
	LDI  R30,LOW(1)
	LDI  R31,HIGH(1)
	__ADDWRR 5,6,30,31
;###     132 ADCIntCount2++;
	__ADDWRR 8,9,30,31
;###     133 adc_data=ADCH; // Sparar dom 8MSB.
	IN   R7,5
;###     134 
;###     135 }//END  ADC interrupt 
	CALL SUBOPT_0x1
	RETI
;###     136 
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Tolka AVR ASM kod.

Inlägg av vfr »

Det verkar ju vara ett makro. Har du kollat i standard inkluderingsfiler till systemet om du kan hitta en definition?

Jag kör inte AVR så i det fallet är jag inte till hjälp.
Användarvisningsbild
luffare
EF Sponsor
Inlägg: 132
Blev medlem: 4 oktober 2005, 16:25:21
Ort: Uppsala
Kontakt:

Re: Tolka AVR ASM kod.

Inlägg av luffare »

Japp det var ett makro här är den senaste tolkningen:

Kod: Markera allt

ASM format:				Förklaring:					Klockcykler:

_adc_isr:				Kommentar.
	CALL SUBOPT_0x0		Anropar subrutin. Ändrar pekar adress			4
												
	LDI  R30,LOW(1)		Ladda in värdet i LOW till Registret plats 30,		1
	LDI  R31,HIGH(1)		Ladda in värdet i HIGH till Registret plats 31,		1
	__ADDWRR 5,6,30,31		Macro för att addera in 30 i 5 och 31 i 6			2	
	__ADDWRR 8,9,30,31		Macro för att addera in 30 i 8 och 31 i 9			2
	IN   R7,5			Värdet i port 5 (adc buffert) hamnar i R7			1

	CALL SUBOPT_0x1		Anropar subrutin. Ändrar pekar adress			4
	RETI				Återgår från interrupt: laddar in programadressen i pekaren	4
					och enablar interrupt.

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x0:
	ST   -Y,R30			Lägger R30 i Y-adress och minskar adress med 1		2
	ST   -Y,R31			Lägger R31 i Y-adress och minskar adress med 1		2
	IN   R30,SREG			SREG hamnar i R30					1
	ST   -Y,R30			Lägger R30 i Y-adress och minskar adress med 1		2
	RET				Flyttar adress från stack till pekare, återgår.			4
;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x1:				
	LD   R30,Y+			Lägger till 1 i Y och sparar innehållet på adressen		2
					i R30				
	OUT  SREG,R30			Lägger in R30 i SREG					1
	LD   R31,Y+			 Lägger till 1 i Y och sparar innehållet på adressen		2
					i R31
	LD   R30,Y+			 Lägger till 1 i Y och sparar innehållet på adressen		2
					i R30
	RET				Flyttar adress från stack till pekare, återgår.			4

	.MACRO __ADDWRR
	ADD  R@0,R@2		Addera R@0 med R@2					1
	ADC  R@1,R@3			Addera R@1 med R@3					1
	.ENDM 


Så iprincip sparar den statusregistret i början av interrupt, sen hämtar den in en int(HIGH(1)/LOW(1)) adderar den med dom två variablerna, sparar adc värdet, återställer sreg och går ut.
Det som fattas att luska ut är vart HIGH(1)/LOW(1) är och varför gör den inte bara en INC på variablerna?
sodjan
EF Sponsor
Inlägg: 43243
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Tolka AVR ASM kod.

Inlägg av sodjan »

Inget macro, det är en vanlig (men automatgenererad) subrutin.
Skriv svar