Mercurial > controller
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 |
| 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 |
