Spessi
12.11.2008, 22:21
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.
#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
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.
#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