Superhirn
26.12.2006, 13:06
Hallo,
Mein code funktioniert einfach nicht. er ist aus den avr-gcctutorial von mikrocontroller.net abgewandelt.
Der wert der herauskommt ist vermutlich nicht null, nicht größer null und nicht kleiner null :(
Der Code ist in 3 dateien zerlegt. Programieren tu ich mit Kontrollerlab, hab den aktuellen avr-gcc, mein avr ist ein Mega 16 mit 14,.... mhz. F_CPU wird von Kontrollerlab definiert und muss nomit nicht im programm stehen.
pinbelegung.h:
#include <avr/io.h>
void initavr(void) {
DDRD = 0xF0;
DDRB = 0xE3;
}
adc.c:
#include <avr/io.h>
#include <util/delay.h> // definiert _delay_ms()
void adcstart(void);
void adcstop(void);
void adcstart(void) {
ADCSRA |= ((1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2) | (1<<ADEN));//ADPS0-2(Vorteiler 128), ADEN (Enable)
uint8_t kanal = 0;
ADMUX = kanal;
ADMUX |= (1<<REFS1) | (1<<REFS0);
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung als Dummy zum warmlaufen
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
}
void adcstop(void) {
ADCSRA &= ~(1<<ADEN);
}
uint16_t adcget(uint8_t kanal) {
uint8_t i;
uint16_t ergebnis = 0;
ADMUX = kanal; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
ergebnis=ADC;
return ergebnis;
}
adc_test.c (Mit main schleife):
#include <avr/io.h>
#include <util/delay.h> // definiert _delay_ms()
#include "pinbelegung.h"
uint16_t adcwert = 0;
int main(void)
{
initavr();
adcstart();
PORTB |= (1<<PB7) | (1<<PB5) | (1<<PB6);
for(;;) {
adcwert = adcget(0); // MUX-Bits auf 0b0000 -> Channel 0
//adcwert = adcget(2); // MUX-Bits auf 0b0010 -> Channel 2
if (adcwert==0) {
PORTB |= (1<<PB7);
}
else if (adcwert<0) {
PORTB |= (1<<PB5);
}
else if (adcwert>800) {
PORTB |= (1<<PB6);
}
else {
PORTB &= ~((1<<PB5) | (1<<PB6) | (1<<PB7));
}
_delay_ms(100);
}
return(0);
adcstop();
}
Frohe Weihnachten
Thomas
Mein code funktioniert einfach nicht. er ist aus den avr-gcctutorial von mikrocontroller.net abgewandelt.
Der wert der herauskommt ist vermutlich nicht null, nicht größer null und nicht kleiner null :(
Der Code ist in 3 dateien zerlegt. Programieren tu ich mit Kontrollerlab, hab den aktuellen avr-gcc, mein avr ist ein Mega 16 mit 14,.... mhz. F_CPU wird von Kontrollerlab definiert und muss nomit nicht im programm stehen.
pinbelegung.h:
#include <avr/io.h>
void initavr(void) {
DDRD = 0xF0;
DDRB = 0xE3;
}
adc.c:
#include <avr/io.h>
#include <util/delay.h> // definiert _delay_ms()
void adcstart(void);
void adcstop(void);
void adcstart(void) {
ADCSRA |= ((1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2) | (1<<ADEN));//ADPS0-2(Vorteiler 128), ADEN (Enable)
uint8_t kanal = 0;
ADMUX = kanal;
ADMUX |= (1<<REFS1) | (1<<REFS0);
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung als Dummy zum warmlaufen
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
}
void adcstop(void) {
ADCSRA &= ~(1<<ADEN);
}
uint16_t adcget(uint8_t kanal) {
uint8_t i;
uint16_t ergebnis = 0;
ADMUX = kanal; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
ergebnis=ADC;
return ergebnis;
}
adc_test.c (Mit main schleife):
#include <avr/io.h>
#include <util/delay.h> // definiert _delay_ms()
#include "pinbelegung.h"
uint16_t adcwert = 0;
int main(void)
{
initavr();
adcstart();
PORTB |= (1<<PB7) | (1<<PB5) | (1<<PB6);
for(;;) {
adcwert = adcget(0); // MUX-Bits auf 0b0000 -> Channel 0
//adcwert = adcget(2); // MUX-Bits auf 0b0010 -> Channel 2
if (adcwert==0) {
PORTB |= (1<<PB7);
}
else if (adcwert<0) {
PORTB |= (1<<PB5);
}
else if (adcwert>800) {
PORTB |= (1<<PB6);
}
else {
PORTB &= ~((1<<PB5) | (1<<PB6) | (1<<PB7));
}
_delay_ms(100);
}
return(0);
adcstop();
}
Frohe Weihnachten
Thomas