Gast
#962874
Hallo zusammen, bin dabei einen "Temperaturmesser" mit dem AT Mega 32 und dem Pollin Board zu realisieren um einfach mal die Grundfunktionen wie AD-Wandler LCD Display usw. etwas besser kennen zu lernen. Später will ich auch noch ein PWM Signal abhänig von der Temperatur steuern und mir so ne Art lüftersteuerung bauen und somit alle Wichtigen Funktionen des AT Mega 32 mal auszutesten. Da ich selber eher noch wenig erfahrung mit yc habe und mich bislang aus blinkende LED´s und den bau eingener PWM Signale (mit hilfe der delay Funktion) beschränkt habe werde ich bei dem nächsten Schritt wohl etwas Hilfe gebrauchen. Habe den AD Wandler bislang mit Hilfe des gcc Tutorials und der anpassung des Codes auf den AT Mega 32 in gang gebracht. Da ich aber nicht eis ob dieser auch geht, da ich ja nicht sehen kann was der yc in der variablen für die Temperatur ablegt brächte ich mal tipps wie ich am besten weitermachen soll. Hab mir schon überlegt den Wert über die RS 232 Schnittstelle auszugeben aber das wär wieder ne größere Baustelle und hat auch mit dem Tutorial nicht funktioniert.. Wie wird der Wert vom AD Wandler in die Variable gespeichert wenn ich jetzt z.B 1V als ergebnis bekomme? Habe versucht ne LED An oder auszuschalten wenn der Wert der Variablen <1 V ist, also keine Spg anliegt, was aber nicht funzt.. Mein Code: HIER OBEN IST DER CODE DES AD WANDLERS AUS DEM TUTORIAL ANGEPASST AN ATMEGA 32 #include <avr/io.h> #include <stdio.h> #include <stdint.h> #define F_CPU 1000000UL #include <util/delay.h> /* bei alter avr-libc: #include <avr/delay.h> */ int ReadChannel(int mux) { int i; int result; ADMUX = mux; // Kanal waehlen ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler // setzen auf 8 (1) und ADC aktivieren (1) /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */ ADCSRA |= (1<<ADSC); // eine ADC-Wandlung while ( ADCSRA & (1<<ADSC) ) { // auf Abschluss der Konvertierung warten } result = ADCW; // ADCW muss einmal gelesen werden, // sonst wird Ergebnis der nächsten Wandlung // nicht übernommen. /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */ result = 0; for( i=0; i<4; i++ ) { ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while ( ADCSRA & (1<<ADSC) ) { // auf Abschluss der Konvertierung warten } result += ADCW; // Wandlungsergebnisse aufaddieren } ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2) result /= 4; // Summe durch vier teilen = arithm. Mittelwert return result; } int main (void) { int adcval; while(1){ DDRD= (1<<DDD5) | (1<<DDD6)| (1<<DDD7); // Pin D 5 und 6 und 7 nd Ausgänge, rest Eingänge if( PIND & (1<<PIND2)) { adcval = ReadChannel(0); PORTD |= (1<<PD6); //Versuch ne LED an zu bekommen, geht aber net,diese stelle wird irgendwie net erreicht _delay_ms(200);} if(adcval < 1 ) { PORTD |= (1<<PD5); } else{ PORTD =0x00; } return 0; }}