PWM debug ready! (might reimpliment better, the macros suck)
This commit is contained in:
parent
1f74d8e77c
commit
4d61973a28
@ -23,13 +23,14 @@ static struct pwm_event {
|
|||||||
bool enabled;
|
bool enabled;
|
||||||
} events[SOFTPWM_PIN_COUNT + 1];
|
} events[SOFTPWM_PIN_COUNT + 1];
|
||||||
|
|
||||||
|
//these macros and the list_insert/remove functions are kinda ass.
|
||||||
//if list_insert and list_remove end up being too slow, these have a lot of room for
|
//if list_insert and list_remove end up being too slow, these have a lot of room for
|
||||||
//optimization. We could do a preprocessor IF/THEN instead of using member offset
|
//optimization. We could do a preprocessor IF/THEN instead of using member offset,
|
||||||
//TODO accept pointer instead of actual value
|
//who knows, maybe even a inline funciton that can handle all the cases would be better.
|
||||||
#define LIST_INSERT(new, prev, member) (\
|
#define LIST_INSERT(new, prev, member) (\
|
||||||
list_insert(new->member, prev->member, offsetof(struct pwm_event, member)))
|
list_insert(&((new)->member), &((prev)->member), offsetof(struct pwm_event, member)))
|
||||||
|
|
||||||
#define LIST_REMOVE(event, member) list_remove((event)->member, offsetof(struct pwm_event, member))
|
#define LIST_REMOVE(event, member) list_remove(&((event)->member), offsetof(struct pwm_event, member))
|
||||||
|
|
||||||
#define EVENT_FROM_MEMBER(member_ptr, member_offset) \
|
#define EVENT_FROM_MEMBER(member_ptr, member_offset) \
|
||||||
((struct pwm_event *)(char *)member_ptr - member_offset)
|
((struct pwm_event *)(char *)member_ptr - member_offset)
|
||||||
@ -64,8 +65,8 @@ void init_softpwm() {
|
|||||||
for(size_t event_i = 1; event_i <= SOFTPWM_PIN_COUNT; event_i++) {
|
for(size_t event_i = 1; event_i <= SOFTPWM_PIN_COUNT; event_i++) {
|
||||||
events[event_i].time = event_i;
|
events[event_i].time = event_i;
|
||||||
events[event_i].pins = (1 << event_i) - 1;
|
events[event_i].pins = (1 << event_i) - 1;
|
||||||
LIST_INSERT(&(events[event_i]),
|
LIST_INSERT(&events[event_i],
|
||||||
&events[((int)event_i - 1) % (SOFTPWM_PIN_COUNT + 1)], active);
|
&(events[((int)event_i - 1) % (SOFTPWM_PIN_COUNT + 1)]), active);
|
||||||
events[event_i].enabled = true;
|
events[event_i].enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,11 +125,6 @@ void softpwm_set(uint8_t pin, uint8_t duty) {
|
|||||||
pin_event->time = duty;
|
pin_event->time = duty;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
ISR(TIMER0_OVF_vect) {
|
|
||||||
}
|
|
||||||
**/
|
|
||||||
|
|
||||||
ISR(TIMER0_COMP_vect) {
|
ISR(TIMER0_COMP_vect) {
|
||||||
static struct pwm_event *on_event = &events[SOFTPWM_PIN_COUNT];
|
static struct pwm_event *on_event = &events[SOFTPWM_PIN_COUNT];
|
||||||
SOFTPWM_PORT = on_event->pins;
|
SOFTPWM_PORT = on_event->pins;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user