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;
}
uart_puts(uart_string); hier steht natürlich uart_puts(char_array); sorry
G. schrieb: > Hauptprogramm dann einen String ausgeben möchte nur 2 Zeichen ausgibt > von dem String Ja, weil dein uart_putc einfach alles "entsorgt", wenn UDR gerade belegt ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.