OML221
23.05.2009, 01:58
Hallo zusammen,
wir haben gerade im Studium den ATMega88
Für diesen Controller wollte ich nun ein ganz einfaches Programm schreiben nur leider hab ich nen kleinen Fehler drin und ich finde ihn nicht.
Bestimmt kennt sich der eine oder andere gut aus und kann mir nen Tipp geben.
Also das Ziel ist das die LED leuchtet sobald ein Spannungswert unterschritten wird. (Interne Spannung als Referenz) Das Funktioniert auch, allerdings nur ein einziges mal.
Danach muss ich RESET drücken damit der Controller den neuen Wert auslesen kann und entsprechend reagiert.
Das soll natürlich nicht so sein, es soll ständig überprüft werden und wärend das Programm läuft auf Änderungen reagieren.
Hier mal das kurze Programm:
//----------------------------------------------------------------------
// Titel : Spannungstest mit LED
//----------------------------------------------------------------------
// Funktion : Schaltet Bit 2 an Port B (LED) an wenn Spannung
an ADC 0 einen Wert unterschreitet
// Schaltung : ...
//----------------------------------------------------------------------
// Prozessor : ...
// Takt : 3.6864 MHz
// Sprache : C
// Datum : ...
// Version : ...
// Autor : ...
//----------------------------------------------------------------------
#define F_CPU 3686400 // Taktferquenz des myAVR-Boards
#include <avr\io.h> // AVR Register und Konstantendefinitionen
#include <avr\interrupt.h>
#include <inttypes.h>
void Init_Ports(void);
uint16_t readADC(uint8_t channel);
int main(void)
{
Init_Ports();
uint16_t result = readADC(0);
while(1) // Hauptschleife der main-Funktion
{
//Auslesen der analogen Spannungen an Pin 0,
// also ADC0. In result steht das Ergebnis.
if (result < 53)
{
PORTB = 0x04; // LED toggeln
}
else
PORTB = 0x00;
}
return(1);
}
void Init_Ports(void)
{
DDRB |= (1 << DDB2); // PORTB PB2 als Ausgabe (LED)
PORTB |= (1 << PB2);
}
uint16_t readADC(uint8_t channel)
{
uint8_t i;
uint16_t result = 0;
// Den ADC aktivieren und Teilungsfaktor auf 64 stellen
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
// Kanal des Multiplexers waehlen
ADMUX = channel;
// Interne Referenzspannung verwenden (also 2,56 V)
ADMUX |= (1<<REFS1) | (1<<REFS0);
// Den ADC initialisieren und einen sog. Dummyreadout machen
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
// 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;
}
// ADC wieder deaktivieren
// ADCSRA &= ~(1<<ADEN);
result /= 3;
return result;
}
Vielen Dank
Gruß
Oli
wir haben gerade im Studium den ATMega88
Für diesen Controller wollte ich nun ein ganz einfaches Programm schreiben nur leider hab ich nen kleinen Fehler drin und ich finde ihn nicht.
Bestimmt kennt sich der eine oder andere gut aus und kann mir nen Tipp geben.
Also das Ziel ist das die LED leuchtet sobald ein Spannungswert unterschritten wird. (Interne Spannung als Referenz) Das Funktioniert auch, allerdings nur ein einziges mal.
Danach muss ich RESET drücken damit der Controller den neuen Wert auslesen kann und entsprechend reagiert.
Das soll natürlich nicht so sein, es soll ständig überprüft werden und wärend das Programm läuft auf Änderungen reagieren.
Hier mal das kurze Programm:
//----------------------------------------------------------------------
// Titel : Spannungstest mit LED
//----------------------------------------------------------------------
// Funktion : Schaltet Bit 2 an Port B (LED) an wenn Spannung
an ADC 0 einen Wert unterschreitet
// Schaltung : ...
//----------------------------------------------------------------------
// Prozessor : ...
// Takt : 3.6864 MHz
// Sprache : C
// Datum : ...
// Version : ...
// Autor : ...
//----------------------------------------------------------------------
#define F_CPU 3686400 // Taktferquenz des myAVR-Boards
#include <avr\io.h> // AVR Register und Konstantendefinitionen
#include <avr\interrupt.h>
#include <inttypes.h>
void Init_Ports(void);
uint16_t readADC(uint8_t channel);
int main(void)
{
Init_Ports();
uint16_t result = readADC(0);
while(1) // Hauptschleife der main-Funktion
{
//Auslesen der analogen Spannungen an Pin 0,
// also ADC0. In result steht das Ergebnis.
if (result < 53)
{
PORTB = 0x04; // LED toggeln
}
else
PORTB = 0x00;
}
return(1);
}
void Init_Ports(void)
{
DDRB |= (1 << DDB2); // PORTB PB2 als Ausgabe (LED)
PORTB |= (1 << PB2);
}
uint16_t readADC(uint8_t channel)
{
uint8_t i;
uint16_t result = 0;
// Den ADC aktivieren und Teilungsfaktor auf 64 stellen
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
// Kanal des Multiplexers waehlen
ADMUX = channel;
// Interne Referenzspannung verwenden (also 2,56 V)
ADMUX |= (1<<REFS1) | (1<<REFS0);
// Den ADC initialisieren und einen sog. Dummyreadout machen
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
// 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;
}
// ADC wieder deaktivieren
// ADCSRA &= ~(1<<ADEN);
result /= 3;
return result;
}
Vielen Dank
Gruß
Oli