This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| et:examples:sensor:reflectance_sensor [2023/10/16 23:40] – [Praktika] heiko.pikner | et:examples:sensor:reflectance_sensor [2023/10/17 00:16] (current) – heiko.pikner | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Jooneandur ====== | ||
| + | //Vajalikud teadmised: | ||
| + | [HW] [[et: | ||
| + | [AVR] [[et: | ||
| + | [LIB] [[et: | ||
| + | |||
| + | ===== Teooria ===== | ||
| + | |||
| + | ToDo | ||
| + | |||
| + | ===== Praktika | ||
| + | |||
| + | < | ||
| + | <code c> | ||
| + | // Kodulabori QTR_RC jooneanduri näidisprogramm | ||
| + | // Peegeldumise mõõtmise funktsioon on blokeeruv | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Kodulabor III | ||
| + | pin pin_rc_in_1 = PIN(B, 2); | ||
| + | pin pin_rc_in_2 = PIN(B, 1); | ||
| + | pin pin_rc_in_3 = PIN(B, 0); | ||
| + | pin pin_rc_in_4 = PIN(A, 7); | ||
| + | |||
| + | unsigned short QTR_RC_measure(pin rc_in_pin) | ||
| + | { | ||
| + | if(_sys_freq == 2) | ||
| + | Homelab_clock_init(); | ||
| + | |||
| + | // Pin setup | ||
| + | pin_setup_output(rc_in_pin); | ||
| + | |||
| + | // Reset timer | ||
| + | TC_ClearOverflowFlag(& | ||
| + | TC_Restart(& | ||
| + | |||
| + | // Set timer D0 Normal mode | ||
| + | // Top value 9000 (~270cm) | ||
| + | // with clock freq of F_CPU / 64 | ||
| + | TC_SetPeriod(& | ||
| + | TC1_ConfigClockSource( &TCD1, TC_CLKSEL_DIV1_gc); | ||
| + | |||
| + | // Create trigger pulse | ||
| + | pin_set(rc_in_pin); | ||
| + | |||
| + | // Wait ~10 us | ||
| + | while (TCD1.CNT < 50); | ||
| + | |||
| + | // Reset timer | ||
| + | TC_SetCount(& | ||
| + | |||
| + | // Wait for echo start | ||
| + | pin_setup_input(rc_in_pin); | ||
| + | |||
| + | while (pin_get_value(rc_in_pin)) | ||
| + | { | ||
| + | // Timeout ? | ||
| + | if (TC_GetOverflowFlag(& | ||
| + | { | ||
| + | return 0; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Convert time to distance: | ||
| + | // | ||
| + | return (unsigned long)TCD1.CNT; | ||
| + | } | ||
| + | |||
| + | |||
| + | // Põhiprogramm | ||
| + | int main(void) | ||
| + | { | ||
| + | unsigned short reading_1; | ||
| + | unsigned short reading_2; | ||
| + | unsigned short reading_3; | ||
| + | unsigned short reading_4; | ||
| + | char text[16]; | ||
| + | |||
| + | // LCD ekraani seadistamine | ||
| + | lcd_gfx_init(); | ||
| + | lcd_gfx_clear(); | ||
| + | lcd_gfx_goto_char_xy(1, | ||
| + | lcd_gfx_write_string(" | ||
| + | |||
| + | // Väike paus | ||
| + | sw_delay_ms(100); | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | while (1) | ||
| + | { | ||
| + | // Mõõtmine | ||
| + | reading_1 = QTR_RC_measure(pin_rc_in_1); | ||
| + | // | ||
| + | reading_2 = QTR_RC_measure(pin_rc_in_2); | ||
| + | // | ||
| + | reading_3 = QTR_RC_measure(pin_rc_in_3); | ||
| + | // | ||
| + | reading_4 = QTR_RC_measure(pin_rc_in_4); | ||
| + | |||
| + | // Mõõtmine õnnestus? | ||
| + | if (reading_1 > 0) | ||
| + | { | ||
| + | // Kauguse tekstiks teisendamine | ||
| + | sprintf(text, | ||
| + | } | ||
| + | // Mõõtmisel tekkis viga? | ||
| + | else | ||
| + | { | ||
| + | // Vea tekst | ||
| + | sprintf(text, | ||
| + | } | ||
| + | |||
| + | // Teksti kuvamine LCD teise rea alguses | ||
| + | lcd_gfx_goto_char_xy(3, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | // Mõõtmine õnnestus? | ||
| + | if (reading_2 > 0) | ||
| + | { | ||
| + | // Kauguse tekstiks teisendamine | ||
| + | sprintf(text, | ||
| + | } | ||
| + | // Mõõtmisel tekkis viga? | ||
| + | else | ||
| + | { | ||
| + | // Vea tekst | ||
| + | sprintf(text, | ||
| + | } | ||
| + | |||
| + | // Teksti kuvamine LCD teise rea alguses | ||
| + | lcd_gfx_goto_char_xy(3, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | // Mõõtmine õnnestus? | ||
| + | if (reading_3 > 0) | ||
| + | { | ||
| + | // Kauguse tekstiks teisendamine | ||
| + | sprintf(text, | ||
| + | } | ||
| + | // Mõõtmisel tekkis viga? | ||
| + | else | ||
| + | { | ||
| + | // Vea tekst | ||
| + | sprintf(text, | ||
| + | } | ||
| + | |||
| + | // Teksti kuvamine LCD teise rea alguses | ||
| + | lcd_gfx_goto_char_xy(3, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | // Mõõtmine õnnestus? | ||
| + | if (reading_4 > 0) | ||
| + | { | ||
| + | // Kauguse tekstiks teisendamine | ||
| + | sprintf(text, | ||
| + | } | ||
| + | // Mõõtmisel tekkis viga? | ||
| + | else | ||
| + | { | ||
| + | // Vea tekst | ||
| + | sprintf(text, | ||
| + | } | ||
| + | |||
| + | // Teksti kuvamine LCD teise rea alguses | ||
| + | lcd_gfx_goto_char_xy(3, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | // Väike paus | ||
| + | sw_delay_ms(100); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | /* | ||
| + | [[et: | ||
| + | ===== Lisamaterjalid ===== | ||
| + | |||
| + | * {{: | ||
| + | * [[http:// | ||
| + | |||
| + | */ | ||