Forum: Mikrocontroller und Digitale Elektronik Atmega8 Uart Interrup


von Jürgen (Gast)


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!

von Huch (Gast)


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.

von Klaus W. (mfgkw)


Lesenswert?

Immerhin kennt er [c], sonst hast du vollkommen recht.

von Eddy C. (chrisi)


Lesenswert?

Der Interrupt wird nicht global eingeschaltet?

von Jürgen (Gast)


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.

von Huch (Gast)


Lesenswert?

Ich gebs auf. Da ist Hopfen und Malz verloren.

von Eddy C. (chrisi)


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.

von Huch (Gast)


Lesenswert?

@ Eddy Current

Ich schreibe was ich für richtig halte. Wenn Du das nicht aushälst, ist 
das allein Dein Problem.

von Jürgen (Gast)


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,

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.