@krtv_stsc:
Also es kommt drauf an, wenn man etwas sauberer arbeiten würde, (nicht wie ich irgenwann mitten in der Nacht) könnte ich damit Leben.
Design follows function.
Zumal ich ja noch keine (einfach irgendwo bestellbare) Alternative gefunden hab.
@BMS:
Ja klar das es von selbst matl, die ADCs in deinem AVR sind relativ empfindlich und hochohmig und in dem Moment wo das Display nicht berührt wird, hängt der quasi in der Luft.
Da bekommst du von überall her schöne Einstreuungen.
Deshalb überprüfe ich bevor ich Koordinaten auslese immer erst ob sich die X und die Y Folie überhaupt berühren.
Code:
uint8_t touch_is_pressed() {
TOUCH_DDR |= (1 << TOUCH_X1);
TOUCH_DDR |= (1 << TOUCH_Y1);
TOUCH_DDR &= ~(1 << TOUCH_X2);
TOUCH_PORT &= ~(1 << TOUCH_Y1);
TOUCH_PORT |= (1 << TOUCH_X1);
if(readADC(TOUCH_X2) < TOUCH_PRESSED_LEVEL) {
return 1;
}
else {
return 0;
}
}
Ohne Berührung liegen da am ADC so ziemlich die vollen 5V an.
Wird das Display berührt zieht die Y-Folie das mehr oder weniger auf Masse.
Jetzt muss man nur noch rumprobieren bis man einen Passenden Grenzwert hat und gut is.
@Ceos:
Lies mal im Datasheet für den lc7891 nach.
Da steht das wenn man Daten aus dem Memory lesen will, muss man erst ein dummy readout machen.
D.h. erst beim zweiten mal lesen hast du sinnvolle Daten. Der erste Readout is Müll.
Code:
uint8_t lcd_read_byte() {
uint8_t i,data;
for(i = 0; i < 2; i++) {
_delay_us(1);
lcd_rw_low();
lcd_rs_high();
LCD_DATA = 0x0D;
_delay_us(1);
lcd_en_high();
LCD_DATA_DDR = 0x00;
lcd_rs_low();
lcd_rw_high();
_delay_us(1);
data = (uint8_t) LCD_DATA_PIN;
lcd_en_low();
LCD_DATA_DDR = 0xFF;
}
return data;
}
Sebastian
Lesezeichen