Hoi,
ich hab da nen kleines Problem. Wollte mit meinem Programm den AD-Wndler testen, aber bis jetzt funktioniert nur die Simulation.
Bis jetzt hab ich einiges auf dem Programm herausgenommen, daß ich mir mittlerweile ziemlich sicher bin, daß es an den IF- Anweisungen hängt.
Code:
#include <avr/io.h>
//void adc_init(void);
void init_io(void);
void delay_ms (unsigned int ms);
int main(void)
{
//********************************************************
/* A/D - Wandler Verwenden */
init_io();
//adc_init();
unsigned int buffer = 0x1F4; //initialisieren zu testzwecken mit Wert 500
char i =1;
while (1) // //endlosschleife
{
/* Wandlung starten */
//ADCSRA |= (1<<ADSC);
/* Warten bis die AD-Wandlung abgeschlossen ist */
//while ( !(ADCSRA & (1<<4)) );
PORTC &=~ (1<<7); //LED PORT 7 an
/* AD-Wert auslesen */
//buffer = (ADCH<<8) | ADCL;
if (buffer < 0xCD )
{
PORTC &= ~(1<<0);
PORTC |= (1<<1)|(1<<2)|(1<<3)|(1<<4);
}
if (buffer < 0x19A && buffer > 0xCD)
{
PORTC &= ~(1<<1);
PORTC |= (1<<0)|(1<<2)|(1<<3)|(1<<4);
}
if (buffer < 0x266 && buffer > 0x19A)
{
PORTC &= ~(1<<2);
PORTC |= (1<<0)|(1<<1)|(1<<3)|(1<<4);
}
if (buffer < 0x333 && buffer > 0x266)
{
PORTC &= ~(1<<3);
PORTC |= (1<<0)|(1<<1)|(1<<2)|(1<<4);
}
if (buffer < 0x400 && buffer > 0x333)
{
PORTC &= ~(1<<4);
PORTC |= (1<<0)|(1<<1)|(1<<2)|(1<<3);
}
else
{
PORTC &=~ (1<<5);
}
//ADCSRA |= (1<<4);
if (i%2 == 0) // LED mit jedem Schleifendurchlauf toggeln
{
PORTC |=(1<<6);
}
else
{
PORTC &=~(1<<6);
}
delay_ms(50);
i++;
}
}
//*********************************************************************
/* Analog/Digital Wandler initialisieren */
/*void adc_init(void)
{
// Konfiguration AD-Wandler im ADC-Register
ADMUX &= ~(1<<7); // externe Vref
ADMUX &= ~(1<<6); //""
ADMUX &= ~(1<<5); //gewandelter Wert im Register rechts ausgerichtet
ADMUX &= ~((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)); // Single endet Input ADC0
//Konfiguration AD-Wandler im ADC-Register
ADCSRA |= (1<<7); // Ad-Wandler aktivieren
ADCSRA &= ~(1<<5); // einmalig wandeln
ADCSRA |= (1<<1)|(1<<2); */ // Prescaler auf 64 einstellen
/* Spezialfunktionen ausschalten */
// SFIOR = 0;
//}
//********************************************************************
// Ports initialisieren
void init_io(void)
{
DDRC |=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<6)|(1<<7); // Port C Pin 0-4 als Ausgänge für LED
PORTC |= (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<7);
DDRA &=~ (1<<0);
PORTA |= (1<<0);
}
//*****************************************************************
void delay_ms (unsigned int ms)
{
unsigned int zaehler;
while (ms)
{
zaehler = 7372800/5000;
while (zaehler)
{
asm volatile ("nop");
zaehler--;
}
ms--;
}
}
Das Programm läuft übrigens durch (LED6) blinkt. Und die LED 0 ist komischerweise auch an.
Sieht jemand nen Fehler an dem Programm? Beim simulieren mit AVR Studio läufts wie gewünscht.
Falls es hilt: ich verwende den ATMEGA16 und das STK500.
Jens
Lesezeichen