Funky
27.07.2006, 10:46
Hallo,
ich habe ein Programm welches mir das senden und empfangen über UART vom PC zum Mikrocontroller ermöglicht. Nach dem senden einer 1, soll der Mikrocontroller eine LED einchalten. Beim erneuten senden der 1 soll die LED wieder ausgeschaltet werden. Beim senden einer 2, soll der Controller ein h zurück zum PC schicken.
Das schalten der LED hat vorher bestens geklappt, erst als ich das zurücksenden des 'h' mit eingebaut habe gab es Probleme.
Nun muss ich jedes Zeichen zweimal senden damit was passiert. Oder ich muss vor dem Zeichen (1 oder 2) irgendein anderes Zeichen senden damit es klappt. Also irgendwie ein Startbit.....
Woran kann das liegen?
Hier der Code:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#define FOSC 8000000 //Clock Speed
#define BAUD 9600
#define UBRR ((FOSC / (BAUD * 16L)) - 1)
unsigned char buffer2;
void uart_init(void)
{
/* Port als Ausgang */
DDRB |= (1 << PB2);
/* Aktivieren des Empfängers, des Senders und des "Daten empfangen+Daten leer"-Interrupts */
UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0) | (1 << UDRIE0);
/* baud rate*/
UBRR0H = (unsigned char) (UBRR>>8);
UBRR0L = (unsigned char) UBRR;
/* frame format: 8data, 1stop bit*/
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}
// Das Hauptprogramm (Einsprungpunkt)
int main()
{
//UART initialisieren
uart_init();
// Interrupts aktivieren
sei();
// Eine Endlosschleife.
while (1)
{}
}
ISR(USART_UDRE_vect)
{
UDR0 = 'h';
UCSR0B &= ~(1 << UDRIE0); //UDRE Interrupt ausschalten
}
//Interrupt UART
ISR(USART_RX_vect )
{
unsigned char buffer;
if(UCSR0A & (1 << RXC0)) {
buffer = UDR0;
switch(buffer) {
case '1': // LED ein/ausschalten
if (PORTB & (1 << PB2))
PORTB &= ~(1 << PB2);
else
PORTB |= (1 << PB2);
break;
case '2':
UCSR0B |= (1 << UDRIE0); //UDRE Interrupt einschalten
break;
default:
break;
}
}
}
Ach ja, ich benutze das STK500 mit einem externen Quatz (8MHz). Die Fusebits sind auf externen Quartz gestellt.
Gruß
ich habe ein Programm welches mir das senden und empfangen über UART vom PC zum Mikrocontroller ermöglicht. Nach dem senden einer 1, soll der Mikrocontroller eine LED einchalten. Beim erneuten senden der 1 soll die LED wieder ausgeschaltet werden. Beim senden einer 2, soll der Controller ein h zurück zum PC schicken.
Das schalten der LED hat vorher bestens geklappt, erst als ich das zurücksenden des 'h' mit eingebaut habe gab es Probleme.
Nun muss ich jedes Zeichen zweimal senden damit was passiert. Oder ich muss vor dem Zeichen (1 oder 2) irgendein anderes Zeichen senden damit es klappt. Also irgendwie ein Startbit.....
Woran kann das liegen?
Hier der Code:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#define FOSC 8000000 //Clock Speed
#define BAUD 9600
#define UBRR ((FOSC / (BAUD * 16L)) - 1)
unsigned char buffer2;
void uart_init(void)
{
/* Port als Ausgang */
DDRB |= (1 << PB2);
/* Aktivieren des Empfängers, des Senders und des "Daten empfangen+Daten leer"-Interrupts */
UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0) | (1 << UDRIE0);
/* baud rate*/
UBRR0H = (unsigned char) (UBRR>>8);
UBRR0L = (unsigned char) UBRR;
/* frame format: 8data, 1stop bit*/
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}
// Das Hauptprogramm (Einsprungpunkt)
int main()
{
//UART initialisieren
uart_init();
// Interrupts aktivieren
sei();
// Eine Endlosschleife.
while (1)
{}
}
ISR(USART_UDRE_vect)
{
UDR0 = 'h';
UCSR0B &= ~(1 << UDRIE0); //UDRE Interrupt ausschalten
}
//Interrupt UART
ISR(USART_RX_vect )
{
unsigned char buffer;
if(UCSR0A & (1 << RXC0)) {
buffer = UDR0;
switch(buffer) {
case '1': // LED ein/ausschalten
if (PORTB & (1 << PB2))
PORTB &= ~(1 << PB2);
else
PORTB |= (1 << PB2);
break;
case '2':
UCSR0B |= (1 << UDRIE0); //UDRE Interrupt einschalten
break;
default:
break;
}
}
}
Ach ja, ich benutze das STK500 mit einem externen Quatz (8MHz). Die Fusebits sind auf externen Quartz gestellt.
Gruß