beginner1101
10.07.2008, 11:06
Hallo,
nachdem ich jetzt erfolgreich Daten per RS232 vom uC zum PC schicken kann (danke an Jens =D> ) will ich nun Daten vom Pc zum uC schicken. Und zwar will ich einfach eine LED über eine Buchstabeneingabe machen. Ich hab mir schon verschiedene Threads im Forum angeschaut und auch viele verschiedene Code ausprobiert, kam aber auch kein positives Ergebnis. Kann mir jemand helfen? Ich benutze einen AT90CAN128 und das AVR-Studio.
Ich poste meinen Code.
Meine Header -datei: usart.h
#include <avr/io.h>
#include <util/delay.h>
/*### Senden per USART - RS232-Kommunikation ###*/
/*======================= Initialisierung ================================================== =========0=========*/
void USART1_Init (void)
{
uint16_t ubrr; /* Set baud rate */
ubrr = ((F_CPU/(9600*16L))-1);
UBRR1H = (unsigned char)(ubrr>>8);
UBRR1L = UBRR1L = (unsigned char) ubrr;
UCSR1C = (1<<UCSZ11) | (1<<UCSZ10) ; /* Set frame format: 8data, no parity & 1 stop bits */
UCSR1B = (1<<RXEN1) | (1<<TXEN1); /* Enable receiver and transmitter */
//Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
do
{
UDR1;
}
while (UCSR1A & (1<< RXC1));
}
/*======================= Initialisieren Senden ================================================== =============*/
void USART1_Transmit (unsigned char data)
{
while(!(UCSR1A & (1<<UDRE1)))
{
}
UDR1 = data;
}
/*======================= Befehl für Senden ================================================== =================*/
void uart_puts(char *s)
{
while(*s)
{
USART1_Transmit(*s);
s++;
}
}
/*======================= Initialisieren Empfangen ================================================== ==========*/
unsigned char USART1_Receive (void)
{
while ( ! (UCSR1A & (1<<RXC1))); /* Wait for data to be received */
return UDR1;/* Get and return received data from buffer */
}
dann noch meine Hauptroutine
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include "usart.h"
volatile char Daten;
ISR(USART1_RX_vect)
{
Daten = UDR1;
}
void main(void)
{
DDRA = 0xFF;
USART1_Init();
sei(); //Interrupts freigeben
for(;;)
{
if(Daten == 'A')
{
Daten = 0;
PORTA = (1<<PA0);
}
if(Daten == 'a')
{
PORTA = (1<<PA1);
Daten = 0;
}
else
{
PORTA = 0x00;
}
}
}
Danke schon mal für eure Hilfe.
LG Anna
nachdem ich jetzt erfolgreich Daten per RS232 vom uC zum PC schicken kann (danke an Jens =D> ) will ich nun Daten vom Pc zum uC schicken. Und zwar will ich einfach eine LED über eine Buchstabeneingabe machen. Ich hab mir schon verschiedene Threads im Forum angeschaut und auch viele verschiedene Code ausprobiert, kam aber auch kein positives Ergebnis. Kann mir jemand helfen? Ich benutze einen AT90CAN128 und das AVR-Studio.
Ich poste meinen Code.
Meine Header -datei: usart.h
#include <avr/io.h>
#include <util/delay.h>
/*### Senden per USART - RS232-Kommunikation ###*/
/*======================= Initialisierung ================================================== =========0=========*/
void USART1_Init (void)
{
uint16_t ubrr; /* Set baud rate */
ubrr = ((F_CPU/(9600*16L))-1);
UBRR1H = (unsigned char)(ubrr>>8);
UBRR1L = UBRR1L = (unsigned char) ubrr;
UCSR1C = (1<<UCSZ11) | (1<<UCSZ10) ; /* Set frame format: 8data, no parity & 1 stop bits */
UCSR1B = (1<<RXEN1) | (1<<TXEN1); /* Enable receiver and transmitter */
//Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
do
{
UDR1;
}
while (UCSR1A & (1<< RXC1));
}
/*======================= Initialisieren Senden ================================================== =============*/
void USART1_Transmit (unsigned char data)
{
while(!(UCSR1A & (1<<UDRE1)))
{
}
UDR1 = data;
}
/*======================= Befehl für Senden ================================================== =================*/
void uart_puts(char *s)
{
while(*s)
{
USART1_Transmit(*s);
s++;
}
}
/*======================= Initialisieren Empfangen ================================================== ==========*/
unsigned char USART1_Receive (void)
{
while ( ! (UCSR1A & (1<<RXC1))); /* Wait for data to be received */
return UDR1;/* Get and return received data from buffer */
}
dann noch meine Hauptroutine
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include "usart.h"
volatile char Daten;
ISR(USART1_RX_vect)
{
Daten = UDR1;
}
void main(void)
{
DDRA = 0xFF;
USART1_Init();
sei(); //Interrupts freigeben
for(;;)
{
if(Daten == 'A')
{
Daten = 0;
PORTA = (1<<PA0);
}
if(Daten == 'a')
{
PORTA = (1<<PA1);
Daten = 0;
}
else
{
PORTA = 0x00;
}
}
}
Danke schon mal für eure Hilfe.
LG Anna