Problem mit ATMega32 UART RX

OP #1702324
Lesenswert?

Hallo,

Wieso wenn ich einen Text über 8 Zeichenlänge an Mega32 schicke bekomme 
ich nur 7 Zeichen zurück?
Wo liegt der Fehler, der Code ist Unten zu sehen, vielleicht kann mir 
jemand helfen.


#define F_CPU     16000000UL
#define false     0
#define true     1
#define uchar     unsigned char
#define uint     unsigned int


#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <math.h>
#include <avr/sleep.h>
#include <string.h>
#include <stdio.h>
#include <inttypes.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <avr/wdt.h>

//==============================================================
//Sendefunktionen
//==============================================================
void usart_putc(uint8_t byte){
//Ein Byte senden
while(!(UCSRA&(1<<UDRE)));//warten auf Datenregister empty
UDR=byte;
}
//--------------------------------------------------------------
void usart_puts(char *s)
//Einen String mit Endmarke 0 senden
{

    while (*s!=0) {
        usart_putc(*s);
    s++;
    }
    usart_putc(0); //Endmarke 0 übertragen!
}


//**** UART-Funktionen mit Interrupt ****
#define PUFFER_GROESSE 100   //Puffergröße in Byte

volatile unsigned char puffer[PUFFER_GROESSE];
volatile uint8_t lesezeiger;
volatile uint8_t schreibzeiger;

//====================================================================== 
=
//Serielle Schnittstelle mit 8 Bit, no parity, 1 Stoppbit 
initialisieren
//Den Datenempfang erledigt eine Interrupt-Service-Routine.
//====================================================================== 
=
void usart_init_intr(uint16_t baud){
  const uint32_t fosz=F_CPU;
  uint16_t baud_wert, ui1;

  lesezeiger=0;
  schreibzeiger=0;

  //Baudrate einstellen
  baud_wert=fosz/(baud*16L)-1;
  UBRRH=(uint8_t)(baud_wert>>8);
  UBRRL=(uint8_t)baud_wert;

  //8N1 Daten
  UCSRC =(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
  //Empfangen und Senden und Empfangsinterrupt aktivieren
  UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);

  for(ui1=0;ui1<PUFFER_GROESSE;ui1++)
  {
    puffer[ui1]=0;
  }
}

//=============================================================
// Interrupt-Service-Routine
//=============================================================
ISR (USART_RXC_vect){
puffer[schreibzeiger]=UDR;

usart_putc(puffer[schreibzeiger]); usart_putc('\r');

schreibzeiger++;
if(schreibzeiger >= PUFFER_GROESSE) schreibzeiger=0;
}
//=============================================================
//Funktionen für den interrupt-gesteuerten Datenempfang
//=============================================================
uint8_t usart_byte_avail_intr(void){
_delay_ms(10);
if(schreibzeiger!=lesezeiger)
return 1;
else return 0;
}

//--------------------------------------------------------------
char usart_getc_intr(void)
{
  char datenbyte=0;

  if(schreibzeiger!=lesezeiger)
   {
     datenbyte=puffer[lesezeiger];
     lesezeiger++;
     if(lesezeiger >= PUFFER_GROESSE) lesezeiger=0;
   }
  return datenbyte;
}




// *************************************   MAIN-Funktion
int main( void )
{
  // char  cBuffer[100];

  // JTAG-Bit setzen um es abzuschalten
  MCUCSR |= (1<<JTD);    // Setze JTAG-Bit auf 1
  MCUCSR |= (1<<JTD);    // Setze JTAG-Bit auf 1
  _delay_ms(100);

  DDRD= 0xff;
  PORTD=0;

  PORTD |= (1<<PD5);

  usart_init_intr(19200);
  sei();
  while(1)
  {
  }

  return(0);
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren