- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 11

Thema: Problem der ADC Wandlung bei AtMega16

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #7
    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)

Ä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