Benutzer Diskussion:Lissy
Hallo an alle,
erst mal: ich bin total neu in diesem Breich, verzeiht mir also meine Anfängerfehler. Ich möchte zwischen einem Terminal (PC) und meinem Controller (ATMEGA 164 PA) Daten hin und her senden. Senden kann ich auch, dabei sehe ich die entsprechenden Daten (in meinem Fall "0xAA") im Empfangsbereich des Terminals. Allerdings weiß ich nicht so recht wie ich das mit dem Empfangen hinbekommen soll. Ich wollte das Ganze Interrupt-gesteuert machen: also erst Interrupt initialisieren, leere Endlosschleife, dann ein Interrupt der ausgelösst wird, wenn der Controller senden soll und ein Interrupt der ausgelöst wird, wenn der Controller empfangen soll.
Hier mal mein Codevorschlag:
[c] //Header einbinden
- include <avr/io.h>
- include <util/delay.h>
- include <stdint.h>
- include <avr/interrupt.h>
//Definitionen
- define RXB8 1
- define TXB8 0
- define UPE 2
- define OVR 3
- define FE 4
- define UDRE 5
- define RXC 7
- define FRAMING_ERROR (1<<FE)
- define PARITY_ERROR (1<<UPE)
- define DATA_OVERRUN (1<<OVR)
- define DATA_REGISTER_EMPTY (1<<UDRE)
- define RX_COMPLETE (1<<RXC)
//Prototypen der Funktionen
void USART_Init( unsigned int baud );
void sendenByte( unsigned char data );
unsigned char empfangenByte( void );
int main(void) {
//UART initialisieren USART_Init(9600); UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); //Interrupts aktivieren sei();
while(1)
{
}
}
void USART_Init( unsigned int baud ) { //Baudrate setzen: (8MHz / (16*baud))-1 = 51 --> 33hex UBRR0H=0x0; UBRR0L=0x33; //keine error-bits gesetzt UCSR0A = 0x00; //Interrupts enable, receiver und transmitter enable UCSR0B = 0xF8; //asynchroner modus, kein parity bit, 1 stop bit, 8 datenbits UCSR0C = 0x06; //Global Interrupt Flag loeschen (Bit 0 bei SREG) //SREG &= ~(1 << 0); }
void sendenByte( unsigned char data )
{
//Sendekanal aktivieren (Bit 3 in UCSR1B)
UCSR0B &= ~(1 << TXEN0);
//pruefen ob vorherige Uebertragung abgeschlossen
if ((UCSR0A & (1 << UDRE0)))
{
for (int i=8; i<=0; i--)
{
UDR0 = data;
//UCSR1A |= (1 << UDRE1);
}
UDR0 = data;
} else
{
sendenByte(data);
}
//Receiver wieder enable
UCSR0B |= (1 << TXEN0);
}
unsigned char empfangenByte( void ) { unsigned char data; //Emfangskanal aktivieren (Bit 4 in UCSR1B UCSR0B &= ~(1 << RXEN0); //solange RXC noch nicht gesetzt Daten empfangen if (UCSR0A | (1 << RXC0)) { for (int i=8; i<=0; i--) { //Daten empfangen data = UDR0; } }
return data; } ISR (USART0_TX_vect) {
sendenByte(0xAA);
} ISR (USART0_RX_vect) {
empfangenByte();
}
[/c]