- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 5 von 5

Thema: ... und nochmal eine Frage zum ATmega 8 ADC !

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    15.03.2004
    Beiträge
    94

    ... und nochmal eine Frage zum ATmega 8 ADC !

    Anzeige

    Praxistest und DIY Projekte
    Hi, ich bräuchte nochmal hilfe. Das Problem ist, dass mein ADC-Wert, der links ausgerichtet ist (ADLAR-bit gesetzt), nur 3 Werte ausgibt. Ich lass die mir per itoa() als binärmuster am LCD anzeigen. Dabei kommen z.B.
    folgende Werte an: 00100110, 10001000, 01000010. Den Code kann ich leider im moment nicht posten, aber vielleicht kennt jemand den effekt und weiß eine Lösung.

    mfg,

    LC

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    15.03.2004
    Beiträge
    94
    So, jetzt kann ich mal den code posten:

    Code:
    
    int main(void)
    {
    
    	int adc_prim = 0;	// ADC Wert aus Kanal 1 
    	int adc_sek = 0;		// ADC Wert aus Kanal 2 
    	char pPrim[8];		// Primärwert als char für LCD
    	char pSek[8]; 		// Sekundärwert  - " -
    	
    	
    	
    	io_init();			// I/O init
    	adc_init();			// ADC init
    	lcd_init();			// LCD init
    	
    	
    	
    		for(;;)
    		{
    			adc_prim = adc_data(1);		// holen des Primäwertes
    			itoa(adc_prim, pPrim, 2);	// Umrechnung des "rohen" Primärwertes in darsetllbare Zahl.
    			lcd_home();						// Schreibposition 1. Zeile, 1. Spalte
    			lcd_text("km/h   ", pPrim); 			// und Wert (bisher noch Text zum testen) auf Display ausgeben !
    			
    			adc_sek = adc_data(2);		// holen des Sekundärwertes
    			itoa(adc_sek, pSek, 2);
    			lcd_goto(2,1);					//	Schreibposition 2.Zeile, 1.Spalte
    			lcd_text("OEL    ", pSek);	// Anzeige des sekundärwertes 
    		
    		}	
    	
    	
    	
    	return 0;
    }
    Hier noch die adc_init:
    Code:
    void adc_init(void)
    {
    	// init im SC Modus
    	ADCSRA = (1<<ADEN) | (1<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS0);
    	ADMUX |= (1<<ADLAR);
    }
    und das ist die ADC Funktion:
    Code:
    int adc_data(int channel)   
    {
       int i;
       int result = 0;
       
       switch(channel)
       {
          case 1:         // Messwert 1
       
             ADMUX = 0x0;	// ADMUX auf KANAL 1 setzen
                   
                   
             // Dummy readout:
             ADCSRA |= (1<<ADSC);
                   while( ADCSRA & (1<<ADSC) );
             // Dummy readout ende
             
             
             for( i = 0; i < 4; i++)/* eigentliche Messung ( arithmet. Mittelwert aus i Messungen ) */   
             {
                ADCSRA |= (1<<ADSC);// ADC starten:
                   while( ADCSRA & (1<<ADSC) )
                result += ADCH;
             }
             result /= 4;
    			
             break;
    			
          case 2:         // Messwert 2
          
             ADMUX |= (1<<MUX0); //ADMUX auf KANAL 2 setzen !
             
             // Dummy readout:
             ADCSRA |= (1<<ADSC);
                   while( ADCSRA & (1<<ADSC) );
             // Dummy readout ende
             
             
             for( i = 0; i < 4; i++)/* eigentliche Messung ( arithmet. Mittelwert aus i Messungen ) */   
             {
                ADCSRA |= (1<<ADSC);// ADC starten:
                   while( ADCSRA & (1<<ADSC) )
                result += ADCH;
             }
             result /= 4;
             
             ADMUX = 0x0;   // ADMUX zurücksetzen
    			break;
          
          default:
             break;
          }
             
       return result;
    }

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.12.2005
    Ort
    Tann / ZH
    Alter
    67
    Beiträge
    264
    Und wo ist Dein Problem ?
    MfG
    Ruedi

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    In Deiner Read Routine fehlt das Semikolon hinter der while Schleife! Du liest vier mal einen ungültigen Wert ein.

    Kleiner Tip: Bei if's und Schleifenkonstrukten verwende ich immer einen Block dahinter, das spart die Fehlersuche und Kollegen die mit Deinem Code arbeiten müssen werden es Dir danken.
    Code:
    while( ADCSRA & (1<<ADSC) )
    {
         ; // wait until conversion complete
    }
    result += ADCH;

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    15.03.2004
    Beiträge
    94
    Ja klar, des semikolon hinter der schleife hab ich dann auch noch gefunden.
    Trotzdem Danke.

Berechtigungen

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

Solar Speicher und Akkus Tests