Вт июл 12, 2016 09:33:44
Вт июл 12, 2016 17:30:31
Вт июл 12, 2016 20:35:56
Вт июл 12, 2016 21:46:26
Ср июл 13, 2016 06:06:05
Ср июл 13, 2016 07:54:28
Ср июл 13, 2016 20:17:27
void timer_ISR(void);
struct {
volatile unsigned char tick : 1 ;
} flag;
int main()
{
CyGlobalIntEnable; /* Enable global interrupts. */
timer_ISR_StartEx(timer_ISR);
Timer_1_Start();
...
}
void timer_ISR(void) {
timer_ISR_ClearPending();
LED_Blue_Write(~LED_Blue_Read());
flag.tick = 1;
}
Чт июл 14, 2016 00:09:59
Чт июл 14, 2016 08:05:18
I2C_Init();
I2C_scl_SetDriveMode(I2C_scl_DM_RES_UP);
I2C_sda_SetDriveMode(I2C_sda_DM_RES_UP);
LED_Red_Write(1);
if (i2c_wr_reg(SSD1306_I2C_ADDRESS, 0x00, init_sequence, sizeof(init_sequence)) != I2C_I2C_MSTR_NO_ERROR) LED_Red_Write(0);
uint32 i2c_wr_reg(unsigned char address, unsigned char reg_addr, const char *data, unsigned int length) {
uint32 status;
I2C_I2CMasterClearStatus();
status = I2C_I2CMasterSendStart(address, I2C_I2C_WRITE_XFER_MODE);
if(I2C_I2C_MSTR_NO_ERROR == status) {/* Check if transfer completed without errors */
status = I2C_I2CMasterWriteByte(reg_addr);
if(I2C_I2C_MSTR_NO_ERROR != status) return status;
/* Send array */
while (length--) {
status = I2C_I2CMasterWriteByte(*data++);
if(I2C_I2C_MSTR_NO_ERROR != status) return status;
}
}
I2C_I2CMasterSendStop(); /* Send Stop */
return status;
}
Чт июл 14, 2016 18:24:27
Пт июл 15, 2016 11:36:37
#include <project.h>
void WDT0_ISR(void);
struct {
volatile unsigned char tick : 1 ;
} flag;
int main()
{
uint32 count = 0;
CyGlobalIntEnable; /* Enable global interrupts. */
CySysWdtUnlock(); // configure WDT for periodic interrupt
CySysWdtSetMode(CY_SYS_WDT_COUNTER0, CY_SYS_WDT_MODE_INT);
CySysWdtSetMatch(CY_SYS_WDT_COUNTER0, 32000); // setup for 1 sec interval
CySysWdtSetClearOnMatch(CY_SYS_WDT_COUNTER0, 1);
CySysWdtSetInterruptCallback(CY_SYS_WDT_COUNTER0, WDT0_ISR);
CySysWdtEnable(CY_SYS_WDT_COUNTER0_MASK); // enable WDT counter 0
/* Start LCD */
LED_Blue_Write(0);
LCD_SEG_Start();
LCD_SEG_WritePixel(LCD_SEG_K1, LCD_SEG_PIXEL_STATE_OFF);
LCD_SEG_WritePixel(LCD_SEG_K2, LCD_SEG_PIXEL_STATE_OFF);
LCD_SEG_WritePixel(LCD_SEG_K3, LCD_SEG_PIXEL_STATE_OFF);
LCD_SEG_WritePixel(LCD_SEG_K4, LCD_SEG_PIXEL_STATE_OFF);
LCD_SEG_WritePixel(LCD_SEG_K7, LCD_SEG_PIXEL_STATE_OFF);
LCD_SEG_WritePixel(LCD_SEG_K8, LCD_SEG_PIXEL_STATE_OFF);
LCD_SEG_WritePixel(LCD_SEG_P1, LCD_SEG_PIXEL_STATE_OFF);
LCD_SEG_WritePixel(LCD_SEG_P2, LCD_SEG_PIXEL_STATE_OFF);
LCD_SEG_WritePixel(LCD_SEG_DP1, LCD_SEG_PIXEL_STATE_ON);
LCD_SEG_WritePixel(LCD_SEG_DP2, LCD_SEG_PIXEL_STATE_OFF);
LCD_SEG_Write7SegNumber_0(count, 0u, LCD_SEG_NO_LEADING_ZEROES);
while (1) {
if (flag.tick != 0) {
flag.tick = 0;
++count;
LCD_SEG_Write7SegNumber_0(count, 0u, LCD_SEG_LEADING_ZEROES);
}
}
}
void WDT0_ISR(void) {
CySysWdtClearInterrupt(CY_SYS_WDT_COUNTER0_INT);
flag.tick = 1;
}
Пт июл 15, 2016 19:21:51
Пт июл 15, 2016 20:02:00
Пт июл 15, 2016 21:22:27
Сб июл 16, 2016 07:07:43
Вот, а при коэффициенте 1х возможно подавление всех помех, даже от простого механического энкодера. Уже была мысль сделать на LUT, но они максимум 5 входов имеют. Т.е. одного LUT недостаточно. С другой стороны - а куда девать результат? Что-то реверсируемый счетчик я не наблюдаю. Хочется аппаратно сделать такую штуку:Some mechanical and low cost optical quadrature encoders may exhibit noise near the transition from one state to the next. This noise may cause the encoder to count invalid transitions and result in an encoder position error. To avoid this error, the encoder outputs should be filtered, either with a passive RC circuit or with the use of a digital filter. The Debouncer component that is available on PSoC devices with UDBs may be used to filter the encoder outputs. This should eliminate the noise on most low cost quadrature decoders.
Сб июл 16, 2016 17:01:36
Вс июл 17, 2016 08:21:34
if (QuadDec_GetEvents() == QuadDec_INVALID_IN) LED_Blue_Write(1);
Ср авг 10, 2016 10:11:02
Ср авг 10, 2016 16:24:39
Ср авг 10, 2016 18:31:32