Gast
#2488224
Hallo Leute!
Ich versuche gerade mit einem Atmega16 mit dem ADC einen Wert auszulesen
und diesen einfach so wie er ist als 16bit Variable an den Rechner zu
schicken.
Leider beißt sich irgendwie mein UART Code mit dem ADC Code.
Einzeln funktionieren sie wunderprächtig, aber sobald ich im angehängten
Code in der "main" Funktion das "ADC_Enable();" wieder hinnehme (ist
auskommentiert) Funktioniert gar nichts mehr (heißt ich kann am terminal
nichts mehr empfangen - da kommt nix mehr an).
Was ist da los? beißt sich da irgenwas und ich sehs nicht?
ist ein Atmega16 mit externem Chrystal 10.000 MHz also liegts nicht am
internen RC-Oszillator - wie gesagt, sobald ich mit dem ADC_Enable();
den ADC in den Free Running Mode versetze gehts nichtmehr. Darf ich das
nicht!?
CODE:
#include <avr/io.h>
#ifndef USART_H
#define USART_H
#define BAUD 9600UL //Hier Baudrate angeben: 57600UL
#define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)
#endif
// USART initialisieren
void uart_init(void)
{
// Baudrate einstellen (Normaler Modus)
UBRRH = (uint8_t) (UBRR_BAUD>>8);
UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);
// Aktivieren von transmitter //(1<<RXEN)
UCSRB = (1<<TXEN) | (1<<RXEN);
// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit, Even Parity
UCSRC = (1<<URSEL) | (1<<UPM1)|(1<<UCSZ1)|(1<<UCSZ0);
// Einstellen des Datenformats: 8 Datenbits, 2 Stoppbit
//UCSRC = (1<<USBS)|(1<<USBS)|(3<<UCSZ0);
// Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger
Werte)
do
{
UDR;
}
while (UCSRA & (1 << RXC));
}
char uart_getc(void)
{
while (!(UCSRA & (1<<RXC))); // warten bis Zeichen verfuegbar
return UDR; // Zeichen aus UDR an Aufrufer
zurueckgeben
}
void uart_putc(const char c)
{
while (!(UCSRA & (1<<UDRE))) //auf Sendebereitschaft warten
{
}
UDR = c; //Zeichen Senden
}
void uart_puts (const char *s)
{
do
{
uart_putc (*s); //Ein Zeichen des strings senden
}
while (*s++); //So lange bis der String zu ende ist und gleich
ein Zeichen weiterspringen
}
void uart_puti(const int16_t var) {
char cache[7];
uart_puts (itoa(var, cache, 10));
}
void ADC_Enable() {
// Set ADC
ADCSRA |= (1 << ADPS1) | (1<< ADPS2); // Prescaler
// Set reference Voltage
ADMUX |= (1 << REFS1) | (1 << REFS0) ;
// Internal 2,56 V reference chosen
// Set ADLAR = 1 to left adjust results
ADMUX |= (1<< ADLAR);
// Input Channel is ADC0 - so no changes in MUX!
// Adjust Conversion mode
ADCSRA |= (1 << ADATE); // Set ADC to Free-Running Mode
// Datasheet p 221
//SFIOR = 0x00; // For Free Running Mode
ADCSRA |= (1 << ADEN); // Enable ADC
ADCSRA |= (1 << ADSC); // Start A2D Conversions
}
int main (void) {
//ADC_Enable();
uart_init();
while (1) {
uart_puts("TEST");
}
}
Ach hier kommt dann natürlich statt dem "TEST" das ADC register mit der
entsprechenden uart_puti(ADCW); funktion rein.
Hoffe mir kann jemand helfen !?
Danke :)