Vďaka za zverejnenie, popozerám a hádam sa niečo priučím. Ja som tiež nezaháľal, napísal som rutinu pre PCF8574T ako backpack pre LCD1602, takže mám vlastne i2C LCD. Tiež som vyskúšal čítať enkodér v prerušení ako rýchlo a presne to pôjde. Ide o 400IPR optický enkodér a je to dĺžkové odmeriavanie.
Enkodér má na sebe koleso o priemere 25.5mm ktoré je pritláčané o materiál a odvaľovaním meria prejdenú vzdialenosť. Pri 400 impulzoch a 25,5mm priemere kolesa je rozlíšenie 0,2mm. Prekvapivo môžem točiť ako besný a nestráca pulzy. Tento projekt mám aj s 8bit PICom v Basicu a tam to bolo omnoho zložitejšie.
Tu v prerušení iba testujem vektor a podľa neho pri zostupnej hrane inkrementujem alebo dekrementujem premennú.
Program je iba na pár riadkov:
Kód: Vybrať všetko
//*******************************************************************************
// MAIN *
//*******************************************************************************
int main(void){
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SystemCoreClockUpdate();
Delay_Init();
ENC_GPIO_INIT();
IIC_Init( 80000, i2cadrs);
lcd_init();
LCD_BACKLIGHT = 0x08;
while(1){
milim = (ENC_Count*0.20017)*10;
int jednotky = milim/10;
sprintf(str_val,"Dlzka: %d.%1d mm ",(jednotky), (milim %10));
lcd_set_cursor(0,0); lcd_string(str_val);
sprintf(str_val,"Impulz: %d ",ENC_Count);
lcd_set_cursor(1,0); lcd_string(str_val);
Delay_Ms(10);
}
}