[MEGA2560] KS108+ Voice+Splash "far" (#3534)

+little option (not defined) to reduce encoder resolution
This commit is contained in:
Ingwie
2016-05-26 06:33:09 +02:00
committed by Bertrand Songis
parent 74adc1c7e6
commit 116802c946
6 changed files with 53 additions and 29 deletions
+4
View File
@@ -251,6 +251,10 @@ void lcdInit();
void lcdRefresh();
#if defined(LCD_KS108)
void lcdRefreshSide();
#endif
#if defined(LCD_ST7920)
uint8_t lcdRefresh_ST7920(uint8_t full);
#define IS_LCD_REFRESH_ALLOWED() (0==lcdstate)
+1 -1
View File
@@ -52,7 +52,7 @@ void drawSplash()
{
lcdClear();
#if defined(PCBMEGA2560) && !defined(SIMU)
lcd_imgfar(0, 0, pgm_get_far_address(splash_lbm), 0, 0); // use progmem "far" for splash working with all other options enabled
lcd_imgfar(0, 0, (GET_FAR_ADDRESS(splashdata)+4), 0, 0); // use progmem "far" for splash working with all other options enabled
#else
lcd_img(0, 0, splash_lbm, 0, 0);
#endif
+3 -1
View File
@@ -138,7 +138,9 @@ void perMain()
drawStatusLine();
}
#if defined(LCD_ST7920)
#if defined(LCD_KS108)
lcdRefreshSide();
#elif defined(LCD_ST7920)
lcdstate = lcdRefresh_ST7920(0);
#else
lcdRefresh();
+8 -10
View File
@@ -65,8 +65,13 @@ void lcdSetRefVolt(uint8_t val)
{
}
void lcdRefreshSide(display_t * p)
void lcdRefreshSide()
{
static uint8_t change = 0; // toggle left or right lcd writing
uint8_t *p;
if (change == 0){ CS2_off; CS1_on; p = displayBuf; change = 1;} // Right
else{ CS1_off; CS2_on; p = displayBuf + 64; change = 0;} // Left
for (uint8_t page=0; page < 8; page++) {
lcdSendCtl(DISPLAY_SET_COLUMN); // Column addr 0
lcdSendCtl( page | DISPLAY_SET_PAGE); //Page addr
@@ -82,13 +87,6 @@ void lcdRefreshSide(display_t * p)
void lcdRefresh()
{
// Right
CS1_on;
lcdRefreshSide(displayBuf);
CS1_off;
// Left
CS2_on;
lcdRefreshSide(displayBuf + 64);
CS2_off;
lcdRefreshSide();
lcdRefreshSide();
}
+22 -6
View File
@@ -25,16 +25,16 @@ inline void boardInit()
{
// Set up I/O port data directions and initial states (unused pin setting : input, pull-up on)
DDRA = 0b11111111; PORTA = 0b00000000; // LCD data
DDRB = 0b01110111; PORTB = 0b00101111; // 7:SOMOBusy, 6:PPM_OUT, 5:SimCTRL, 4:Buzzer, SDCARD[3:MISO 2:MOSI 1:SCK 0:CS]
DDRB = 0b01110111; PORTB = 0b00101111; // 7:WTV20SDBusy, 6:PPM_OUT, 5:SimCTRL, 4:Buzzer, SDCARD[3:MISO 2:MOSI 1:SCK 0:CS]
DDRC = 0b11111100; PORTC = 0b00000011; // 7-3:LCD, 2:BackLight, 1:ID2_SW, 0:ID1_SW
DDRD = 0b00000000; PORTD = 0b11111100; // 7:AilDR_SW, 6:N/A, 5:N/A, 4:N/A, 3:RENC2_B, 2:RENC2_A, 1:I2C_SDA, 0:I2C_SCL
DDRE = 0b00001010; PORTE = 0b01110100; // 7:PPM_IN, 6:N/A, 5:RENC1_B, 4:RENC1_A, 3:SOMOData, 2:N/A, 1:TELEM_TX, 0:TELEM_RX
DDRE = 0b00001010; PORTE = 0b01110100; // 7:PPM_IN, 6:N/A, 5:RENC1_B, 4:RENC1_A, 3:WTV20SDData, 2:N/A, 1:TELEM_TX, 0:TELEM_RX
DDRF = 0b00000000; PORTF = 0b11111111; // 7-0:Trim switch inputs
DDRG = 0b00100000; PORTG = 0b11011111; // 7:N/A, 6:N/A, 5:SOMOClock, 4:N/A, 3:N/A, 2:TCut_SW, 1:Gear_SW, 0: RudDr_SW
DDRG = 0b00100000; PORTG = 0b11011111; // 7:N/A, 6:N/A, 5:WTV20SDClock, 4:N/A, 3:N/A, 2:TCut_SW, 1:Gear_SW, 0: RudDr_SW
#if defined(DEBUG)
DDRH = 0b01011010; PORTH = 0b11110100; // 7:N/A, 6:RF_Activated, 5:DSC_Activated, 4:Hold_Power, 3:Speaker, 2:N/A, 1:SOMOReset, 0:Haptic
DDRH = 0b01011010; PORTH = 0b11110100; // 7:N/A, 6:RF_Activated, 5:DSC_Activated, 4:Hold_Power, 3:Speaker, 2:N/A, 1:WTV20SDReset, 0:Haptic
#else
DDRH = 0b00011010; PORTH = 0b11110100; // 7:N/A, 6:RF_Activated, 5:DSC_Activated, 4:Hold_Power, 3:Speaker, 2:N/A, 1:SOMOReset, 0:Haptic
DDRH = 0b00011010; PORTH = 0b11110100; // 7:N/A, 6:RF_Activated, 5:DSC_Activated, 4:Hold_Power, 3:Speaker, 2:N/A, 1:WTV20SDReset, 0:Haptic
#endif
DDRJ = 0b00000000; PORTJ = 0b11111111; // 7:N/A, 6:N/A, 5:N/A, 4:N/A, 3:N/A, 2:N/A, 1:RENC2_push, 0:RENC1_push
DDRK = 0b00000000; PORTK = 0b00000000; // Analogic input (no pull-ups)
@@ -57,7 +57,7 @@ inline void boardInit()
#endif
#if defined(VOICE)
// SOMO set-up, with TIMER5
// WTV20SD set-up, with TIMER5
OCR5A = 0x1F4; //2ms
TCCR5B = (1 << WGM52) | (0b011 << CS50); // CTC OCR5A
TIMSK5 |= (1<<OCIE5A); // Start the interrupt so the unit reset can occur
@@ -197,24 +197,40 @@ void readKeysAndTrims()
ISR(INT4_vect) // Arduino2560 IO02 (portE pin4)
{
uint8_t input = (PINE & 0x30);
#if defined (ROTENC_DIV2)// Rotenc resolution/2
if (input == 0) incRotaryEncoder(0, -1);
#else
if (input == 0 || input == 0x30) incRotaryEncoder(0, -1);
#endif
}
ISR(INT5_vect) // Arduino2560 IO03 (portE pin5)
{
uint8_t input = (PINE & 0x30);
#if defined (ROTENC_DIV2)// Rotenc resolution/2
if (input == 0) incRotaryEncoder(0, +1);
#else
if (input == 0 || input == 0x30) incRotaryEncoder(0, +1);
#endif
}
ISR(INT2_vect) // Arduino2560 IO19 (portD pin2)
{
uint8_t input = (PIND & 0x0C);
#if defined (ROTENC_DIV2)// Rotenc resolution/2
if (input == 0) incRotaryEncoder(1, -1);
#else
if (input == 0 || input == 0x0C) incRotaryEncoder(1, -1);
#endif
}
ISR(INT3_vect) // Arduino2560 IO18 (portD pin3)
{
uint8_t input = (PIND & 0x0C);
#if defined (ROTENC_DIV2)// Rotenc resolution/2
if (input == 0) incRotaryEncoder(1, +1);
#else
if (input == 0 || input == 0x0C) incRotaryEncoder(1, +1);
#endif
}
+15 -11
View File
@@ -23,6 +23,10 @@
#include "../common_avr/board_avr.h"
//Mods for futur use ? Beta tester love it
//#define ROTENC_DIV2 // rotenc resolution/2
// Keys
#define KEYS_GPIO_REG_MENU pinl
#define KEYS_GPIO_PIN_MENU (1<<4)
@@ -95,21 +99,21 @@ void sdPoll10ms(void);
// Servitudes driver
#define INP_E_PPM_IN 7 //not used (reserved)
#define INP_B_14DBUSY 7 //somo14d, not used (reserved)
#define INP_B_WTV_BUSY 7 //WTV20SD, not used (reserved)
#define OUT_B_PPM 6
#define OUT_B_SIM_CTL 5
#define OUT_B_BUZZER 4
#define INP_D_I2C_SCL 1
#define INP_D_I2C_SDA 0
#define OUT_E_14DDATA 3 //somo14d
#define OUT_E_WTV_DATA 3 //WTV20SD
#define INP_E_TELEM_RX 1
#define OUT_E_TELEM_TX 0
#define OUT_G_14DCLK 5 //somo14d
#define OUT_G_WTV_CLK 5 //WTV20SD
#define INP_H_RF_Activated 6
#define INP_H_DSC_Activated 5 //not used, reserved for pwrCheck()
#define INP_H_Hold_Power 4 //not used, reserved for pwrCheck()
#define OUT_H_Speaker 3
#define OUT_H_14DRESET 1 //somo14d
#define OUT_H_WTV_RESET 1 //WTV20SD
#define OUT_H_HAPTIC 0
// Rotary encoders driver
@@ -127,7 +131,7 @@ void sdPoll10ms(void);
#define PORTA_LCD_DAT PORTA
#define PORTC_LCD_CTRL PORTC
#if defined(LCD_KS108) // (For KS108 LCd only) MEGA R/W pin always at 0 state in Opentx then
#define OUT_C_LCD_CS2 6 //Use this pin to control second KS108
#define OUT_C_LCD_CS2 6 // Use this pin to control second KS108
#else // And connect LCD R/W pin to ground via a 1k resistor
#define OUT_C_LCD_RnW 6
#endif
@@ -168,12 +172,12 @@ void pwrOff();
// Voice driver
#if defined(VOICE)
#define WTV20SD_Clock_on PORTG |= (1<<OUT_G_14DCLK)
#define WTV20SD_Clock_off PORTG &= ~(1<<OUT_G_14DCLK)
#define WTV20SD_Data_on PORTE |= (1<<OUT_E_14DDATA)
#define WTV20SD_Data_off PORTE &= ~(1<<OUT_E_14DDATA)
#define WTV20SD_Reset_on PORTH |= (1<<OUT_H_14DRESET)
#define WTV20SD_Reset_off PORTH &= ~(1<<OUT_H_14DRESET)
#define WTV20SD_Clock_on PORTG |= (1<<OUT_G_WTV_CLK)
#define WTV20SD_Clock_off PORTG &= ~(1<<OUT_G_WTV_CLK)
#define WTV20SD_Data_on PORTE |= (1<<OUT_E_WTV_DATA)
#define WTV20SD_Data_off PORTE &= ~(1<<OUT_E_WTV_DATA)
#define WTV20SD_Reset_on PORTH |= (1<<OUT_H_WTV_RESET)
#define WTV20SD_Reset_off PORTH &= ~(1<<OUT_H_WTV_RESET)
#define WTV20SD_BUSY (PINB & 0x80)
#define WTV20SD_CLK (PING & 0x20)
#endif