Hallo
Man kann die LED-Matrix auch als Helligkeitssensor missbrauchen:
Bild hier Bild hier
http://www.youtube.com/watch?v=MhpReBX-s7w
http://www.youtube.com/watch?v=2_mNqzsTawU
Vielleicht kann man das später mal nutzen. Arbeitscode der Messfunktion:
GrußCode:// https://www.roboternetz.de/phpBB2/ze...ag.php?t=39560 // http://cs.nyu.edu/~jhan/ledtouch/index.html uint16_t get_line(uint8_t y) // Helligkeit der Zeile y als 16Bit-Wert einlesen { uint16_t temp=0; clear_line(); // Erst alle 120 Kathoden auf high PORTB &= ~0x03; // und 120 Anoden auf low schalten DDRB |= 0x03; PORTD &= ~0xf0; DDRD |= 0xf0; PORTC &= ~0x0f; DDRC |= 0x0f; //_delay_ms(5); // und schlieslich alle LEDs "aufladen" (Strom?) //asm volatile ("nop"); switch(y) { case 0: DDRB &= ~2; // Anoden der gewünschten Zeile auf Eingang while(!(PINB & 2)) // warten bis Pegel high erreicht ist temp++; // solange Zähler erhöhen return(temp); // Messwert zurückgeben case 1: DDRB &= ~1; while(!(PINB & 1)) temp++; return(temp); case 2: DDRD &=~128; while(!(PIND &128)) temp++; return(temp); case 3: DDRD &= ~64; while(!(PIND & 64)) temp++; return(temp); case 4: DDRD &= ~32; while(!(PIND & 32)) temp++; return(temp); case 5: DDRD &= ~16; while(!(PIND & 16)) temp++; return(temp); case 6: DDRC &= ~8; while(!(PINC & 8)) temp++; return(temp); case 7: DDRC &= ~4; while(!(PINC & 4)) temp++; return(temp); case 8: DDRC &= ~2; while(!(PINC & 2)) temp++; return(temp); case 9: DDRC &= ~1; while(!(PINC & 1)) temp++; return(temp); default: return(0); } } void clear_line(void) // setzt alle Ausgänge der Schieberegister auf high { uint8_t c; PORTB |= (1<<4); for(c=0; c<12; c++) { PORTB |= (1 << 3); /* PB3 = 1 (cl) */ PORTB &= ~(1 << 3); /* PB3 = 0 (!cl) */ } PORTB |= (1 << 2); /* PB2 = 1 (str) */ PORTB &= ~(1 << 2); /* PB2 = 0 (!str) */ }
mic







Zitieren


Lesezeichen