Procházet zdrojové kódy

Change software pwm method to fix blink issue

yuk86
Kai Ryu před 10 roky
rodič
revize
e26869d70a
2 změnil soubory, kde provedl 44 přidání a 16 odebrání
  1. 1
    1
      common/breathing_led.c
  2. 43
    15
      keyboard/gh60/backlight.c

+ 1
- 1
common/breathing_led.c Zobrazit soubor

step++; step++;
if (step >= BREATHING_LED_LEVELS - breathing_led_config.level) { if (step >= BREATHING_LED_LEVELS - breathing_led_config.level) {
step = 0; step = 0;
index++;
backlight_set_raw(pgm_read_byte(&breathing_table[index])); backlight_set_raw(pgm_read_byte(&breathing_table[index]));
index++;
} }
} }

+ 43
- 15
keyboard/gh60/backlight.c Zobrazit soubor

#include "backlight.h" #include "backlight.h"
#include "debug.h" #include "debug.h"


#ifndef GH60_REV_CHN
#define SOFTPWM_TIMER_TOP F_CPU/(256*64)
uint8_t softpwm_ocr = 0;
uint8_t softpwm_ocr_buff = 0;
#endif

#if defined(BREATHING_LED_ENABLE) || defined(BACKLIGHT_CUSTOM) #if defined(BREATHING_LED_ENABLE) || defined(BACKLIGHT_CUSTOM)
static const uint8_t backlight_table[] PROGMEM = { static const uint8_t backlight_table[] PROGMEM = {
0, 16, 128, 255 0, 16, 128, 255
{ {
#if defined(GH60_REV_CHN) #if defined(GH60_REV_CHN)
// Turn on PWM // Turn on PWM
cli();
DDRB |= (1<<PB6); DDRB |= (1<<PB6);
TCCR1A |= ( (1<<WGM10) | (1<<COM1B1) );
TCCR1B |= ( (1<<CS11) | (1<<CS10) );
cli();
TCCR1A |= ((1<<WGM10) | (1<<COM1B1));
TCCR1B |= ((1<<CS11) | (1<<CS10));
sei(); sei();
#else #else
DDRF |= (1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4); DDRF |= (1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
PORTF |= (1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4); PORTF |= (1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
cli(); cli();
TCCR1A |= (1<<WGM10);
TCCR1B |= ((1<<CS11) | (1<<CS10));
TIMSK1 |= ((1<<OCIE1A) | (1<<TOIE1));
TIFR1 |= (1<<TOV1);
TCCR1B |= (1<<WGM12);
TCCR1B |= (1<<CS10);
OCR1AH = (SOFTPWM_TIMER_TOP>>8)&0xff;
OCR1AL = SOFTPWM_TIMER_TOP&0xff;
TIMSK1 |= (1<<OCIE1A);
sei(); sei();
#endif #endif
} }
TCCR1A &= ~( (1<<WGM10) | (1<<COM1B1) ); TCCR1A &= ~( (1<<WGM10) | (1<<COM1B1) );
TCCR1B &= ~( (1<<CS11) | (1<<CS10) ); TCCR1B &= ~( (1<<CS11) | (1<<CS10) );
sei(); sei();
OCR1A = 0;
OCR1B = 0;
#else #else
DDRF &= ~(1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4); DDRF &= ~(1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
cli(); cli();
TCCR1A &= ~(1<<WGM10);
TCCR1B &= ~((1<<CS11) | (1<<CS10));
TIMSK1 |= ((1<<OCIE1A) | (1<<TOIE1));
TIFR1 |= (1<<TOV1);
TCCR1B &= ~(1<<WGM12);
TCCR1B &= ~(1<<CS10);
TIMSK1 &= ~(1<<OCIE1A);
sei(); sei();
OCR1A = 0; OCR1A = 0;
#endif #endif
{ {
#if defined(GH60_REV_CHN) #if defined(GH60_REV_CHN)
OCR1B = raw; OCR1B = raw;

#else #else
OCR1A = raw;
softpwm_ocr_buff = raw;
#endif #endif
} }


#ifndef GH60_REV_CHN
#if defined(GH60_REV_CHN)
#else
ISR(TIMER1_COMPA_vect)
{
static uint8_t pwm = 0;
pwm++;
// LED on
if (pwm == 0) {
//PORTB |= (1<<PB6);
PORTF &= ~(1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
softpwm_ocr = softpwm_ocr_buff;
}
// LED off
if (pwm == softpwm_ocr) {
//PORTB &= ~(1<<PB6);
PORTF |= (1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
}
}
/*
ISR(TIMER1_COMPA_vect) ISR(TIMER1_COMPA_vect)
{ {
// LED off // LED off
ISR(TIMER1_OVF_vect) ISR(TIMER1_OVF_vect)
{ {
// LED on // LED on
PORTF &= ~(1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
if (OCR1A > 15) {
PORTF &= ~(1<<PF7 | 1<<PF6 | 1<<PF5 | 1<<PF4);
}
} }
*/
#endif #endif
#else #else
#if defined(GH60_REV_CHN) #if defined(GH60_REV_CHN)