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:
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) */
}
Gruß
mic
Lesezeichen