Unbekannt
18.11.2014, 09:20
Schönen guten Tag,
ich bin ein ziemlicher Neuling in der Mikrocotroller Programmierung und taste mich nun langsam voran. Nachdem das Senden von Daten vom Controller an den PC wunderbar geklappt hat, wollte ich den Spieß mal umdrehen.
Zum Porgramm: Durch das eingeben von Befehlen wie "0b11111001" sollten die LED's am PORTC im angegebenen Muster aufleuchten. Jedoch springen die LED's bereits bei der kleinsten Eingabe, z.B. auch den Drücken der Leer- oder Pfeiltasten, wild hin und her und ich kann keine Logik dahinter erkennen.
#include <avr/io.h>
#define F_CPU 16000000UL // Systemtakt in Hz - Definition als unsigned long beachten
#define BAUD 9600UL // Baudrate
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif
#include "util/delay.h"
uint8_t uart_getc(void)
{
while (!(UCSR0A & (1<<RXC0))); // warten bis Zeichen verfuegbar
return UDR0; // Zeichen aus UDR an Aufrufer zurueckgeben
}
int uart_putc(unsigned char c)
{
while(!(UCSR0A & (1<<UDRE0)))
{
}
_delay_ms(100);
UDR0= c;
}
void uart_puts (char *s)
{
while (*s)
{
uart_putc(*s);
s++;
}
}
int main(void)
{
UBRR0H = UBRR_VAL >> 8;
UBRR0L = UBRR_VAL & 0xFF;
UCSR0C=(0<<UMSEL0)|(1<<UCSZ00)|(1<<UCSZ01); //Asynchroner Mode, 8-bit
UCSR0B= (1<<TXEN0)|(1<<RXEN0); //Transmitter einschalten
while(1)
{
if ( (UCSR0A & (1<<RXC0)) )
{
uint8_t c;
c = uart_getc();
DDRC = 0xFF;
PORTC = c;
_delay_ms(200);
}
else
{
// Kein Zeichen empfangen, Restprogramm ausführen...
}
}
}
Ich benutze den AT19CAN128, im HyperTerminal sind eingestellt: Baudrate 9600, 1 Stoppbit, kein Handshaking, 8-bit.
Ich bedanke mich schonmal für die Hilfe!
ich bin ein ziemlicher Neuling in der Mikrocotroller Programmierung und taste mich nun langsam voran. Nachdem das Senden von Daten vom Controller an den PC wunderbar geklappt hat, wollte ich den Spieß mal umdrehen.
Zum Porgramm: Durch das eingeben von Befehlen wie "0b11111001" sollten die LED's am PORTC im angegebenen Muster aufleuchten. Jedoch springen die LED's bereits bei der kleinsten Eingabe, z.B. auch den Drücken der Leer- oder Pfeiltasten, wild hin und her und ich kann keine Logik dahinter erkennen.
#include <avr/io.h>
#define F_CPU 16000000UL // Systemtakt in Hz - Definition als unsigned long beachten
#define BAUD 9600UL // Baudrate
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif
#include "util/delay.h"
uint8_t uart_getc(void)
{
while (!(UCSR0A & (1<<RXC0))); // warten bis Zeichen verfuegbar
return UDR0; // Zeichen aus UDR an Aufrufer zurueckgeben
}
int uart_putc(unsigned char c)
{
while(!(UCSR0A & (1<<UDRE0)))
{
}
_delay_ms(100);
UDR0= c;
}
void uart_puts (char *s)
{
while (*s)
{
uart_putc(*s);
s++;
}
}
int main(void)
{
UBRR0H = UBRR_VAL >> 8;
UBRR0L = UBRR_VAL & 0xFF;
UCSR0C=(0<<UMSEL0)|(1<<UCSZ00)|(1<<UCSZ01); //Asynchroner Mode, 8-bit
UCSR0B= (1<<TXEN0)|(1<<RXEN0); //Transmitter einschalten
while(1)
{
if ( (UCSR0A & (1<<RXC0)) )
{
uint8_t c;
c = uart_getc();
DDRC = 0xFF;
PORTC = c;
_delay_ms(200);
}
else
{
// Kein Zeichen empfangen, Restprogramm ausführen...
}
}
}
Ich benutze den AT19CAN128, im HyperTerminal sind eingestellt: Baudrate 9600, 1 Stoppbit, kein Handshaking, 8-bit.
Ich bedanke mich schonmal für die Hilfe!