Forum: Mikrocontroller und Digitale Elektronik Problem USART Interrupt routine


von G. (Gast)


Lesenswert?

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;
}

von G. (Gast)


Lesenswert?

uart_puts(uart_string);
hier steht natürlich
uart_puts(char_array);
sorry

von Stefan E. (sternst)


Lesenswert?

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.

von G. (Gast)


Lesenswert?

Gerade gesehen :-)

Danke funktioniert :-)

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
Noch kein Account? Hier anmelden.