AVR Assembly Call

Alle vragen m.b.t digitale schakelingen m.b.v. losse i.c's
en oplossingen m.b.v. PIC processoren.
Plaats reactie
Wafelijzer
Berichten: 5
Lid geworden op: di 8 jan 2008, 20:46
Contacteer:

AVR Assembly Call

Bericht door Wafelijzer »

Beste electronicussen,
Het lukt mij aardig met AVR en assembly maar nu probeer ik vanaf mijn main programma een RCALL te doen naar een label. Dit gebeurd ook en op het einde van het label heb ik ook een RET (return) functie. Nu knippert bv laag 2 en daarna wil ik laag 4 laten knipperen. Maar nu blijft alleen de eerste call doorgaan. Ik snap er echt niks van, mischien dat iemand mij de goede richting kan wijzen wat ik fout doe. Het is wel zo als ik CBI en SBI in de main gebruik zonder call te maken naar die functies dat het wel werkt. Hier is mijn lap code:

Code: Selecteer alles

;********************************************************
;* The Cube			 			*
;* Atmel AVR Atmega 32 4x4x4 Mono LEDCube		*
;*							*
;* Created by Jerry Jacobs				*
;* Released under GPLv3					*
;*							*
;********************************************************



;**********************
;* ATMega32 Include's *
;**********************

.DEVICE ATmega32   ;Device ATmega 32

;--------------
;PORTA Settings

.EQU PORTA =0x1b   ;PORTA Data Register
.EQU DDRA  =0x1a   ;PORTA Data Direction


;*********************************************
;* Layer settings, on PORTA (pin PA0 to PA3) *
;*********************************************

.equ  layer1   = 0		;Layer 1 on pin PA0
.equ  layer2   = 1		;Layer 2 on pin PA1
.equ  layer3   = 2		;Layer 3 on pin PA2
.equ  layer4   = 3		;Layer 4 on pin PA3


;****************
;* Jump to INIT *
;****************
rjmp init	;Initalisation


;****************************
;* Controller Initalisation *
;****************************

init: 	sbi   DDRA, layer1	;Set Layer 1 bit on DDRA pin PA0
	sbi   DDRA, layer2	;Set Layer 2 bit on DDRA pin PA1
	sbi   DDRA, layer3	;Set Layer 3 bit on DDRA pin PA2
	sbi   DDRA, layer4	;Set Layer 4 bit on DDRA pin PA3


;****************
;* Main Program *
;****************

.EQU	CPU_FREQUENCY=1000000
.CSEG
.INCLUDE	"DELAY-MACRO.H"

main:   ;rcall layer
	;sbi PORTA, layer4
	rcall layer2_blink
	;_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY	
	;sbi   PORTA, layer1			;Layer 1 On
	;_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY
	;sbi   PORTA, layer2			;Layer 2 On
	;_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY	
	;cbi   PORTA, layer2
	;rcall layer2off
	;sbi   PORTA, layer3			;Layer 3 On
	;_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY	
	;sbi   PORTA, layer4			;Layer 4 On
	;_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY	
	;rcall clr_layers			;Clear Layers
	;_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY
	;sbi   PORTA,layer4
	;_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY	
	;sbi   PORTA,layer3
	;_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY	
	;sbi   PORTA,layer2
	;_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY
	;sbi   PORTA,layer2
	;_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY
	;rcall clr_layers
	;_WAIT_10mS	CPU_FREQUENCY,8		;MAKES 80mS DELAY
	;rjmp  main		;Loop
	rjmp main

;*************************
;* Clear Layers Function *
;*************************
clr_layers:	CBI   PORTA, layer1	;Clear Layer 1 bit on PORTA
		CBI   PORTA, layer2	;Clear Layer 2 bit on PORTA
		CBI   PORTA, layer3	;Clear Layer 3 bit on PORTA
		CBI   PORTA, layer4 	;Clear Layer 4 bit on PORTA
		;RET			;Return to code

layer:		_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY		
		SBI	PORTA, layer1
		_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY		
		CBI	PORTA, layer1
		RETI

layer2_blink:	_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY		
		SBI	PORTA, layer2
		_WAIT_10mS	CPU_FREQUENCY,40		;MAKES 80mS DELAY	
		CBI	PORTA, layer2
		RET

layer2off:	CBI   PORTA,layer2	
		RET

