Atmega8 Uart Interrup

Gast #1989091
Lesenswert?

Hallo Leute,

hab an meinem Atmega8 einen Max232 und habe jetzt eine wenig Code 
zusammenschustert der durch einen Interrupt einen String einließt und 
diesen dann ausgiebt. Funktioniert leider noch nicht so ganz.

1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include <avr/interrupt.h>
4
#define F_CPU 4000000
5
#include <util/delay.h>
6
#define BAUD 9600
7
#define UBRR_VAL F_CPU/16/BAUD-1
8

9
volatile uint16_t wert;
10

11

12
#define UART_MAXSTRLEN 10
13
 
14
volatile uint8_t uart_str_complete = 0;     // 1 .. String komplett empfangen
15
volatile uint8_t uart_str_count = 0;
16
volatile char uart_string[UART_MAXSTRLEN + 1] = "";
17

18
char buffer[10];            // oder ein anderer passender Wert
19

20

21
void delay_ms(int delay) 
22
{
23
  int i;
24
  for (i=0;i<=delay;i++) 
25
  {
26
    _delay_ms(1);
27
  }
28
}
29

30
void init_uart(unsigned int ubrr)
31
{
32
  UBRRH = (unsigned char)(ubrr>>8);
33
  UBRRL = (unsigned char)(ubrr);
34
  UCSRB |= (1<<RXEN);
35
  UCSRB |= (1<<TXEN);
36
  UCSRB |= (1<<RXCIE);
37
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
38
}
39

40
void send_char(unsigned char data) 
41
{
42
        while (!(UCSRA & (1<<UDRE)));
43
        UDR = data;
44
}
45

46
void send_string(char *data) 
47
{
48
  while (*data)
49
  {
50
      send_char(*data);
51
      data++;
52
  }
53
}
54

55

56

57
ISR(USART_RXC_vect)
58
{
59
  unsigned char nextChar;
60
 
61
  // Daten aus dem Puffer lesen
62
  nextChar = UDR;
63
  if( uart_str_complete == 0 ) {  // wenn uart_string gerade in Verwendung, neues Zeichen verwerfen
64
 
65
    // Daten werden erst in string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
66
    if( nextChar != '\n' &&
67
        nextChar != '\r' &&
68
        uart_str_count < UART_MAXSTRLEN - 1 ) {
69
      uart_string[uart_str_count] = nextChar;
70
      uart_str_count++;
71
    }
72
    else {
73
      uart_string[uart_str_count] = '\0';
74
      uart_str_count = 0;
75
      uart_str_complete = 1;
76
    }
77
  }
78
}
79

80
int main(void) {
81
  init_uart(UBRR_VAL);
82

83
    while(1)
84
  {
85
   _delay_ms(1000);  
86
        wert = uart_string; 
87
  send_string("wert: ");
88
  send_string(utoa(wert, buffer, 10));
89
  }
90
}

Findet jemand hier den Wurm?

Vielen Dank und an alle Frohe Feiertage!
Gast #1989096
Lesenswert?

Bitte klar und vollständige Information darüber, was der Code genau tun 
soll, wie Du feststellst, das er das nicht tut und über Deine Ergebnisse 
der der Ursachenforschung.

Wir sind hier nicht die Weihnachtsmänner, denen man ein Stück Code mit 
der Bemerkung "geht nicht" hinwirft und die dann den Rest für Dich 
machen.

An Deiner Rechtschreibung, könntest Du auch noch arbeiten.
Gast #1989110
Lesenswert?

Entschuldigt.

Der Code soll folgendes machen: einen String empfangen welcher vom PC 
aus Via Terminal geschickt wird und diesen dann via

{c]  send_string(utoa(wert, buffer, 10));[/c]

ausgeben. Momentan lautet meine Ausgabe jedoch durchgehen "103".

Vielen Dank.
#1989122
Lesenswert?

Huch, wenn Du nix beizutragen hast, bau halt nen Schneemann, das ist ja 
nicht auszuhalten.

Jürgen:

Abgesehen vom Interrupt, der nicht ein ist, sollte Dir die Zeile hier:

wert = uart_string;

etwas sportlich vorkommen. Da würde man lieber sowas wie

wert = atoi(uart_string);

sehen.
Gast #1990346
Lesenswert?

Danke Eddy!

Nun würde ich noch gern wissen ob jemand einen Tipp hat wie ich die 
Interruptroutine so verändern kann das der Ausgabestring "uart_string" 
immer wieder überschriebenwird und das schreiben in den String nicht 
aufhhört wenn dieser voll ist.

Vielen Dank,

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