From d86f0ad5a9ad6b7b7646d408fb8c182ef593e719 Mon Sep 17 00:00:00 2001 From: optixx Date: Sun, 20 Sep 2009 12:09:13 +0200 Subject: [PATCH] add simple pwm to start --- avr/usbload/command.c | 18 ++++++++++++++++++ avr/usbload/command.h | 1 + avr/usbload/main.c | 26 +++----------------------- avr/usbload/pwm.c | 38 ++++++++++++++++---------------------- 4 files changed, 38 insertions(+), 45 deletions(-) diff --git a/avr/usbload/command.c b/avr/usbload/command.c index def7a31..f61e1fe 100644 --- a/avr/usbload/command.c +++ b/avr/usbload/command.c @@ -28,9 +28,27 @@ #include "sram.h" #include "info.h" #include "irq.h" +#include "usbdrv.h" extern uint32_t req_bank_size; +void usb_connect() +{ + uint8_t i = 0; + info_P(PSTR("USB init\n")); + usbDeviceDisconnect(); /* enforce re-enumeration, do this while */ + cli(); + info_P(PSTR("USB disconnect\n")); + i = 10; + while (--i) { /* fake USB disconnect for > 250 ms */ + _delay_ms(50); + } + led_on(); + usbDeviceConnect(); + info_P(PSTR("USB connect\n")); +} + + void send_reset() { diff --git a/avr/usbload/command.h b/avr/usbload/command.h index 6d8b504..4c6b633 100644 --- a/avr/usbload/command.h +++ b/avr/usbload/command.h @@ -25,5 +25,6 @@ void send_reset(); void send_irq(); void set_rom_mode(); +void usb_connect(); #endif diff --git a/avr/usbload/main.c b/avr/usbload/main.c index dc38db4..2354de0 100644 --- a/avr/usbload/main.c +++ b/avr/usbload/main.c @@ -250,26 +250,6 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) */ -void usb_connect() -{ - uint8_t i = 0; - info_P(PSTR("USB init\n")); - usbDeviceDisconnect(); /* enforce re-enumeration, do this while */ - cli(); - info_P(PSTR("USB disconnect\n")); - i = 10; - while (--i) { /* fake USB disconnect for > 250 ms */ - led_on(); - _delay_ms(15); - led_off(); - _delay_ms(35); - } - led_on(); - usbDeviceConnect(); - info_P(PSTR("USB connect\n")); -} - - void boot_startup_rom(uint16_t init_delay) { info_P(PSTR("Fetch loader rom\n")); @@ -293,7 +273,6 @@ void boot_startup_rom(uint16_t init_delay) snes_irq_off(); snes_hirom(); snes_wr_disable(); - irq_stop(); snes_bus_active(); info_P(PSTR("Activate SNES bus\n")); @@ -335,14 +314,15 @@ int main(void) banner(); system_init(); - //pwm_init(); + pwm_init(); shared_memory_init(); snes_reset_hi(); snes_reset_off(); irq_init(); - boot_startup_rom(500); + boot_startup_rom(50); globals_init(); + pwm_stop(); usbInit(); usb_connect(); diff --git a/avr/usbload/pwm.c b/avr/usbload/pwm.c index 7086c9e..3c0a180 100644 --- a/avr/usbload/pwm.c +++ b/avr/usbload/pwm.c @@ -28,29 +28,19 @@ #include "sram.h" -#define PWM_SINE_MAX 255 +#define PWM_SINE_MAX 64 +#define PWM_OVERFLOW_MAX 1024 uint8_t pwm_sine_table[] = { -0x7f,0x82,0x85,0x88,0x8b,0x8e,0x91,0x94,0x97,0x9b,0x9e,0xa1,0xa4,0xa7,0xaa,0xad, -0xaf,0xb2,0xb5,0xb8,0xbb,0xbe,0xc0,0xc3,0xc6,0xc8,0xcb,0xcd,0xd0,0xd2,0xd4,0xd7, -0xd9,0xdb,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf0,0xf2,0xf3, -0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfd, -0xfd,0xfd,0xfd,0xfd,0xfd,0xfc,0xfc,0xfb,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4, -0xf3,0xf2,0xf0,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xdf,0xdd,0xdb,0xd9, -0xd7,0xd4,0xd2,0xd0,0xcd,0xcb,0xc8,0xc6,0xc3,0xc0,0xbe,0xbb,0xb8,0xb5,0xb2,0xaf, -0xad,0xaa,0xa7,0xa4,0xa1,0x9e,0x9b,0x97,0x94,0x91,0x8e,0x8b,0x88,0x85,0x82,0x7f, -0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,0x4f, -0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,0x25, -0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x14,0x12,0x10,0x0f,0x0e,0x0c,0x0b,0x0a, -0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b, -0x0c,0x0e,0x0f,0x10,0x12,0x14,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,0x25,0x27, -0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,0x4f,0x51, -0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c,0x7f +0x7f,0x8b,0x97,0xa4,0xaf,0xbb,0xc5,0xcf,0xd9,0xe1,0xe8,0xef,0xf4,0xf8,0xfb,0xfd, +0xfd,0xfd,0xfb,0xf8,0xf3,0xee,0xe7,0xe0,0xd7,0xce,0xc4,0xb9,0xae,0xa2,0x96,0x89, +0x7e,0x71,0x65,0x59,0x4d,0x42,0x37,0x2d,0x24,0x1c,0x15,0x0f,0x09,0x05,0x03,0x01, +0x01,0x01,0x03,0x07,0x0b,0x11,0x17,0x1f,0x28,0x31,0x3b,0x46,0x52,0x5e,0x6a,0x76 }; volatile uint8_t pwm_setting; // Einstellungen für die einzelnen PWM-Kanäle - volatile uint8_t pwm_overflow; // Einstellungen für die einzelnen PWM-Kanäle + volatile uint16_t pwm_overflow; // Einstellungen für die einzelnen PWM-Kanäle volatile uint8_t pwm_idx; // Einstellungen für die einzelnen PWM-Kanäle + volatile uint16_t pwm_overflow_max; // Einstellungen für die einzelnen PWM-Kanäle ISR(TIMER2_COMPA_vect) { static uint8_t pwm_cnt=0; @@ -65,29 +55,33 @@ uint8_t pwm_sine_table[] = { pwm_cnt=0; else pwm_cnt++; - if (!pwm_overflow++){ + if (pwm_overflow_max == pwm_overflow++ ){ pwm_setting = pwm_sine_table[pwm_idx++]; + pwm_overflow = 0; if (PWM_SINE_MAX == pwm_idx) pwm_idx = 0; } } +void pwm_speed(uint16_t val) { + pwm_overflow_max = val; +} + void pwm_set(uint8_t val) { pwm_setting = val; } void pwm_stop(void) { while(pwm_setting!=0xfd); - //cli(); TIMSK2 = 0; - //sei(); } void pwm_init(void) { + pwm_overflow_max = PWM_OVERFLOW_MAX; pwm_setting = 0x7f; pwm_overflow = 0; //cli(); TCCR2B = 1; TIMSK2 |= (1<