Hallo Leute,

ich hab ein riesen Problem. Ich hock schon seit Tagen vor meinem Rechner und versuch die A/D Werte die mein Atmega32 ins ADC Register schreibt über UART auf meinem PC auszugeben, aber leider vergeblich. Das einzige was auf meinem Bildschirm erscheint sind Unmengen an Buchstaben und Ziffern, also muss doch irgendwas mit itoa oder der UART-Übertragung nicht stimmen. In meinem Programm versuch ich durch drücken einer Taste ein bestimmtes LED zum leuchten zu bringen und zugleich die A/D Werte auszuspucken, die Funktion um die LEDs zum leuchten zu bringen funzt einwandfrei aber bei der UART-Übertragung ist der Wurm drin. Also ich wäre über jede Hilfe dankbar, ist bestimmt ein Witz für euch.

Hier ist mein Code
Code:
#include <avr/io.h> 
#include "wchar.h"
#include <stdlib.h>

#define SYSCLK   14756000 

void init(void); 
unsigned int get_key(void); 

/* 
 * Hauptprogramm 
 */ 
int main(void) 
{ 
   unsigned int i=0; 
   char buffer[100];
   
   init(); 
    
   while(1) 
   { 
      /* Ergebnis auslesen und anzeigen */ 
	  
	  if(i != 0xff)
	  {
	  itoa(i,buffer,2);
	  write(buffer);
      }
	  
	  i = get_key(); 

       
      if (i != 0xff) 
		 PORTC = ~(1<<i) & 0x7f; 
      else 
         PORTC = 0x7f; 
   } 
    
   return 0;    
} 

/* 
 * Initialisierung des µC 
 */ 
void init(void) 
{ 
   DDRA = 0x00;      /* Port als Eingang deklarieren ( A/D-Wandler Eingänge ) */ 
   PORTA = 0x80; 
    
   DDRB = 0xff;      /* Port als Ausgang deklarieren */ 
   PORTB = 0x00; 
    
   DDRC = 0xff;      /* Port als Ausgang deklarieren */ 
   PORTC = 0x00; 
    
   DDRD = 0xff;      /* Port als Ausgang deklarieren */ 
   PORTD = 0x00; 
    
   /* Analog zu Digital Wandler aktivieren ( Prescaler = 128, interne +5V Referenz, "8-Bit" Ergebnis ) */ 
   ADMUX = (1<<REFS0)|(1<<ADLAR);  
   ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); 
} 

/** 
 * Fragt die Tasten an AD-Port 7 ab, kann nicht erkennen ob zwei Tasten gleichzeitig gedrückt werden 
 * 
 *   255  keine Taste gedrückt 
   0    Taste 1 gedrückt 
   1    Taste 2 gedrückt 
   2    Taste 3 gedrückt 
   3    Taste 4 gedrückt 
   4    Taste 5 gedrückt 
 */ 
unsigned int get_key(void) 
{ 
   unsigned int i, taste = 0xff; 
    
   /* ADC7 mit Vcc als Referenzspannung */ 
   ADMUX = (1<<REFS0)|(1<<ADLAR)|0x07; 
    
   /* AD Wandler starten */ 
   ADCSRA |= (1<<ADSC); 
    
   /* Warten bis das Ergebniss zur Verfügung steht */ 
   while(!(ADCSRA & (1<<ADIF))); 
    
   /* Ergebnis auslesen und anzeigen */ 
   
   i = ADCH; 

   
   if (i < 36) 
      taste = 4; 
   else if (i < 57) 
      taste = 3; 
   else if (i < 76) 
      taste = 2; 
   else if (i < 94) 
      taste = 1; 
   else if (i < 150) 
      taste = 0; 
    
   return taste; 
}
und noch der Code der Verantwortlich ist für die Ausgabe

Code:
#include <avr/io.h>
#include <string.h>
#include <inttypes.h>

void uart_init(void);

int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich */
    UDR = c;                      	/* sende Zeichen */
    return 0;
}


/* puts ist unabhaengig vom Controllertyp */

void uart_puts (char text[])
{
	char *s;
	s=&(text[0]);
	while (*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        uart_putc(*s);
        s++;
    }
}

void write(char text[])
{
	/*Den UART initialisieren*/
	uart_init();
	uart_puts(text);

}

void uart_init(void)
{
  /* USART-Init 19200 Baud bei 16MHz für Mega32 */
  UCSRB |= ( 1 << TXEN );			// UART TX einschalten
  UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 );	        // Asynchron 8N1
  UBRRH  = 0;                                   // Highbyte ist 0
  UBRRL  = 51;                                  // Lowbyte ist 51 ( dezimal )
}
Vielen Dank schon mal im voraus für eure Bemühungen
Gruss
Torsten