-         

Ergebnis 1 bis 2 von 2

Thema: lauflichtgeschwindigkeit über Poti regeln

  1. #1

    lauflichtgeschwindigkeit über Poti regeln

    Anzeige

    Hallo,
    hab gerade lauflichter programmiert. jetzt möcht ich die Geschwindigkeit meines lauflichts über ein Poti (ADC-Eingang) steuern.
    kann mir jemand bei meinem code weiterhelfen
    Code:
    #include <avr/io.h>
    #include <delay.h>
    
    uint16_t auswertung (void);
    volatile uint16_t wert=0;
    
    zeit (void)
    int n;
    
    
    int main (void)
    {
      uint16_t =0,ergebnis=0;
      n = 0;
    
      //Ports initialisieren
      DDRD  = 0xFF; //Port C als Ausgang für die LED's
      PORTD = 0XFF; //Pull Up's aktiviert
      
    
      while(1)
      {
        zeit = n;
        ergebnis = auswertung();
    
        PORTD = (0b00000001);
    	_delay_ms(n); 	 
        PORTD = (0b00000010);  
    	_delay_ms(n); 
        PORTD = (0b00000100);
    	_delay_ms(n); 	 
        PORTD = (0b00001000);  
    	_delay_ms(n); 
        PORTD = (0b00010000);  
    	_delay_ms(n); 
        PORTD = (0b00100000);
    	_delay_ms(n); 	 
        PORTD = (0b01000000);  
    	_delay_ms(n); 
        PORTD = (0b10000000);
    	_delay_ms(n); 	 
        PORTD = (0b01000000);  
    	_delay_ms(n); 
        PORTD = (0b00100000);
    	_delay_ms(n); 	 
        PORTD = (0b00010000);  
    	_delay_ms(n); 
        PORTD = (0b00001000);
    	_delay_ms(n); 	 
        PORTD = (0b00000100);  
    	_delay_ms(n); 
        PORTD = (0b00000010);
    	_delay_ms(n); 
      
    }
    
    
    
    uint16_t auswertung (void)
    {
    
    
    //Initialisieren
    ADCSRA = ((1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0));
    ADMUX = ((1<<MUX3));//interner Vref wird benutzt 2,5V; ohne REFS1 und REFS2 wird angelegter Vref bentzt max 5V; MUX3 ist ADC0
    
    //Dummy Auslesung als Warm-Up wie im Tutorial
    ADCSRA |= (1<<ADSC);
    while (ADCSRA & (1<<ADSC));
    
    //Messung
    ADCSRA |= (1<<ADSC);
    while (ADCSRA & (1<<ADSC));
    
    wert = ADCL; //ERR
    wert += (ADCH<<8); //Alternativ 'wert = ADCW;'
    
    ADCSRA &= ~(1<<ADEN); //ADC Disable
    
    return wert;
    
    }
    
    zeit  (void)//auslesen von adc und damit geschwindigkeit der leds festlegen
    {
    
    	{if ( (ergebnis <= 256) & (ergebnis > 0) )
    	{n=10;}
    	if ( (ergebnis <= 512) & (ergebnis > 256) )
    	{n=100;}
    	if ( (ergebnis <= 768) & (ergebnis > 512) )
    	{n=500;}
    	if ( (ergebnis <= 1024) & (ergebnis > 768) )
    	{n=1000;}
    	else {n=0;}}
    	return n;
    }

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.12.2004
    Alter
    33
    Beiträge
    165
    der Wert von _delay_xs muss zur Compilezeit bekannt sein.

    Wie waere es mit einer Schleife, in die dann das _delay_ms kommt, die je nach Potistellung n mal durchlaufen wird.


    EDITH: Da ist ja noch viel mehr kaputt. Sicher das du C einigermassen beherrschst? Mit Codestueckchen abschreiben kommt man ohne Grundwissen nicht sehr weit, sieht man ganz deutlich da die einzelnen Stuecken recht korrekt aussehen, aber beim Verknuepfen der einzelnen Codeteile ist fast alles irgendwie falsch.
    Lies mal einschlaegige Tutorials.

Berechtigungen

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