hallo,
Das Problem ist jener, dass er mir bei INterrupt USART RXC wenn ich im
Hauptprogramm dann einen String ausgeben möchte nur 2 Zeichen ausgibt
von dem String.
Ich steh da an:
/*
* C2T3_v1.c
*
* Created: 28.05.2017 16:13:26
* Author : Gert
*/
#include <avr/io.h>
#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include <avr/interrupt.h>
#include <util/setbaud.h>
#include <util/delay.h>
#define FOSC 16000000
#define MYUBRR 51
void uart_init(void)
{
cli();
//1 = output, 0 = input
// DDRB = 0b11101111; //PB4 = MISO
// DDRC = 0b11111110; //
DDRD = 0b11111110; //PORTD (RX on PD0)
//USART Baud rate: 56700
UBRR0H = (MYUBRR >> 8);
UBRR0L = MYUBRR;
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (0<<USBS0)|(3<<UCSZ00);
UCSR0A = (1<<U2X0);
// stdout = &mystdout; //Required for printf init
// UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); // UART RX, TX und
RX Interrupt einschalten
sei();
}
int uart_putc(unsigned char c)
{
if(UCSR0A & (1<<UDRE0)) /* Senden, wenn UDR frei ist
*/
{ UDR0 = c; /* schreibt das Zeichen x auf die
Schnittstelle */
} /* sende Zeichen */
return 0;
}
void uart_puts (char *s)
{
while (*s)
{ /* so lange *s != '\0' also ungleich dem
"String-Endezeichen(Terminator)" */
uart_putc(*s);
s++;
}
}
#define UART_MAXSTRLEN 40
volatile uint8_t uart_str_complete = 0; // 1 .. String komplett
empfangen
volatile uint8_t uart_str_count = 0;
volatile char uart_string[UART_MAXSTRLEN + 1] = "";
void USART_Flush( void )
{
unsigned char dummy;
while ( UCSR0A & (1<<RXC0) ) dummy = UDR0;
}
ISR(USART0_RX_vect)
{ //PB0 im PORTB setzen
unsigned char nextChar;
// Daten aus dem Puffer lesen
nextChar = UDR0;
if( uart_str_complete == 0 ) { // wenn uart_string gerade in
Verwendung, neues Zeichen verwerfen
PORTD |= (1 << PORTD3);
// Daten werden erst in uart_string geschrieben, wenn nicht
String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
if( nextChar != '\n' &&
nextChar != '\r' &&
uart_str_count < UART_MAXSTRLEN ) {
uart_string[uart_str_count] = nextChar;
uart_str_count++;
}
else {
PORTD &= ~(1 << PORTD3); //PB0 im PORTB löschen
uart_string[uart_str_count] = '\0';
uart_str_count = 0;
uart_str_complete = 1;
}
}
}
int main(void)
{
char char_array[] = { "Hallo Programm gestartet" };
// Pufferspeicher ausreichend groß
// evtl. Vorzeichen + width + Endezeichen:
//char s[8];
float f = -12.345;
// int16_t i = -12345;
uart_init();
PORTD |= (1 << PORTD3);
_delay_ms(5000);
PORTD &= ~(1 << PORTD3); //PB0 im PORTB löschen
while (1)
{
if(uart_str_complete)
{
USART_Flush();
uart_puts(uart_string);
uart_str_complete = 0;
}
}
return 0;
}