-
Hallo,
ich hatte geplant die LEDs zu multiplexen, es stellte sich aber heraus, dass die LEDs eine Entlade Zeit von bis zu 200 millisekunden benötigen. Deshalb blieb mir nichts anderes übrig als jede Kathode/Anode an einen Pin vom µc zu löten. Der ATmega32 hat 32 I/O Pins, und 9*3, weil jede LED 3 Anschlüsse hat bleiben also sogar noch 5 Pins übrig. Vielleicht ist das ein bisschen mit Kanonen auf Spatzen geschossen einen ATmega32 für neun LEDs zu verwenden aber in diesem Fall ging es nicht anders.
KR-500
-
Hallo
Über diesen helligkeitsempfindlichen Effekt von LEDs bin ich auch schon gestolpert. Hier misst mein RP6 die Helligkeit mit seinen ACS-IR-LEDs:
https://www.roboternetz.de/phpBB2/ze...ag.php?t=39560
Gruß
mic
-
Moin,
mich würde noch einmal Dein Code interessieren, mit dem Du die LEDs abfragst... Kannst Du da vielleicht mal ein Fragment für z.B. eine LED reinstellen?
MfG und vielen Dank, Ozzy
-
Also ich besitze einen Code für BASCOM. Wenns jemanden interessiert, stell ich in rein.
Grüße
Thomas
-
Hallo,
hier ist einmal ein Code mit dem man die LEDs abfragen kann:
Code:
while(1){
if(led[0]==0){
PORTA |= (1<<PA0);
PORTB &=~ (1<<PB0);
}
if(led[1]==0){
PORTA |= (1<<PA1);
PORTB &=~ (1<<PB1);
}
if(led[2]==0){
PORTA |= (1<<PA2);
PORTB &=~ (1<<PB2);
}
if(led[3]==0){
PORTA |= (1<<PA3);
PORTB &=~ (1<<PB3);
}
if(led[4]==0){
PORTA |= (1<<PA4);
PORTB &=~ (1<<PB4);
}
if(led[5]==0){
PORTA |= (1<<PA5);
PORTB &=~ (1<<PB5);
}
if(led[6]==0){
PORTA |= (1<<PA6);
PORTB &=~ (1<<PB6);
}
if(led[7]==0){
PORTA |= (1<<PA7);
PORTB &=~ (1<<PB7);
}
if(led[8]==0){
PORTC |= (1<<PC7);
PORTD &=~ (1<<PD5);
}
_delay_us(10);
if(led[0]==0){
DDRA &=~ (1<<PA0);
PORTA &=~ (1<<PA0);
}
if(led[1]==0){
DDRA &=~ (1<<PA1);
PORTA &=~ (1<<PA1);
}
if(led[2]==0){
DDRA &=~ (1<<PA2);
PORTA &=~ (1<<PA2);
}
if(led[3]==0){
DDRA &=~ (1<<PA3);
PORTA &=~ (1<<PA3);
}
if(led[4]==0){
DDRA &=~ (1<<PA4);
PORTA &=~ (1<<PA4);
}
if(led[5]==0){
DDRA &=~ (1<<PA5);
PORTA &=~ (1<<PA5);
}
if(led[6]==0){
DDRA &=~ (1<<PA6);
PORTA &=~ (1<<PA6);
}
if(led[7]==0){
DDRA &=~ (1<<PA7);
PORTA &=~ (1<<PA7);
}
if(led[8]==0){
DDRC &=~ (1<<PC7);
PORTC &=~ (1<<PC7);
}
_delay_ms(k-75);
a[2] = (PINA & (1<<PINA2));
a[3] = (PINA & (1<<PINA3));
a[5] = (PINA & (1<<PINA5));
_delay_ms(10);
a[4] = (PINA & (1<<PINA4));
_delay_ms(65);
a[0] = (PINA & (1<<PINA0));
a[1] = (PINA & (1<<PINA1));
a[6] = (PINA & (1<<PINA6));
a[7] = (PINA & (1<<PINA7));
a[8] = (PINC & (1<<PINC7));
DDRA = 0xFF;
DDRC = 0xFF;
if((a[0]!=0)){
if(c_flag){
PORTB |= (1<<PB0);
c_flag = 0;
c[0]=0;
}
else{
PORTC |= (1<<PC6);
c_flag = 1;
c[0]=1;
}
led[0]=1;
_delay_ms(120);
}
if(a[1]!=0){
if(c_flag){
PORTB |= (1<<PB1);
c_flag = 0;
c[1]=0;
}
else{
PORTC |= (1<<PC5);
c_flag = 1;
c[1]=1;
}
led[1]=1;
_delay_ms(120);
}
if(a[2]!=0){
if(c_flag){
PORTB |= (1<<PB2);
c_flag = 0;
c[2]=0;
}
else{
PORTC |= (1<<PC4);
c_flag = 1;
c[2]=1;
}
led[2]=1;
_delay_ms(120);
}
if(a[3]!=0){
if(c_flag){
PORTB |= (1<<PB3);
c_flag = 0;
c[3]=0;
}
else{
PORTC |= (1<<PC3);
c_flag = 1;
c[3]=1;
}
led[3]=1;
_delay_ms(120);
}
if(a[4]!=0){
if(c_flag){
PORTB |= (1<<PB4);
c_flag = 0;
c[4]=0;
}
else{
PORTC |= (1<<PC2);
c_flag = 1;
c[4]=1;
}
led[4]=1;
_delay_ms(120);
}
if(a[5]!=0){
if(c_flag){
PORTB |= (1<<PB5);
c_flag = 0;
c[5]=0;
}
else{
PORTC |= (1<<PC1);
c_flag = 1;
c[5]=1;
}
led[5]=1;
_delay_ms(120);
}
if(a[6]!=0){
if(c_flag){
PORTB |= (1<<PB6);
c_flag = 0;
c[6]=0;
}
else{
PORTC |= (1<<PC0);
c_flag = 1;
c[6]=1;
}
led[6]=1;
_delay_ms(120);
}
if(a[7]!=0){
if(c_flag){
PORTB |= (1<<PB7);
c_flag = 0;
c[7]=0;
}
else{
PORTD |= (1<<PD7);
c_flag = 1;
c[7]=1;
}
led[7]=1;
_delay_ms(120);
}
if(a[8]!=0){
if(c_flag){
PORTD |= (1<<PD5);
c_flag = 0;
c[8]=0;
}
else{
PORTD |= (1<<PD6);
c_flag = 1;
c[8]=1;
}
led[8]=1;
_delay_ms(120);
}
if_win();
}
}
man muss am Anfang noch led[9],c[9],a[9] und c_flag declarieren. Die ganze abfrage mit "if(led[0]==0){...} braucht man, damit bereits angetippte LEDs nicht mehr aus gehen. An PORTA liegen übrigens die Kathoden und an PORTB und PORTC die Anoden. if_win() ist eine Funktion die nachguckt ob schon jemand gewonnen hat.
Der erste Link in meinem ersten Posting enthält eine gute Erklärung in C, man muss die Abfrage nur noch umkehren und vielleicht mit einer kleinen Funktion die Umgebungshelligkeit abfragen, so wie hier zum Beispiel:
Code:
unsigned char led_abfrage (unsigned char zeit) {
PORTA |= (1<<PA1);
PORTB &=~ (1<<PB1);
_delay_us(10);
DDRA &=~ (1<<PA1);
PORTA &=~ (1<<PA1);
_delay_ms(zeit);
DDRA |= (1<<PA1);
return (PINA & (1<<PINA1));
}
void init (void){
while(led_abfrage(k))if(k++>=175)break;
k=k+80;
USART_Transmit(k);
}
Später addiere ich zu k nochmal 80, weil ich Festgestellt
Hier sind noch ein paar Links zum Thema "LED als Sensor", viele Leider auf Englisch:
http://forums.linear1.org/index.php?...pic,445.0.html
http://forums.linear1.org/index.php/topic,469.0.html
http://www.mikrocontroller.net/topic/56759
http://blog.makezine.com/archive/200...ch_sensor.html
http://cs.nyu.edu/~jhan/ledtouch/index.html
http://www.merl.com/publications/TR2003-035/ <- Das ist der Technische Bericht
http://projects.dimension-x.net/tech...cts/ledsensors
@TomEdl
Find ich ne gut Idee, vielleicht mag ja auch noch jemand ein Beispiel Programm für eine LED in Assembler schreiben und hier posten.
KR-500
-
Warum addiertst Du die 80 drauf? Irgendwie fehlt da was in Deinem Text...
-
Hallo
Sorry, passiert mir normalerweise nicht, dass ich Sätze nicht vollende. Was ich Festgestellt habe ist, dass die LEDs sehr empfindlich sind und wenn ich zu k nochmal 80 dazu addiere werden die LEDs unempfindlicher.
KR-500