- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: TicTacToe/Reaktivlicht - Led als Sensor

  1. #11
    Benutzer Stammmitglied Avatar von KR-500
    Registriert seit
    26.12.2007
    Alter
    29
    Beiträge
    91
    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #12
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315
    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

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.11.2008
    Ort
    Kapfenberg
    Beiträge
    628
    Also ich besitze einen Code für BASCOM. Wenns jemanden interessiert, stell ich in rein.

    Grüße
    Thomas

  5. #15
    Benutzer Stammmitglied Avatar von KR-500
    Registriert seit
    26.12.2007
    Alter
    29
    Beiträge
    91
    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

  6. #16
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315
    Warum addiertst Du die 80 drauf? Irgendwie fehlt da was in Deinem Text...

  7. #17
    Benutzer Stammmitglied Avatar von KR-500
    Registriert seit
    26.12.2007
    Alter
    29
    Beiträge
    91
    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

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress