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