;******************************************************************
;* A P P L I C A T I O N N O T E F O R T H E A V R F A M I L Y
;*
;* Number:AVR360
;* File Name: "stepmot.asm"
;* Title :Simple high speed step motor controller
;* Date :98.07.02
;* Version :1.00
;* Support telephone :+47 72 88 43 88 (ATMEL Norway)
;* Support fax :+47 72 88 43 99 (ATMEL Norway)
;* Support E-mail :avr@atmel.com
;* Target MCU :All AVR devices
;*
;***************************************************************
.include "8515def.inc"
;*************** Define global registers ************************
.def temp = R16
;*************** Define constants ******************************
.equ c_value = 500 ;Compare value for output compare interrupt
;500 cycles@5Mhz = 100us
;*************************************************************
;*
;* PROGRAM START - EXECUTION STARTS HERE
;*
;****************************************************************
.cseg
;Initialize interrupt vectors
.org 0x00
rjmp main
.org OC1Aaddr ;Init Output compare A interrupt vector
rjmp OC1A
;*****************************************************************
;*
;* OC1A- Timer1 Output compare A interrupt routine
;*
;*
;* DESCRIPTION
;*
;* This interrupt routine load new step motor value from the step
;* motor table in SRAM. The values in the table have two functions,
;* the lower nibble contains the value to output to the step motor.
;* The upper nibble holds the address of the next value. First the
;* step value is output to the port, next the address is moved to
;* the XL register.
;*
;* Number of words :6 + return
;* Number of cycles :7 + return
;* Low registers used :None
;* High registers used :3 (temp,XL,XH)
;***************************************************************
OC1A:
in temp,SREG
push temp
ld temp,X ;Load temp with X pointer value
mov XL,temp ;Move value to X pointer
andi temp,0x0F ;Mask away upper nibble
out PORTB,temp ;Output lower nibble to step motor
swap XL ;Swap upper and lower nibble
andi XL,0x0F ;Mask away upper nibble, address is ready
pop temp
out SREG,temp
reti
;*************************************************************
;*
;* Main Program
;*
;* This program initialize Timer 1 output compare interrupt to
;* occur with a interval defined with the c_value constant.
;* The step motor lookup table is loaded from the flash and stored
;* in SRAM address 0x0100 to achieve maximum speed.
;*
;******************************************************************
main:
ldi r16,high(RAMEND) ;Intialize stackpointer
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
ldi temp,0x0F ;Set PORTB pin3-0 as output
out DDRB,temp
ldi temp,0x00
out PORTB,temp ;Write initial value to PORTB
ldi temp,high(c_value) ;Load compare high value
out OCR1AH,temp
ldi temp,low(c_value) ;Load compare low value
out OCR1AL,temp
ldi temp,0x00
out TCNT1H,temp ;Clear timer high byte
out TCNT1L,temp ;Clear timer low byte
out TCCR1A,temp ;Clear timer control reg A
ldi temp,0x40 <------------------------------------------------------ muss für den ATmega8 0x10 heißen !
out TIFR,temp ;Clear pending timer interrupt
out TIMSK,temp ;Enable Timer compare interrupt
ldi ZH,high(step*2) ;Init Z pointer to step table in flash
ldi ZL,low(step*2)
ldi XH,high(0x0100) ;Init X pointer to RAM location
ldi XL,low(0x0100)
ldi temp,0x04 ;Load counter value
load:
lpm ;Load step value from flash
st X+,R0 ;Store step value in RAM
adiw ZL,0x01 ;Increment flash pointer
dec temp ;Decrement counter
brne load ;Continue until table is loaded
ldi XH,high(0x0100) ;Initialize X pointer to RAM location
ldi XL,low(0x0100)
ldi temp,0x9
out TCCR1B,temp ;Clear timer on compare match,CK/1
sei ;Enable global interrupt
loop:
rjmp loop ;Do something else
;*** Step motor lookup table ***
step:
.db 0x19,0x2C,0x36,0x03