Auf der Suche nach dem guten alten printf() bin ich über fdevopen() gestolpert.
Jetzt mal ne ganz andere Frage die IR-Schnittstelle ist ja Interruptfähig. Ich vermute, dass durch Einstreuung beim Senden auch etwas empfangen wird und immer wieder das gesendet im Empfangspuffer landet. Sollte das so sein ist es schwierig eine Eingabe zu realisieren das oben drein noch Interruptfähig funktioniert.
Die infos habe ich aus:
http://www.nongnu.org/avr-libc/user-manual/index.html
Code:
#include "asuro.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define Pin1 0
#define Pin2 1
#define Pin3 2
#define Pin4 3
#define Pin5 4
#define Pin6 5
#define Pin7 6
#define Pin8 7
#define READ 1
#define WRITE 2
#define F_CPU 8000000
#define USART_BAUD_RATE 2400
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1)
//static unsigned char changed = 0;
//static unsigned char data = 0;
//volatile unsigned char changed = 0;
volatile unsigned char data = 0;
void usart_init(int Enable, int Interupts)
{
if (Enable & READ) UCSRB = (1<<RXEN);
if (Enable & WRITE) UCSRB |= (1<<TXEN);
if (Interupts & READ) UCSRB |= (1<<RXCIE);
if (Interupts & WRITE) UCSRB |= (1<<TXCIE);
UBRRL = (unsigned char) USART_BAUD_SELECT;
}
void usart_writeChar(unsigned char c)
{
//unsigned char hilfsregister;
//hilfsregister = UCSRB;
//UCSRB &= ~(1<<RXCIE); //interrupt flag disable
while (!(UCSRA & (1<<UDRE)));
UDR = c;
while(!(UCSRA & (1<<TXC)));
//UCSRB = hilfsregister;
}
unsigned char usart_readChar(void)
{
//while(!(UCSRA & (1<<RXC)));
//return UDR;
return data;
}
void usart_writeString(unsigned char *string) {
unsigned char hilfsregister;
hilfsregister = UCSRB;
UCSRB &= ~(1<<RXCIE); //interrupt flag disable
while (!(UCSRA & (1<<UDRE)));
while ( *string)
{
while (!(UCSRA & (1<<UDRE)));
usart_writeChar(*string++);
}
UCSRB = hilfsregister;
}
SIGNAL (SIG_UART_RECV)
{
data = UDR;
//changed = 1;
//usart_writeChar('[');
usart_writeChar(data);
//usart_writeChar(']');
}
int main (void)
{
//int a=0;
unsigned char zeichen;
Init();
usart_init( (READ + WRITE) , READ);
//changed = 0;
//usart_writeString("\nTest");
//for(a = 0; a<3000;a++) Sleep(72); //3 Sekunden warten
sei();
while (1)
{
zeichen = usart_readChar();
//for(a = 0; a<3000;a++) Sleep(72); //1 Sekunden warten
usart_writeString("das Zeichen-->");
usart_writeChar(zeichen);
usart_writeString("<--\n");
} // endlosschleife
}
Lesezeichen