www.mikrocontroller.net

Forum: Compiler & IDEs uart int ausgeben


Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht 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();
  }

}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So jedenfalls nicht ;)

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klappt nur irgendwie nicht...

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>klappt nur irgendwie nicht...

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

#define F_CPU 3686400

#include <avr/io.h>
#include <stdlib.h>

char buffer[5]; // 16-Bit => 4 Hexadezimalstellen + 1 Nullbyte

void USART_Init()
{
  UBRRH = 0;  /* 9600 Baud */
  UBRRL = 23;
  UCSRB = (1<<RXEN)|(1<<TXEN);
  /* 8 Datenbits, kein Parity Bit, ein Stoppbit */
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); 
}

void USART_Transmit(char c)
{
  while ( !( UCSRA & (1<<UDRE)) )
  {
  }
  UDR = c;
}

void io()
{
  DDRC = 0x00;
}

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

  while(1)
  {
    unsigned int x;
    char *s;

    // ADC Einlesen
    ADCSR = 0b11000101;           // ungeprüft, da zu kryptisch
    while (bit_is_set(ADCSR,6));  // ungeprüft, da zu kryptisch
    x = ADCW;

    // ADC Umwandeln in String einer 4-steligen Hexadezimalzahl
    s = buffer;
/*
siehe:
http://www.mikrocontroller.net/articles/FAQ#itoa.28.29
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#g4f6b3dd51c1f8519d5b8fce1dbf7a665
*/
    itoa(x, s, 16);

    // String ausgeben
    while (*s)
      USART_Transmit(*s++);

    // Zeilenvorschub und Wagenruecklauf
    USART_Transmit('\n');
    USART_Transmit('\r');
  }
}


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Umformen wäre ganz gut ;-)
char buffer[10];
int num=123;

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.

Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> \n geht ja nicht

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

Autor: Michael Kuehn (michael1104)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, geht doch... Aber wie kann ich das einbauen?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.