Nabend,

Ich bin's mal wieder.... Ich bin echt am verzweifeln. Ich versuche nun schon seit Tagen, eine UART Kommunikation zwischen einem ATmega16 und einem ATmega48 zum Laufen zu kriegen....

Zur Hardware:
Ich habe die RxD und TxD der jeweiligen Kontrollern über Kreuz miteinander verbunden. Soweit sollte das stimmen.
Der ATmega16 läuft mit einem externen 16MHz Quarz, der ATmega48 mit einem internen 8MHz Quarz.


Zur Software:
Ich verwende die Peter Fleury Libary. Jedoch funtzt garnix. Ich nutze das AVRStudio 4. Die .c und .h sind im selben ordner der jeweiligen Programme, MCU und Freq. sind richtig eingestellt.

Hier mal die Programme:

ATmega16 (sender)
Code:
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "uart.h"

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#define UART_BAUD_RATE      9600      


uint16_t readADC(uint8_t channel)
{
   uint16_t result;

   ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); // ADC einschalten, prescal /64
   ADMUX = channel; // Kanal wählen
   ADMUX |= (1<<REFS1) | (1<<REFS0); // + interne 2,56V-Referenz
   ADCSRA |= (1<<ADSC); // Konvertierung starten
   while(ADCSRA & (1<<ADSC)); // warten bis Wandlung abgeschlossen

   result= ADC; // Ergebnis zwischspeichern

   ADCSRA &= ~(1<<ADEN); // ADC ausschalten

   return(result); // Ergebnis abliefern
}



int main(void)
{
    unsigned int c;
    char buffer[7];
    int  num=134;

	DDRC = 0x00;
    uint16_t result0 = 0;
   	uint16_t result1 = 0;
    /*
     *  Initialize UART library, pass baudrate and AVR cpu clock
     *  with the macro 
     *  UART_BAUD_SELECT() (normal speed mode )
     *  or 
     *  UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
     */
    uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
    
    /*
     * now enable interrupt, since UART library is interrupt controlled
     */
    sei();
    

    itoa( num, buffer, 10);   // convert interger into string (decimal format)         
    uart_puts(buffer);        // and transmit string to UART

	while(1)
	{

		uart_putc('A');

	}
}

ATmega48(empfänger)
Code:
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>
#include <util/delay.h>

#include "uart.h"


/* define CPU frequency in Mhz here if not defined in Makefile */
#ifndef F_CPU
#define F_CPU 8000000UL
#endif

/* 9600 baud */
#define UART_BAUD_RATE      9600      


int main(void)
{
    unsigned int c;
    char buffer[7];
    int  num=134;

    
    /*
     *  Initialize UART library, pass baudrate and AVR cpu clock
     *  with the macro 
     *  UART_BAUD_SELECT() (normal speed mode )
     *  or 
     *  UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
     */
    uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
    
    /*
     * now enable interrupt, since UART library is interrupt controlled
     */
    sei();

    

	while(1)
    {

        c = uart_getc();
        if (c =='A')
        {
           PORTB |= (1<<PB4);
        }
        else
        {
           PORTB &=~ (1<<PB4);   
        }
    }
}

Die ADC Initialisierung könnte man auch weglassen, ich habe sie einfach mal da gelassen, weil ich später mit Sharp Sensoren arbeiten möchte.... sollte ja soweit nicht stören.


Danke im Voraus!

Mfg JeyBee