- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 11

Thema: Problem der ADC Wandlung bei AtMega16

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    ich erwarte eine Spannung zwischen 200 und 250mV (dieselbe mess ich zwischen Vin und Vout des LM35).

    Schreibfehler ?!

    Denn sonst wären das ja 4.8V am PA0 und das wäre ein wenig über der Referenz ^^ ... bisher ergibt sich mir der Fehler nicht, vll. bin ich auch gerade etwas zu blind dafür -.- die Kaffee-Maschine ist Kaputt

    Poste den code einfach nochmal fix (PS versuchs mit den[ C O D E] dein code [ / C O D E] -Tags, macht es einfacher als Dateien hochzuladen, lass nur die Leerzeichen zwischen den Buchstaben weg)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    26.09.2011
    Beiträge
    23
    Ja, ich meinte sicherlich zwischen Vout des Sensors und der Ground.
    Zwischen Vout des Sensors und Vin des Sensors kommen auch die richtigen 4.8V

    hier nochmal der code in "sauber":

    Code:
    #include <avr/io.h>
    #include <stdlib.h> 
    #include <string.h> 
    #include <avr/interrupt.h>
    #include "uart_komplett.h"                        //meine UART
    #include "timer1.h"                                 //meine timer funktion, sorgt dafür dass die UART ausgabe nur alle 2 sekunden erfolgt (overflows halt)
    
    //Dinge definieren
    #define LED_DDR	DDRC               //definieren der LED DDR
    #define LED_PORT	PORTC             //defintion des genauen ports für die DDR
    #define LED_PORTPIN1   PC1                 //definition der roten LED
    #define LED_PORTPIN0   PC0                 //definition des gruenen LED
    
    //Variablen definieren
     
     uint16_t adc_wert = 0;              //Wert des ADC
     volatile uint8_t overflowzahl = 0; //zaehlt die overflows, wichtig für den timer und die UART ausgabe (zwei sekunden takt halt)
      
    //Funktionen definieren
     void adc_init()
     {
     	uint16_t result;                                                       //ergebnis variable festlegen, uint16 wegen 10 bit ergebnis
     	
     	ADMUX = (1<<REFS1)|(1<<REFS0);                            //die interne Referenzspannung nehmen
     	ADCSRA = (1<<ADPS1)|(1<<ADPS0);                          // Frequenzvorteiler bei 8
     	ADCSRA |= (1<<ADEN);                                            //ADEN "enabled" ADC     
     	ADCSRA |=(1<<ADSC);                                            //analog zu digital wandlung aktivieren      
     	                                                  
     													                  
     	while (ADCSRA & (1<<ADSC))                                  // eine "sinnlos" Wandlung durchfuehren um den eventuellen Mist
     	{                                                                       // aus dem Wandler rauszuschmeissen 
     		                                           
     	}
        result = ADCW;                                                         // das ergebnis der wandlung steht in ADCL und ADCH (sind die Result Register)
                                                                                     //dabei wird immer von ADCL nach ADCH gelesen/                                                                    
                                                                                     //muss einmal gelesen werden, sonst wird das ergebnis der naechsten wandlung nicht gelesen 
     }
    
    //Einzelne ADC Messung und "Lesung" des Wertes
    
     uint16_t adc_read (uint8_t channel)
     {
     	ADMUX = (ADMUX & 0b11000000) | (channel & 0b00111111);    //kanal waehlen
     	 												  
     	ADCSRA |= (1<<ADSC);                                                     // eine Wandlung "single conversion"
         while (ADCSRA & (1<<ADSC) ) 
     	{
     	}                                                                                   // s.o.
         return ADCW;
     }	                                   //geb mir das ergebnis, ADCW is das selbe wie result = ADCL, zusaetzlich zu result += (ADCH<<8)
    
     int main(void)
     {
       
     	 LED_DDR  |= (1<<LED_PORTPIN1)|(1<<LED_PORTPIN0);               //PC1 und PC0 Pins als ausgang festlegen und einschalten  
    
         
    	   
                  LED_PORT = 0x01;                                                     //rote LED an
               
                  DDRA = 0x00;                                                            //explizit den PortA als Eingang deklarieren
       	  uint16_t adc_wert;
    	  char buffer[20];	 
    	     
    	    
                               usart_init();  
                              timer1_init(); 
                              adc_init(0);	
             
                               sei();                                                          //interrupts aktivieren
    		 
                              adc_wert = adc_read(0);                                //zuweisung der Wert - Variable der "Auslese-Funktion"
      
         while(1)
         {        
    		  	    
                              adc_wert = adc_read(0);                                //zuweisung der Wert - Variable der "Auslese-Funktion"
      
    			   if (overflowzahl==1)	                              //UART Uasgabe nur wenn ein Overflow stattfinden
    			   {
    				 
    			   sprintf  ( buffer, "ADC: %d\r\n", (int)adc_wert );                     //string rausgeben, hier leider nur "ADC: 0 "endzeichen""
                   
                                        uart_puts( buffer );			                                //puts fuer den string  
    				
                                        overflowzahl=0;		                    //die zählung der overflows wieder auf 0 setzen, in der ISR fuer den Timer steht drin: "overflowzahl++;", damit die
                                                                                                      // if-Bedienung dieser main-loop erfuellt wird
                                                   
      			 
     		            
        		   } 
    					    
         }
     }
    Geändert von bmtil (26.09.2011 um 10:54 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    okay, das sieht aufegräumter aus, aber ich finde dein besagtes

    adc_wert = adc_read(0);

    nicht innerhalb der while(1)-schleife wieder, was allerdings wichtiger ist, du hast wahrescheinlich ebenfalls einen tippfehler begangen udn das erste adc_read(0) VOR dem sei sollte richtig ein adc_init() sein ?
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    26.09.2011
    Beiträge
    23
    Ja genau, hab jetzt nochmal oben (und sicherlich in meinem AVR Studio) die adc_wert=adc_read(0); auch in die while(1) gepackt. Und das adc_read(0) vor dem seio ist sicherlich ein adc_init.
    nun kommt kontinuirlich eine 767, diese verändert sich immer noch nicht und hat auch nichts mit dem Ergebniss zu tun. Nach der Rechnung ADWert= Vout*1024/Vref sollten naemlich ca. 90 rauskommen.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    26.09.2011
    Beiträge
    23
    So, Problem geloest.
    hab den AtMega getauscht, und es ging mit einem neuen AtMega16. Hab tatsaechlich einen defekten erwischt.
    PS, sorry fuer den Doppelpost, dachte nur das waer interresant.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    sorry deine Antwort war mir entgangen, für das "erledigt" gibts irgendwo nen button wenn du im topic bist, und ich denke ein doppelpost so von wegen "problem gelöst" wird dir niemand übel nehmen ... geht eher um solche doppelpostst wie "keiner da der ahnung hat" ^^
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Ähnliche Themen

  1. AD-Wandlung Freilaufend mit ATMega16 - seltsame ergebnisse
    Von DuRo im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 02.06.2007, 21:58
  2. ADC Wandlung mit Atmega16
    Von C1122345 im Forum Assembler-Programmierung
    Antworten: 1
    Letzter Beitrag: 18.04.2007, 18:52
  3. Problem bei RGB zu HSV-Wandlung
    Von troede im Forum Software, Algorithmen und KI
    Antworten: 12
    Letzter Beitrag: 24.09.2006, 10:47
  4. ADC-Wandlung mit ATMEGA16. Weiterarbeiten mit 10Bit und ASM
    Von moonwalker99 im Forum AVR Hardwarethemen
    Antworten: 10
    Letzter Beitrag: 23.03.2006, 11:03
  5. Problem D/A Wandlung mit MEGA16
    Von farmerjo im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 18.12.2005, 22:16

Berechtigungen

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

Solar Speicher und Akkus Tests