- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 10

Thema: ATMega32, Werte vom ADC ins EEPROM

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.01.2005
    Beiträge
    130

    ATMega32, Werte vom ADC ins EEPROM

    Hallo,
    ich versuche gerade verzweifelt die Werte, die mir mein ADC zurückliefert, ins EEPROM zu schreiben, damit ich sie am PC auswerten kann (Platine ist schon fertig geätzt, aber kein UART dran, da ich da wohl nich dran gedacht hatte, dass ich die 1N4148 (genutzt als Temperatursensor) vielleicht auch erstmal auswerten sollte).

    Im Anhang ist der Schaltplan, habe die Diode genauso an den ADC gehängt, wie es auch bei Thomas Pfeifer im Schaltplan von seinem Laminiergerät zu sehen ist. Bei 22°C messe ich 0,66V.

    Hier ist der Code, der mir Probleme bereitet. Im EEPROM landet immer 00FF00FF00FF (usw.). Kann mir nicht vorstellen, woran es liegen könnte. Der ATMega läuft bei 1MHz und der ADC hat den Prescaler 4.

    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/eeprom.h>
    
    void waitms(int ms);
    
    int* offset=0;
    
    void initADC() {
    	// Den ADC aktivieren und Teilungsfaktor auf 4 stellen
    	ADCSRA = (1<<ADEN) | (1<<ADPS1);
    
    	// AREF als Referenzspannung nutzen [ist das Richtig?!]
    	
    	// Den ADC initialisieren und einen sog. Dummyreadout machen [auch unnötig, oder? Wartezeit von wenigen µS sollte auch reichen... Aber ich hab's nicht eilig ;)]
    	ADCSRA |= (1<<ADSC);
    	while(ADCSRA & (1<<ADSC));
    }
    
    uint16_t readADC(uint8_t channel) {
    	uint8_t i;
    	uint16_t result = 0;
    
    	// Kanal des Multiplexers waehlen
    	ADMUX = channel;
    
    	// Jetzt 3x die analoge Spannung and Kanal channel auslesen
    	// und dann Durchschnittswert ausrechnen.
    	for(i=0; i<3; i++) {
    		// Eine Wandlung
    		ADCSRA |= (1<<ADSC);
    		// Auf Ergebnis warten...
    		while(ADCSRA & (1<<ADSC));
    		
    		result += ADCW;
    	}
    	
    	result /= 3;
    	return result;
    }
    
    
    int main() {
    	unsigned char val;
    
    	DDRA &= ~(1<<PA0);		/* Temperatursensor		-	Eingang	*/
    	DDRB |= (1<<PB0);		/* Fixierwalze u. LED	-	Ausgang */
    	DDRC |= (1<<PC0);		/* Power LED 			-	Ausgang */
    	DDRD |= (1<<PD5);		/* PWM f. Motor ON/OFF 	-	Ausgang */
    	
    	PORTB &= ~(1<<PB0);
    	PORTC |= (1<<PC0);
    	PORTD |= (1<<PD5);
    	initADC();
    	
    	while(1==1) { 
    		waitms(500);
    		val=readADC(0);
    		eeprom_write_byte ((void*)offset, &val);
    		offset=offset+0x01;
    	}
    
    	// ADC wieder deaktivieren
    	ADCSRA &= ~(1<<ADEN);
    	return 0;
    }
    
    void waitms(int ms) {
      int i;
      for (i=0;i<ms;i++) _delay_ms(1);
    }
    Die Diode hängt am PA0.

    Ich hoffe ihr könnt mir helfen, die richtigen Werte ins EEPROM zu bekommen, wird mit Sicherheit nur 'ne Kleinigkeit sein, die ich übersehen habe..
    Danke schonmal im Voraus
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken schaltplan_120.png  

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress