Gast
#683979
Hallo alle zusammen,
ich habe gestern einen Atmega16 versucht zu programmieren. Nachfolgenden
Code habe ich draufgespielt und das Ganze mit dem Windows Hyperterminal
getestet.
putch('>') funktionert, d. h. wenn ich den Controller restete, erscheint
das Zeichen im Bildschirm des PC's.
Leider kann ich jedoch kein Zeichen vom PC zum Controller senden. Lt.
Code müsste über "Echo" das gesendete Zeichen wieder am Schirm angezeigt
werden, was nicht der Fall ist.
Einstellungen stimmen überein: Baud: 9600; 1 Start; 8 Daten; 1 Stop.
Findet jemand einen Fehler im Code:
#include <avr/io.h> //Deklarationen
#include <avr/signal.h>
#include <avr/interrupt.h> //für Interrupt
#define TAKT 8000000UL //Controllertakt 8MHz
#define PRESET 40000UL //Taktteiler für Vorteiler
#define BAUD 9600UL //Baudrate
//Festlegung unabhängiger Typennamen:
typedef unsigned int uint16;
typedef signed int sint16;
typedef unsigned short uint8;
typedef signed short sint8;
//Prototypen von Funktionen
void initusart (void);
void putch (uint8);
uint8 getch (void);
uint8 getche (void);
uint8 kbhit (void);
int main (void)
{
initusart();
putch('>');
while(1)
{
if (UDR = 'x')
{
putch('j');
}
}
return 0;
}
//Nachfolgend Funktionen für USART-Kommunikation
//USART bzw. UART initialisieren
void initusart (void)
{
uint8 x; //lokale Hilfsvariable
#ifdef UBRRL //USART-Schnittstelle
UBRRL = (TAKT / (16ul * BAUD)) - 1; //Baudrate mit TAKT und BAUD
UCSRB |= (1<<TXEN) | (1<<RXEN); //Sender und Empränger ein
UCSRC |= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); //async 8bit
#else
UBRR = (TAKT / (16ul * BAUD)) - 1; //Baudrate
UCR |= (1<<TXEN) | (1<<RXEN); //Sender und Empfänger ein
#endif
x = UDR; //Empfänger leeren
}
//warten und Zeichen senden
void putch (uint8 x)
{
#ifdef UCSRA //USART
while (!(UCSRA & (1<<UDRE))); //warte, solange Sender besetzt
#else //UART
while (!(USR & (1<<UDRE))); //warte, solange Sender besetzt
#endif
UDR = x; //Zeichen nach Sender
}
//warten und Zeichen abholen
uint8 getch (void)
{
#ifdef UCSRA //USART
while (!(UCSRA & (1<<RXC))); //warte, bis Zeichen da
#else //UART
while (!(USR & (1<<RXC))); //warte, bis Zeichen da
#endif
return UDR; //Zeichen abholen
}
//warten und Zeichen abholen mit Echo
uint8 getche (void)
{
int x; //Hilfsvariable
#ifdef UCSRA //USART
while (!(UCSRA & (1<<RXC))); //warte, bis Zeichen da
x = UDR; //abholen und speichern
while (!(UCSRA & (1<<UDRE))); //warte, solange Sender besetzt
#else //UART
while (!(UCSRA & (1<<RXC))); //warte, bis Zeichen da
x = UDR; //abholen und speichern
while (!(UCSRA & (1<<UDRE))); //warte, solange Sender besetzt
#endif
UDR = x; //Echo senden
return x; //Zeichen zurückgeben
}
//Empfänger testen
uint8 kbhit (void)
{
#ifdef UCSRA //USART
if (UCSRA & (1<<RXC)) return UDR; else return 0;
#else //UART
iv (USR & (1<<RXC)) return UDR; else return 0;
#endif
}
Gruß
Sissi