Mandy
Berichten: 874
Lid geworden op: do 6 mei 2004, 23:05
Locatie: Zoetermeer. .. .. .. .. .. .. .. .. .

Bericht door Mandy »

Van die andere dingen weet ik niks, maar ik wil je wel attenderen dat het Elektronici is, geen elektronicussen. Klinkt wel romantisch trouwens, maar het kan ook kussens zijn van bedden.
Wafelijzer
Berichten: 5
Lid geworden op: di 8 jan 2008, 20:46
Contacteer:

Bericht door Wafelijzer »

Ik heb het al gevonden, je moet het SRAM instellen als stack. Dan kun je calls met return functie gebruiken. Moet een keer goed bestuderen hoe dat precies in ze werk gaat.

http://www.avr-asm-tutorial.net/avr_en/ ... html#Stack

Nieuwe code:

Code: Selecteer alles

;********************************************************
;* The Cube			 			*
;* Atmel AVR Atmega 32 4x4x4 Mono LEDCube		*
;*							*
;* Created by Jerry Jacobs				*
;* Released under GPLv3					*
;*							*
;********************************************************



;**********************
;* ATMega32 Include's *
;**********************

.DEVICE ATmega32   ;Device ATmega 32

;--------------
;PORTA Settings

.EQU PORTA =0x1b   ;PORTA Data Register
.EQU DDRA  =0x1a   ;PORTA Data Direction


;-------------
;SRAM Stack Settings

.EQU RAMEND =0x85F
.EQU SPH    =0x3e
.EQU SPL    =0x3d
.DEF SRamStackRegister = R31
    LDI SRamStackRegister, HIGH(RAMEND) ; Upper byte
    OUT SPH,SRamStackRegister ; to stack pointer
    LDI SRamStackRegister, LOW(RAMEND) ; Lower byte
    OUT SPL,SRamStackRegister ; to stack pointer

;*********************************************
;* Layer settings, on PORTA (pin PA0 to PA3) *
;*********************************************

.equ  layer1   = 0		;Layer 1 on pin PA0
.equ  layer2   = 1		;Layer 2 on pin PA1
.equ  layer3   = 2		;Layer 3 on pin PA2
.equ  layer4   = 3		;Layer 4 on pin PA3


;****************
;* Jump to INIT *
;****************
rjmp init	;Initalisation


;****************************
;* Controller Initalisation *
;****************************

init: 	sbi   DDRA, layer1	;Set Layer 1 bit on DDRA pin PA0
	sbi   DDRA, layer2	;Set Layer 2 bit on DDRA pin PA1
	sbi   DDRA, layer3	;Set Layer 3 bit on DDRA pin PA2
	sbi   DDRA, layer4	;Set Layer 4 bit on DDRA pin PA3


;****************
;* Main Program *
;****************

.EQU	CPU_FREQUENCY=1000000
.CSEG
.INCLUDE	"DELAY-MACRO.H"

main:	
	rcall layers_on
	_WAIT_10mS	CPU_FREQUENCY,50
	rcall layers_off
	_WAIT_10mS	CPU_FREQUENCY,50
	rcall layers_on
	_WAIT_10mS	CPU_FREQUENCY,50
	rcall layers_off
	_WAIT_10mS	CPU_FREQUENCY,50
	_WAIT_10mS	CPU_FREQUENCY,50
	_WAIT_10ms	CPU_FREQUENCY,50
	SBI PORTA, layer4
	_WAIT_10mS	CPU_FREQUENCY,50
	rcall clr_layers
	_WAIT_10mS	CPU_FREQUENCY,50
	rjmp main
	;sbi PORTA, layer4

;*************************
;* Clear Layers Function *
;*************************
clr_layers:	CBI   PORTA, layer1	;Clear Layer 1 bit on PORTA
		CBI   PORTA, layer2	;Clear Layer 2 bit on PORTA
		CBI   PORTA, layer3	;Clear Layer 3 bit on PORTA
		CBI   PORTA, layer4 	;Clear Layer 4 bit on PORTA
		RET			;Return to code

layers_on:	SBI PORTA, layer1
		SBI PORTA, layer2
		SBI PORTA, layer3
		SBI PORTA, layer4
		RET

layers_off:	CBI PORTA, layer1
		CBI PORTA, layer2
		CBI PORTA, layer3
		CBI PORTA, layer4
		RET

Plaats reactie