rocketman123
22.02.2008, 19:13
Hallo,
hab gerade lauflichter programmiert. jetzt möcht ich die Geschwindigkeit meines lauflichts über ein Poti (ADC-Eingang) steuern.
kann mir jemand bei meinem code weiterhelfen
#include <avr/io.h>
#include <delay.h>
uint16_t auswertung (void);
volatile uint16_t wert=0;
zeit (void)
int n;
int main (void)
{
uint16_t =0,ergebnis=0;
n = 0;
//Ports initialisieren
DDRD = 0xFF; //Port C als Ausgang für die LED's
PORTD = 0XFF; //Pull Up's aktiviert
while(1)
{
zeit = n;
ergebnis = auswertung();
PORTD = (0b00000001);
_delay_ms(n);
PORTD = (0b00000010);
_delay_ms(n);
PORTD = (0b00000100);
_delay_ms(n);
PORTD = (0b00001000);
_delay_ms(n);
PORTD = (0b00010000);
_delay_ms(n);
PORTD = (0b00100000);
_delay_ms(n);
PORTD = (0b01000000);
_delay_ms(n);
PORTD = (0b10000000);
_delay_ms(n);
PORTD = (0b01000000);
_delay_ms(n);
PORTD = (0b00100000);
_delay_ms(n);
PORTD = (0b00010000);
_delay_ms(n);
PORTD = (0b00001000);
_delay_ms(n);
PORTD = (0b00000100);
_delay_ms(n);
PORTD = (0b00000010);
_delay_ms(n);
}
uint16_t auswertung (void)
{
//Initialisieren
ADCSRA = ((1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0));
ADMUX = ((1<<MUX3));//interner Vref wird benutzt 2,5V; ohne REFS1 und REFS2 wird angelegter Vref bentzt max 5V; MUX3 ist ADC0
//Dummy Auslesung als Warm-Up wie im Tutorial
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));
//Messung
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));
wert = ADCL; //ERR
wert += (ADCH<<8); //Alternativ 'wert = ADCW;'
ADCSRA &= ~(1<<ADEN); //ADC Disable
return wert;
}
zeit (void)//auslesen von adc und damit geschwindigkeit der leds festlegen
{
{if ( (ergebnis <= 256) & (ergebnis > 0) )
{n=10;}
if ( (ergebnis <= 512) & (ergebnis > 256) )
{n=100;}
if ( (ergebnis <= 768) & (ergebnis > 512) )
{n=500;}
if ( (ergebnis <= 1024) & (ergebnis > 768) )
{n=1000;}
else {n=0;}}
return n;
}
hab gerade lauflichter programmiert. jetzt möcht ich die Geschwindigkeit meines lauflichts über ein Poti (ADC-Eingang) steuern.
kann mir jemand bei meinem code weiterhelfen
#include <avr/io.h>
#include <delay.h>
uint16_t auswertung (void);
volatile uint16_t wert=0;
zeit (void)
int n;
int main (void)
{
uint16_t =0,ergebnis=0;
n = 0;
//Ports initialisieren
DDRD = 0xFF; //Port C als Ausgang für die LED's
PORTD = 0XFF; //Pull Up's aktiviert
while(1)
{
zeit = n;
ergebnis = auswertung();
PORTD = (0b00000001);
_delay_ms(n);
PORTD = (0b00000010);
_delay_ms(n);
PORTD = (0b00000100);
_delay_ms(n);
PORTD = (0b00001000);
_delay_ms(n);
PORTD = (0b00010000);
_delay_ms(n);
PORTD = (0b00100000);
_delay_ms(n);
PORTD = (0b01000000);
_delay_ms(n);
PORTD = (0b10000000);
_delay_ms(n);
PORTD = (0b01000000);
_delay_ms(n);
PORTD = (0b00100000);
_delay_ms(n);
PORTD = (0b00010000);
_delay_ms(n);
PORTD = (0b00001000);
_delay_ms(n);
PORTD = (0b00000100);
_delay_ms(n);
PORTD = (0b00000010);
_delay_ms(n);
}
uint16_t auswertung (void)
{
//Initialisieren
ADCSRA = ((1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0));
ADMUX = ((1<<MUX3));//interner Vref wird benutzt 2,5V; ohne REFS1 und REFS2 wird angelegter Vref bentzt max 5V; MUX3 ist ADC0
//Dummy Auslesung als Warm-Up wie im Tutorial
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));
//Messung
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));
wert = ADCL; //ERR
wert += (ADCH<<8); //Alternativ 'wert = ADCW;'
ADCSRA &= ~(1<<ADEN); //ADC Disable
return wert;
}
zeit (void)//auslesen von adc und damit geschwindigkeit der leds festlegen
{
{if ( (ergebnis <= 256) & (ergebnis > 0) )
{n=10;}
if ( (ergebnis <= 512) & (ergebnis > 256) )
{n=100;}
if ( (ergebnis <= 768) & (ergebnis > 512) )
{n=500;}
if ( (ergebnis <= 1024) & (ergebnis > 768) )
{n=1000;}
else {n=0;}}
return n;
}