uart int ausgeben

OP #1081811
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();
  }

}
#1081820
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
Persönliche Seite #1081862
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
}
Gast #1081865
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.

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