mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RS232 -> Coputer


Autor: 56645156 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute,
habe eine Frage
wie bekomme ich es hin das ich unter dem AVR Terminal Zahlen und 
Buchstabe bekomme?
Ich Probiere grade grade damit einwenig rum aber bekomme es nicht hin:-(
bei 9600 Baudratebekomme ich nur &@ usw.
was kann ich da machen?

Autor: hdd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sendest du denn für Daten? Sind deine Zahlen auch wirklich 
ASCII-Werte?
Dein Sender steht auch auf 9600 Baud?

Wenn du Hilfe willst, dann liefer bitte mehr Infos (Code und ggf. 
Schaltung)

Autor: 56645156 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist das Beispiel SerilleKommunikation aus dem Buch AVR-RISC 
Emebedded Software selbst enwickeln
/*
  Serielle Kommunikation 
  Einfacher Befehlsinterpreter

  ATMEGA8/16/32 und kompatibel
  STK500 mit dem STK500 Oszillator (3.68 MHz)
  Baudrate: 9600 (8N1)

  Roman Mittermayr
  AVRBUCH.DE  
*/

#include <avr/io.h>
#include <string.h> // Für "strcmp"
#include <stdlib.h> // Für "itoa"


#define  TAKT      3680000
#define UART_BAUDRATE  9600



// Berechnung der Konfigurationsparameter
#define UART_SETTING  ((TAKT/16L/UART_BAUDRATE)-1)


void setup_uart()
{
  /* Baudrate einstellen */
  UBRRH = (char) (UART_SETTING >> 8);
  UBRRL = (char) (UART_SETTING);

  /* Empfänger und Sender einschalten */
  UCSRB = (1<<RXEN) | (1<<TXEN);

  /* Asynchron, 8N1 */
  UCSRC = (1<<URSEL) | (3<<UCSZ0);
}

void uart_putchar(char c)
{
  // Warten bis Buffer bereit ...
  while (!(UCSRA & (1 << UDRE)))
    ;

  // Senden...
  UDR = c;
}

void uart_putstring(char *str)
{
  unsigned char i;

  for (i=0;i<255;i++) /* Maximal 255 Zeichen ausgeben ... */
  {
    if (str[i] != 0)
      uart_putchar(str[i]);
    else
      break; // Ende des Strings erreicht
  }
}

char uart_getchar()
{
  // Ist schon ein Zeichen im Buffer?
  if (bit_is_set(UCSRA, RXC))
    return UDR;
  else 
    return -1;
}

void uart_readline(char *str)
{
  char c;
  unsigned char index;
  
  index = 0;

  while (1)
  {
    c = uart_getchar();
    if (c != -1)
    {
      if (c == 13) /* ASCII: NewLine */
      {
        /* Ende der Zeile erreicht,
           also String abschließen */
        str[index] = 0;

        /* Funktion beenden */
        return;
      }
      else /* Normales Zeichen, anhängen an die Zeichenkette */
      {
        str[index] = c;
        index++;
      }
    }
  }
}

int main(void)
{
  char kommando[255];
  char temp[10];
  unsigned char zahl=0;

  /* RS232 einschalten ... */
  setup_uart();

  /* Willkommensnachricht senden ... */
  uart_putstring("AVRBUCH.DE - Serielle Kommunikation gestartet ...\r\n\r\n");

  while (1)
  {
    /* Auf komplettes Kommando warten ... */
    uart_readline(kommando);

    /* Welcher Befehl wurde geschickt? ============ */

    /* ==== BEFEHL: "version" */
    if (strcmp(kommando, "version")==0)
    {
      uart_putstring("OK: Version 1.00\r\n");
    }

    /* ==== BEFEHL: "up" */
    else if (strcmp(kommando, "up")==0)
    {
      if (zahl<255)
      {
        zahl++;
        uart_putstring("OK: Zahl wurde erhoeht\r\n");
      }
      else
        uart_putstring("ERROR: Maximum erreicht (Zahl=255)\r\n");
    }

    /* ==== BEFEHL: "down" */
    else if (strcmp(kommando, "down")==0)
    {
      if (zahl>0)
      {
        zahl--;
        uart_putstring("OK: Zahl wurde verringert\r\n");
      }
      else
        uart_putstring("ERROR: Minimum erreicht (Zahl=0)\r\n");
    }

    /* ==== BEFEHL: "show" */
    else if (strcmp(kommando, "show")==0)
    {
      itoa(zahl, temp, 10);
      uart_putstring("OK: Zahl = ");
      uart_putstring(temp);
      uart_putstring("\r\n");
    }
  }

  return 0;
}
Es ist ein ATMege 16
reicht das oder braucht Ihr mehr?
Wäre sehr nett wenn Ihr mir Helfen würdet

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es ist ein ATMege 16

Werkfrisch (1 MHz) oder bereits auf die 3.68 MHz Taktrate des STK500 
Oszillators gefust?

Autor: 56645156 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist gebraucht kann ich also nicht sagen
andere sachen laufen ohne probleme nur da hab ich probleme bei

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ist gebraucht kann ich also nicht sagen

Lies die Fuses aus und dann kannst du es sagen.

Autor: 56645156 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok kann ich jetzt sagen ist 1MHz

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das erklärt die UART Probleme. Also ist Umfusen angesagt. Die Anleitung 
zum STK500 hilft dabei vermutlich weiter.

Autor: Neuhier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wer oder was ist ein Coputer?

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreibfehlerbruder vom Computer

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.