Forum: Compiler & IDEs uart int ausgeben


von Michael K. (michael1104)


Lesenswert?

Ich habe mal ne Frage, wie ich den eingelesenen Int Wert vom AD Wandler, 
auf der seriellen Schnittstelle abgebe
Wie funktioniert das mit dem String?

Hier mal mein Code:

#define F_CPU 3686400


#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <inttypes.h>


void USART_Init()
{


    UBRRH = 0;  /*9600 Baud */
    UBRRL = 23;


  UCSRB = (1<<RXEN)|(1<<TXEN);
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); /* 8 Datenbits, kein 
Parity Bit, ein Stoppbit */
}

void USART_Transmit()
{

while ( !( UCSRA & (1<<UDRE)) )
{
}

  UDR = '8';
  return 0;
}

void io()
{
  int x;
  DDRC = 0x00;
}



int main(void)
{
  io();
  USART_Init();
  int x;

  while(1)
  {
   ADCSR = 0b11000101;
     while (bit_is_set(ADCSR,6));
     x=ADCW;

   USART_Transmit();
  }

}

von holger (Gast)


Lesenswert?

So jedenfalls nicht ;)

von Uwe .. (uwegw)


Lesenswert?

-Du schreibst dir ne Funktion, die ein Zeichen übers UART ausgibt
-Du schreibst ne Funktion, die einen String übergeben kriegt und ihn 
Zeichen für Zeichen an die erste Funktion übergibt
-Du benutzt zb itoa, um deinen int in einen String zu wandeln.
-Du sendest diesen String an die zweite Funktion

von Michael K. (michael1104)


Lesenswert?

Danke,
probier das gerade mit:

   int x(unsigned char c)
{
  while ( !( UCSRA & (1<<UDRE)) )  /* warte, bis UDR bereit */
    {
    }

    UDR = c;                     /* sende Zeichen */
    return 0;

von Michael K. (michael1104)


Lesenswert?

klappt nur irgendwie nicht...

von STK500-Besitzer (Gast)


Lesenswert?

>klappt nur irgendwie nicht...

Schade...
DA muß man wohl noch etwas umformen. Z.B. Ein int nach char...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

1
#define F_CPU 3686400
2
3
#include <avr/io.h>
4
#include <stdlib.h>
5
6
char buffer[5]; // 16-Bit => 4 Hexadezimalstellen + 1 Nullbyte
7
8
void USART_Init()
9
{
10
  UBRRH = 0;  /* 9600 Baud */
11
  UBRRL = 23;
12
  UCSRB = (1<<RXEN)|(1<<TXEN);
13
  /* 8 Datenbits, kein Parity Bit, ein Stoppbit */
14
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); 
15
}
16
17
void USART_Transmit(char c)
18
{
19
  while ( !( UCSRA & (1<<UDRE)) )
20
  {
21
  }
22
  UDR = c;
23
}
24
25
void io()
26
{
27
  DDRC = 0x00;
28
}
29
30
int main(void)
31
{
32
  io();
33
  USART_Init();
34
35
  while(1)
36
  {
37
    unsigned int x;
38
    char *s;
39
40
    // ADC Einlesen
41
    ADCSR = 0b11000101;           // ungeprüft, da zu kryptisch
42
    while (bit_is_set(ADCSR,6));  // ungeprüft, da zu kryptisch
43
    x = ADCW;
44
45
    // ADC Umwandeln in String einer 4-steligen Hexadezimalzahl
46
    s = buffer;
47
/*
48
siehe:
49
http://www.mikrocontroller.net/articles/FAQ#itoa.28.29
50
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#g4f6b3dd51c1f8519d5b8fce1dbf7a665
51
*/
52
    itoa(x, s, 16);
53
54
    // String ausgeben
55
    while (*s)
56
      USART_Transmit(*s++);
57
58
    // Zeilenvorschub und Wagenruecklauf
59
    USART_Transmit('\n');
60
    USART_Transmit('\r');
61
  }
62
}

von Gast (Gast)


Lesenswert?

Umformen wäre ganz gut ;-)
1
char buffer[10];
2
int num=123;
3
4
itoa(num,buffer,10);

Damit sollte aus dem int ein char geworden sein. Es kann auch gut sein, 
dass der buffer nur 7 Zeichen groß sein muss und bei itoa dann auch 
keine 10 hin muss, das habe ich grade so aus dem Kopf mal 
hingeschrieben.

Die einzelnen Zeichen im Puffer musst du dann getrennt senden, also mit 
einer Schleife den Puffer durchgehen und senden.

Wenn du mit deiner Methode sendest, funktioniert es auch mit Werten bis 
256. Allerdings stehen diese dann nicht im Hyperterminal direkt als 
Zahl, sondern das Programm wandelt dann dein Zeichen in ein 
ASCII-Zeichen um (google mal nach einer ASCII-Tabelle, sende dann eine 
"108" und erfreue dich am auftauchenden Buchstaben)

Quarzoszillator hast du dran? Mit dem internen Takt kann es (sehr 
wahrscheinlich) mit dem UART Probleme geben.

von Michael K. (michael1104)


Lesenswert?

Hi,

die Übertragung funktioniert, aber er sendet alle Zahlen direkt 
nacheinander...Wie kriege ich da Zeilenumbrüche rein?? \n geht ja nicht 
;)

von ... (Gast)


Lesenswert?

> \n geht ja nicht

???
Warum sollte das nicht gehen ?
1
USART_Transmit('\n');

von Michael K. (michael1104)


Lesenswert?

Ok, geht doch... Aber wie kann ich das einbauen?

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.