www.mikrocontroller.net

Forum: Compiler & IDEs Neuling fragt: ADC und USART?


Autor: Shoutian Huang (teamsha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tag Jungs,
brauche eure Hilfe. Alle Tipps sind herzlich willkommen. Man bedankt 
sich.
Habe vor, ein paar Werte einzulesen und dann an PC zur Weiterbearbeitung 
zu schicken.
Eine abgespeckte Version ist im Anhang.
Bitte schaut euch das an und sagt mir wo ich die Fehler gemacht habe. Da 
sind sicherlich viele. Also alle bitte mal rein schauen.

Vielen Dank

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also alle bitte mal rein schauen.

Wo rein?

Autor: Shoutian Huang (teamsha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe noch mal Mist gebaut.
richtige Version ist unten.

Danke.


# include <avr/io.h>
# include <math.h>
# include <stdlib.h>
# include <stdint.h>
  uint8_t qvi;
  uint8_t pi;
  uint8_t ti;

int main (void)
  {
  ADCSRA |= (1<<ADEN | 1<<ADPS2 | 1<<ADPS1);
  ADMUX |= (1<<REFS1 | 1<<REFS0 | 1<<ADLAR);
  ADCSRA |= (1<<ADSC);
      while ((ADCSRA  & (1<<ADSC)))
        {
        qvi=ADCH;
        }
    ADMUX |= (1<<MUX0);
    ADCSRA |= (1<<ADSC);
      while ((ADCSRA  & (1<<ADSC)))
        {
        pi=ADCH;
        }
    ADMUX |= (1<<MUX1);
    ADCSRA |= (1<<ADSC);
      while ((ADCSRA  & (1<<ADSC)))
        {
        ti=ADCH;
        }

    UBRRH = 0;                          //Baud Rate bei 2MHz 2400
    UBRRL = 51;                          //siehe Tabelle
    UCSRB = (1<<TXEN);                      // nur senden
    UCSRC = (1<<URSEL) | (1<<USBS) | (3<<UCSZ0);        // 8 bits, 2 
Stop bits

    while (!(UCSRA & (1<<UDRE)))
    {}
    UDR = qvi;
    while (!(UCSRA & (1<<UDRE)))
    {}
    UDR = pi;
    while (!(UCSRA & (1<<UDRE)))
    {}
    UDR = ti;
    return 0;                // Herzlichen Dank!!
  }

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du uns jetzt noch sagst, was denn nu das Problem
mit diesem Code ist, dann würden wir auch wissen wonach
wir den Code durchstöbern könnten.

Funktioniert die USART nicht?
Kriegst du seltsame Messwerte?
Oder was?

Autor: Shoutian Huang (teamsha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal vielne Dank für deinen Hinweis. Hab nicht daran gedacht.

Code wird ohne Fehler compiliert. (AVR Studio 4)

Diese Werte sollen bei Visual Basic ankommen und bearbeitet werden.
Ich bekomme aber keinen Wert an Seriellem Port von PC.

Kann mir vielleich jemand sagen, wo ich die Werte sonst noch am PC 
finde.
Nicht mal das weiß ich. Hilfe...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Shoutian Huang wrote:

> Diese Werte sollen bei Visual Basic ankommen und bearbeitet werden.
> Ich bekomme aber keinen Wert an Seriellem Port von PC.
>
> Kann mir vielleich jemand sagen, wo ich die Werte sonst noch am PC
> finde.
> Nicht mal das weiß ich. Hilfe...

Serieller Port ist schon ok.

Aber in deiner Konfiguration gibt es erst mal eine Unmenge
an möglichen Fehlerquellen.

Also heist es erst mal abspecken und eine einfachere Variante
des Programms schreiben um Fehler eingrenzen zu können:
#include <avr/io.h>

int main (void)
{
  UBRRH = 0;                          //Baud Rate bei 2MHz 2400
  UBRRL = 51;                          //siehe Tabelle
  UCSRB = (1<<TXEN);                      // nur senden
  UCSRC = (1<<URSEL) | (1<<USBS) | (3<<UCSZ0);        // 8 bits, 2 Stop bits

  while( 1 ) {
    while (!(UCSRA & (1<<UDRE)))
    {}
    UDR = 'x';
  }
}

Das sendet laufend ein 'x' über die Serielle Schnittstelle.
Anstatt mit VB hängst du dich jetzt erst mal mit Hyperterminal
(oder einem anderen Terminalprogramm) an die serielle Schnittstelle
und siehst zu, ob da die 'x' alle auftauchen.

Mögliche Fehlerquellen
* Das Kabel könnte verkehrt rum sein.
  Anstelle von gekreuzt ist es nicht gekreuzt oder umgekehrt
* Deine 2Mhz klingen verdächtig
  Ohne einen externen Quarz ist eine USART Verbindung ein
  Glücksspiel. Falls das wirklich ein 2 Mhz Quarz ist, solltest
  du mal einen Baudratenquarz in Erwägung ziehen.
  Bei 2Mhz wird die UART Taktrate einen Fehler aufweisen.
  Ich habe jetzt nicht nachgerechnet, aber wenn der Fehler über
  3% liegt, dann wird die UART nicht funktionieren.
* Alles mögliche sonstige:
  Mit einem Voltmeter mal das Signal auf deinem µC Bord verfolgen
  und nachsehen ob es am Kabel richtig hineingeht, bzw. am anderen
  Kabelende wieder richtig herauskommt. Daher auch die Endlosschleife
  beim Senden.

Wenn du mehr weist, dann melde dich nochmal. Aber im Moment gibt
es einfach zuviele Fehlermöglichkeiten als dass man dir sinnvoll
helfen könnte.

Autor: Shoutian Huang (teamsha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für deine Hilfe. Ich probiere es aus.

Die Angabe von 2 Mhz habe ich vertan. 16MHz ist es. Kommentar entstand 
vor einer Woche.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Shoutian Huang

> 16MHz
> UBRRL = 51;
> UCSRC = (1<<URSEL) | (1<<USBS) | (3<<UCSZ0); // 8N2

Serielle Schnittstelle am PC muss also auf 19200 Baud (8N2, ist aber 
ungewöhnicher Wert, gängiger ist 8N1...) eingestellt sein. Ist das so?

Stimmt das Visual Basic Programm? Wenn du da unsicher bist, nimm ein 
fertiges Terminalprogramm. Wenn du ASCII-Zeichen erwartest (Vorschlag 
von Karl heinz Buchegger( reicht Hyperterminal von Windows. Wenn du 
beliebige Zeichen erwartest (so wie dein µC Programm sie sendet), nimm 
ein Terminal mit Hex-Anzeige 
(http://www.mikrocontroller.net/articles/RS-232#Windows)

Nebengefechtsschauplatz: Du solltest deine Arbeitsanweisungen in eine 
Endlosschleife packen, so wie es Karl heinz Buchegger mit der while(1) 
Schleife macht. main darf bei µCs nicht zurückkehren (Wohin auch? Direkt 
in den Reset?).

Autor: Shoutian Huang (teamsha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan and Karl

Vielen Dank für die wertvollen Tipps.
Werde mich anstrengen, in die Materie einzuarbeiten.

Erlaubt mir bitte, dass ich euch noch mal kontaktiere.

Danke.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hindert dich? Schreib doch einfach deine Fragen HIER (ins Forum) 
hin. Vielleicht haben andere ähnliche Fragen oder jemand kennt bessere 
Antworten als ich.

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.