-         

Ergebnis 1 bis 7 von 7

Thema: adc konfigurieren und auslesen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    30.03.2006
    Ort
    Lübeck
    Alter
    29
    Beiträge
    60

    adc konfigurieren und auslesen

    Anzeige

    moin,

    ich mochte gerne an meinen mega168 ein poti anschliessen und den wert über einen analogen eingang einlesen.

    jetzt ist die frage wie ich in AVR studio in C auf dies adc ports zugreife.
    vielleicht bin ich einfach zu blöd, aber ich hab im netz nichts dazu gefunden, leider nur in basic, aber das kann ich nicht.

    [-o< Stefan

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    07.01.2006
    Beiträge
    36
    Hallo lionking,

    schau mal bei http://www.mikrocontroller.net/artic...R-GCC-Tutorial vorbei - da wird die Programmierung des ADC für C erklärt und ein Beispiel ist auch dabei. Wenn Du konkrete Probleme bei der Umsetzung hast, melde Dich am besten nochmal.

    Gruß
    kanal28

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    30.03.2006
    Ort
    Lübeck
    Alter
    29
    Beiträge
    60
    danke, das hat mir schonmal sehr weitergeholfen, den teil hab ich irgendwie voll übersehen

    doch nochwas, in dem tutorial ist der adc anhand des AT90S8535 beschrieben, was ist da anders zu meinem mega168?

    die simu funzt jedenfalls schonmal

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    30.03.2006
    Ort
    Lübeck
    Alter
    29
    Beiträge
    60
    sop nu hab ich nen kleines probblem, wie gesagt funzt die simu, aber halt nicht in real.

    ich will die blinkgeschwindigkeit einer LED mit einem Poti steuern.
    das blinken der led funzt, nur die steuerung nicht.

    ich hab das poti (50k) an 5V und GND und den schleifer an PC1 bzw ADC1

    Code:
    #include <avr/io.h>
    
    int t=0;
    int c = 0;
    
    void init_io(void)
    {
        DDRD  |= (1<<PD2);              //PortD wird als Ausgang definiert
    	PORTC |= (1<<PC0);				//Pullup-Wiederstand von PortC Pin1 wird aktiviert
    }
    
    int ReadChannel(int mux)
    {  	
    	ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    	// Frequenzvorteiler 
                                   			// setzen auf 8 (1) und ADC aktivieren (1)
    
    	ADMUX = mux;                      	// Kanal waehlen
      	ADMUX |= (1<<REFS1) | (1<<REFS0); 	// interne Referenzspannung nutzen 
      	  	
      	
        ADCSRA |= (1<<ADSC);            	// eine Wandlung "single conversion"
        while ( ADCSRA & (1<<ADSC) );   	// auf Abschluss der Konvertierung warten
        
      	int wert = ADCL;
    
    	ADCSRA &= ~(1<<ADEN);
    
    	return wert;
    }
     
    void main(void)
    {
        init_io();                      	//Ruft die Funktion init_io() auf
    	//init_adc();							//init des adc
    
        while(1) 
    	{                    
    		 
    		t=0;
    		c = ReadChannel(1)*100;				//lese analogen wert aus channel 1 in c
    		while (t<c) t++;					//zählt... als delay
    		if (PINC & (1<<PINC0)) 				//wenn PINC2 an is 
    			PORTD = PIND ^(1 << PD2);		//wechsle den status von PIND2 (die LED blinkt)				
    		else PORTD &= ~(1<<PD2);			//wenn PINC2 nich an bleibt die LED aus		 		
     	}
    }
    das is der code.

    er blinkt, aber lässt sich nicht regeln

    [-o< Stefan

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    07.01.2006
    Beiträge
    36
    ein paar Sachen, die mir auffallen:

    Also mit Pull-ups bin ich nicht so sicher - bei mir läuft die Messung aber ohne Pull-up am ADC

    mux ist bei Dir int (also größer als ein byte und mit Vorzeichen) - ADMUX sollte aber nur 8 Bit sein, versuche mal unsigned char oder uint8_t (das gleiche mit wert - Du musst noch die zweite Hälfte des Messwertes auslesen, in der Reihenfolge: ADCL, ADCH)

    Und der code blinkt? hätte nicht gedacht, dass das so lange dauert. Das Blinken könnte aber einfach auch die Dauer der Wandlung sein... Versuch doch einfach mal den Messwert auszulesen und dann abhängig von der Größe des Messwertes LED an/aus - also wenn wert kleiner 500, dann aus, sonst an. Dann kannst Du jedenfalls feststellen, ob er beim Drehen unterschiedliche Werte ermittelt

    kanal28

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    30.03.2006
    Ort
    Lübeck
    Alter
    29
    Beiträge
    60
    pullup is am adc deaktiviert, da is der kommentar falsch, das muss heissen: //Pullup-Wiederstand von PortC Pin0 wird aktiviert
    das is die funktion, dass wenn man den pin auf masse legt hört er auf zu blinken.

    das blinken kommt daher, dass er in einer schleife eine variable hochzählt... und den punkt zu dem er zählt wollte ich mit dem poti einstellen

    so mux als uint8_t
    und
    int wert = ADC;

    dann funzts, aber das is ein seeeehr kleiner bereich am poti mit dem ich die geschwindigkeit einstellen kann, es gibt sogar zwei bereiche:

    GND: blinkt ganz schnell (nicht mehr sichtbar als blinken, nur mittelhelles leuchten)
    .
    .
    ....langsamer
    .
    .
    ....blinkt etwas schneller als 1mal pro sekunde
    ....plötzlich wieder wie bei GND ganz schnell
    .
    ....langsamer
    .
    ....wieder etwas schneller als 1mal pro sekunde
    ....plötzlich wieder wie bei GND ganz schnell
    .
    ....bleibt so bis +5V
    .
    ....5V

    warum?

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    30.03.2006
    Ort
    Lübeck
    Alter
    29
    Beiträge
    60
    sop es funzt... da is mir wohl die variable 'c' übergelaufen...
    und wenn ich nen lautsprecher anschliesse mach er musik
    von ganz tief bis 3000Hz leider macht er nach oben hin immer grössere sprünge, aber das is ja klar...

    danke für deine hilfe

Berechtigungen

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