JeyBee
09.04.2009, 21:33
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)
#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)
#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
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)
#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)
#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