annotate pwm.S @ 4:e2ec8dc3a6d8 default tip

Always empty the receive buffer
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Thu, 15 Sep 2016 00:03:04 +0200
parents 2b5078b37907
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
1 #include <avr/io.h>
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
2 #define PWM_PORTA_UNUSED
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
3
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
4 .global TIMER1_COMPB_vect
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
5 TIMER1_COMPB_vect:
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
6
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
7 ;Save calling state
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
8 PUSH r0
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
9 IN r0, _SFR_IO_ADDR(SREG)
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
10 PUSH r24
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
11 PUSH r25
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
12 PUSH ZL
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
13 PUSH ZH
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
14
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
15 ;Load the pointer address into register Z. As with all
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
16 ; 16 bit register accesses, you read the low byte first.
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
17 LDS ZL, _pwm_events_low_ptr
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
18 LDS ZH, _pwm_events_low_ptr+1
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
19
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
20 ; Move the pointer past the current OCR1B value
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
21 ADIW ZL, 0x02
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
22
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
23 #ifndef PWM_PORTA_UNUSED
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
24 IN r24, _SFR_IO_ADDR(PORTA)
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
25 LD r25, Z+
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
26 AND r24, r25
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
27 OUT _SFR_IO_ADDR(PORTA), r24
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
28 #endif
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
29
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
30
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
31 #ifndef PWM_PORTB_UNUSED
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
32 IN r24, _SFR_IO_ADDR(PORTB)
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
33 LD r25, Z+
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
34 AND r24, r25
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
35 OUT _SFR_IO_ADDR(PORTB), r24
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
36 #endif
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
37
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
38
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
39 #ifndef PWM_PORTC_UNUSED
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
40 IN r24, _SFR_IO_ADDR(PORTC)
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
41 LD r25, Z+
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
42 AND r24, r25
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
43 OUT _SFR_IO_ADDR(PORTC), r24
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
44 #endif
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
45
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
46
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
47 #ifndef PWM_PORTD_UNUSED
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
48 IN r24, _SFR_IO_ADDR(PORTD)
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
49 LD r25, Z+
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
50 AND r24, r25
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
51 OUT _SFR_IO_ADDR(PORTD), r24
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
52 #endif
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
53
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
54 ; Update pointer with next value in array
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
55 STS _pwm_events_low_ptr+1, ZH
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
56 STS _pwm_events_low_ptr, ZL
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
57
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
58 ;Load the new compare value into OCRnB. As with all
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
59 ; 16 bit register access, you write the high byte first.
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
60 LD r24, Z+
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
61 LD r25, Z+
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
62 STS OCR1BH, r25
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
63 STS OCR1BL, r24
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
64
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
65 ;Restore calling state
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
66 POP ZH
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
67 POP ZL
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
68 POP r25
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
69 POP r24
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
70 OUT _SFR_IO_ADDR(SREG), r0
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
71 POP r0
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
72
2b5078b37907 Working servo PWM
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
73 RETI