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


von Shoutian H. (teamsha)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Also alle bitte mal rein schauen.

Wo rein?

von Shoutian H. (teamsha)


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!!
  }

von Karl H. (kbuchegg)


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?

von Shoutian H. (teamsha)


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...

von Karl H. (kbuchegg)


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:
1
#include <avr/io.h>
2
3
int main (void)
4
{
5
  UBRRH = 0;                          //Baud Rate bei 2MHz 2400
6
  UBRRL = 51;                          //siehe Tabelle
7
  UCSRB = (1<<TXEN);                      // nur senden
8
  UCSRC = (1<<URSEL) | (1<<USBS) | (3<<UCSZ0);        // 8 bits, 2 Stop bits
9
10
  while( 1 ) {
11
    while (!(UCSRA & (1<<UDRE)))
12
    {}
13
    UDR = 'x';
14
  }
15
}

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.

von Shoutian H. (teamsha)


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.

von Stefan B. (stefan) Benutzerseite


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?).

von Shoutian H. (teamsha)


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.

von Stefan B. (stefan) Benutzerseite


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.

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.