Forum: Mikrocontroller und Digitale Elektronik Messkette: Wo ist der Fehler?


von Julian K. (Gast)


Lesenswert?

Hallo verehrte Forumsmitglieder,

Schema Messkette:
Mikrofonn--> AT90USB1287--> USB-UART-Brücke--> PC--> VCP--> Tera Term.

ich habe ein Problem mit der Messkette. Des Mikrocontrollers C-Code habe 
ich mit Atmel Flip (Atmel Flip 3.4.7) geflasht. Dazu habe ich mir ein 
ein Tutorial im Internet angesehen. Das müsste auch richtig geklappt 
haben.

Die Einstellung für den UART im C-Code stimmen mit den Einstellungen im 
Terminalprogramm Tera Term überein. Baudrate 9600, Wortlänge=8 Bit, 
Stop- und Paritybit entsprechen Standardeinstellungen.

Den Virtuellen-Com-Port habe ich installiert, d.h. die USB-UART-Brücke 
wird vom PC anerkannt. Der C-Code ist definitiv korrekt.

Ich weiß echt nicht worin jetzt noch das Problem besteht. Könnte es 
sein, dass ich beim flashen einen Fehler gemacht habe, oder ich einen 
Fehler beim Terminalprogramm gemacht habe.

Könnt ihr mir bitte noch Hinweise geben, was falsch sein könnte, denn 
ich habe keine Ideen mehr, wo ich den Fehler noch suchen soll.

Wäre euch sehr dankbar, wenn wir mein Problem zusammen beheben.
Julian

von lalala (Gast)


Lesenswert?

Was ist VCP?

von Julian K. (Gast)


Lesenswert?

Virtueller Com Port

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Julian K. schrieb:
> Ich weiß echt nicht worin jetzt noch das Problem besteht

Ja, was ist Dein Problem? Was soll passieren?

von oszi40 (Gast)


Lesenswert?

Julian K. schrieb:
> d.h. die USB-UART-Brücke
> wird vom PC anerkannt. Der C-Code ist definitiv korrekt.

Ob da jeder Befehl duchgeht? Kannst Du eine Gegenprobe machen oder mal 
nachsehen was Dein Termial so liefert?

von Julian K. (Gast)


Lesenswert?

Ihr habt Recht: ich habe die Lage nicht vollständig beschrieben.

Ich habe ein Mikrofon. Ich möchte, dass das Spannungssignal am 
Terminalprogramm ausgelesen wird, wenn ich z.B. in das Mikrofon 
hineinspreche.

Mein Terminalprogramm liefer eben nichts. Genau das ist das Problem.

oszi40 schrieb:
> Kannst Du eine Gegenprobe machen oder mal
> nachsehen was Dein Termial so liefert?

Was meinst du mit Gegenprobe machen?

von Dennis R. (dennis_ec) Flattr this


Lesenswert?

Am mega tx und rx brücken und schauen ob ein echo zurück kommt

von Julian K. (Gast)


Lesenswert?

Die Gegenprobe, d.h. die Brücke zwischen TX und RX an der 
USB-UART-Brücke, erfolgreich durchgeführt. Tippe ich einen beliebigen 
Buchstaben auf der Tastatur ein, wird mir dieser am Terminal ausgegeben.

von Julian K. (Gast)


Lesenswert?

Was sagt mir das? Das bedeutet doch nur, dass die USB-UART-Brücke und 
das Terminalprogramm funktionieren. Wenigstens das.

von H.Joachim S. (crazyhorse)


Lesenswert?

Dann geh doch mal systematisch ran.
Erstmal kann man beim Start vom MC-Programm ein paar Byte ausspucken.

printf ("Hallo hier das Mikro V1.0");

Dann weiss man schonmal, ob UART-Einstellungen und Sendeverbindungen 
korrekt sind.
Das einfache Echo (kurzschliessen) kann man erweitern mit einem 
Winzprogramm mit getchar/putchar, also das ankommende Byte wieder 
verschicken.

Geht  das, klappt die Verbindung in beiden Richtungen. Und dann musst du 
dich eben um die Messwerterfassung/Verarbeitung/Sendung kümmern.

von Julian K. (Gast)


Lesenswert?

H.Joachim Seifert schrieb:
> Erstmal kann man beim Start vom MC-Programm ein paar Byte ausspucken.

Danke, dass hört sich echt gut an. Das probier ich doch gleich mal aus.

H.Joachim Seifert schrieb:
> Das einfache Echo (kurzschliessen) kann man erweitern mit einem
> Winzprogramm mit getchar/putchar, also das ankommende Byte wieder
> verschicken.

Das verstehe ich nicht ganz. Könntest du das vlt. ein bisschen genauer 
erklären.

von Conny G. (conny_g)


Lesenswert?

Julian K. schrieb:
> H.Joachim Seifert schrieb:
>> Erstmal kann man beim Start vom MC-Programm ein paar Byte ausspucken.
>
> Danke, dass hört sich echt gut an. Das probier ich doch gleich mal aus.
>
> H.Joachim Seifert schrieb:
>> Das einfache Echo (kurzschliessen) kann man erweitern mit einem
>> Winzprogramm mit getchar/putchar, also das ankommende Byte wieder
>> verschicken.
>
> Das verstehe ich nicht ganz. Könntest du das vlt. ein bisschen genauer
> erklären.

Vorher hast Du es vor dem uC überbrückt.
Jetzt schickst Du im uC gleich wieder zurück, was Du empfängst.

von Julian K. (Gast)


Lesenswert?

Tatsächlich, mein Terminalprogramm zeigt zwar noch nichts an. Dafür 
flimmert das Lämpchen beim RC wie verrückt. Auch wenn das noch nicht die 
endgültige Lösung ist, schon Mal danke für die Hilfe bis hierher.

von Julian K. (Gast)


Lesenswert?

Hallo verehrte Forummitglieder,

ich bin dem Rat nachgegangen eine String in den C-Code direkt über die 
UART des AT90USB1287 und über die USB-UART-Brücke an Tera Term zu 
verschicken. Das Lämpchen der RX der USB-UART-Brücke flimmert unentwegt. 
Doch trotzdem wird mir der String bei Tera Term nicht angezeigt. Könnt 
ihr bitte mal bitte den Code überprüfen?!

#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#define F_CPU 1000000
#define BAUD 9600
#include <util/setbaud.h>

void USART_Konfig(void)
{
  UBRR1H |= (UBRRH_VALUE) ;
  UBRR1L |= (UBRRL_VALUE) ;
  UCSR1C = (1<< UCSZ11) | (1<< UCSZ10);
  UCSR1B = (1<<TXEN1);
}


void usart_putc ( unsigned char c)
{
  while (UCSR1A != (UDRE1)) {}
  UDR1=c;

  while (UCSR1A != (UDRE1)) {}
        UDR1='\r';

  while (UCSR1A != (UDRE1)) {}
  UDR1='\n';
}

void usart_puts (char *s)
{
  while (*s !='\0') {usart_putc (*s); s++;}
}


int main(void)
{

  DDRD |= (1<<PD3);

  char s[6]="ABC";

  USART_Konfig();

  usart_puts (s);

  return 0;
}

Falls der Code stimmt, dann verstehe ich wirklich nicht, warum Tera Term 
den Strin "ABC" nicht anzeigt. Baudrate, Stopbit, Paritybit und 
Wortlänge stimmen mit dem Code überein. Was mache ich falsch? Könnte es 
sein, dass ich bei Tera Term versäumt habe irgendetwas wichtig 
einzustellen, weil es mir unbekannt ist?

Ich weiß jeden Rat zu schätzen.
FG Julian

von Dennis R. (dennis_ec) Flattr this


Lesenswert?

Was verwendest du als taktquelle für den AVR?
F_cpu sagt 1Mhz ist das Wirklich so?

Fuses stimmen?

Der interne RC oszi ist ungeeignet jedoch sollte dann wenigstens mist 
ankommen.

von Julian K. (Gast)


Lesenswert?

@ Dennis R.:

Oh, das könnte das Prboblem sein.

http://shop.in-circuit.de/data/datasheet/610000163A_AT90USB1287-Evalboard.pdf

Gemäß dem Datenblatt verfügt das uControllerboard einen Oszillator mir 
16 MHz. Da checke ich gleich mal die Fuses.

Danke!

von Kaj (Gast)


Lesenswert?

Julian K. schrieb:
> Tera Term
Versuch mal HTerm. Es gab hier schon so einige Threads, wo die Leute 
fehler gesucht haben, und am schluss lag es nur am Terminalprogramm 
(unter anderem auch Tera Term). Ich würd erstmal Tera Term gegen HTerm 
tauschen!

von H.Joachim S. (crazyhorse)


Lesenswert?

Naja, dem Compiler gesagte und tatsächliche Frequenz sollte schon 
übereinstimmen :-)
Es gibt da meist auch noch eine DIV/8-fuse, auch zu beachten.

Aber warum machst du das nicht direkt über USB?  Das ist der Gründe, 
warum man MCs mit USB überhaupt einsetzt. Gibt ne Menge fertige Software 
dafür.

von Conny G. (conny_g)


Lesenswert?

Julian K. schrieb:
>
> void usart_putc ( unsigned char c)
> {
>   while (UCSR1A != (UDRE1)) {}
>   UDR1=c;
>
>   while (UCSR1A != (UDRE1)) {}
>         UDR1='\r';
>
>   while (UCSR1A != (UDRE1)) {}
>   UDR1='\n';
> }

Hier stimmt was nicht.

1. muss das heißen:

while( ! (UCSR1A & ( 1<<UDRE1 ) ) )

2. Weshalb \r\n nach jedem einzelnen Zeichen?
Das ist kein "Bug", aber unnötig.

von Julian K. (Gast)


Lesenswert?

Okay, ich habe mal im Datenblatt nachgesehen.

Ich muss also zuerst CLKSEL [0:3] auf 0 einstellen, damit der MC mit dem 
externen Oszillator schwingt.

Danach sollte ich noch

CLKPCE = (0<<CLKPS3)|(1<<CLKPS2)|(0<<CLKPS1)|(1<<CLKPS0)

--> Prescaler = 16

,damit die sich die Taktfrequenz des CPU von 16 MHz auf 1 MHz einstellt. 
Das müsste doch alles gewesen sein? Nicht wahr?

Muss ich außerdem noch die CLKDIV auf 1 stellen oder entfällt das, weil 
das MC-Board einen externen Schwinger verwendet?

Kann ich die Fuses CLKSEL [0:3] irgendwie in meinem C-Code setzten oder 
muss ich dafür ein Programm wie Ponyprog2000 verwenden?

@ Kai: Sollte nach dem Setzen der Fuses das Datenausleden mit TeraTerm 
immer noch nicht funktioniere, dann wechsel ich auf jeden Fall das 
Terminalprogramm. Da


@ H.Joachim Seifert:
H.Joachim Seifert schrieb:
> Aber warum machst du das nicht direkt über USB?  Das ist der Gründe,
> warum man MCs mit USB überhaupt einsetzt. Gibt ne Menge fertige Software
> dafür.

Ich dachte, weil ich dafür einen JTAG Programmer und eine 
selbstgeschrieben Firmware bräuchte. Ich habe da einfach einen fernen 
Bekannten vertraut, da ich am Anfang von dem Projekt kaum Ahnung hatte. 
Ich habe zwar etwas dazugelernt, aber ich habe noch mehr als genug 
Schwachstellen, zum Teil fehlen mir einfach nur die Grundlagen, was 
MC-Programmierung und das Verständnis für MC angeht. Da kann man sich 
einfach nur freuen, dass es hier ein solche kompetente Community gibt, 
die einem weiterhilft. Kaum vorstellbar, dass es eine andere Webseite 
gibt, wo soviel Know-How auf einem Punkt konzentriert ist.

Also herzlichen Dank bis hierher.

von Dennis R. (dennis_ec) Flattr this


Lesenswert?

Du musst F_cpu auf 16mhz einstellen und die fuse auf takt extern per 
quarz , les dich da ein erst, sonst ist er verfused und du kommst nicht 
mehr drann.

Desweiteren nutz am besten eine uart routine die fertig ist , eliminiert 
mögliche fehlerquellen.

Diese haben eigentlich alle Prototyp funktionen die die einstellung der 
register für die baudrate automatisch vornehmen, schau mal im AVR-GCC 
tutorial nach.

Da das ein fertig modul ist tippe ich fast darauf das die fuses richtig 
stehen,

Versuch erstmal F_CPU auf 1600000 zu setzen und die register für die 
baudrate anzupassen, kopier dir den teil aus dem bem beispiel :

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART

: Bearbeitet durch User
von Easylife (Gast)


Lesenswert?

was ist das für eine usb-uart brücke? ftdi? sind die handshakeleitungen 
cts und rts mit pulldowns beschaltet?

von Achim (Gast)


Lesenswert?

Mal eine Blöde Frage, hast du vllt. RX und TX vertauscht?

Ich weiß grad nicht, wie sich die LEDs bei so einem USB-Serial Wandler 
verhalten, wenn die Daten in die falsche Richtung "fließen". Aber unter 
Umständen leuchten die dann ja auch.

von Conny G. (conny_g)


Lesenswert?

Und?

von Julian K. (Gast)


Lesenswert?

Hallo Leute,

sry, dass ich erst jetzt antworte. Hatte wegen der Familie und Arbeit in 
der letzten Woche kein Zeit mich mit meiner Messkette zu beschäftigen.

@ Dennis R.:

Dennis R. schrieb:
> Du musst F_cpu auf 16mhz einstellen und die fuse auf takt extern per
> quarz , les dich da ein erst, sonst ist er verfused und du kommst nicht
> mehr drann.

Das habe ich versucht, d.h. F_CPU auf 16 MHz eingestellt. Das hat leider 
nicht geklappt.

Außerdem habe ich meinen Code mit jeweils F_CPU= 16 MHz, 8 MHz, 4 MHz 
und 1 MHz geschrieben. Jedes Mal mit einem Mini_USB - USB- Kabel und 
Atmelflip auf den AT90USB1287 geflasht. Allerdings hat es bei keinen 
dieser Einstellung funktioniert.

Zudem habe ich eine bemerkenswerte Tatsache entdeckt: Jedes Mal, wenn 
ich den uC flashe, dann blinkt der RX der USB-UART-Brücke 
ununterbrochen. Das aber nur dann, wenn das Mini_USB-USB-Kabel zwischen 
dem uC und dem PC angeschlossen ist. Ziehe ich das Kabel ab, dann hört 
das Lämpchen auf zu flimmern. Wie deutet ihr dieses Verhalten?

So wie ich das einschätze, bedeutet das soviel wie, dass die 
Kommunikation  so läuft:

Mini_USB_Kabel--> uC--> USB-UART-Brücke (ohne Kommunikation zum PC mit 
Hilfe von TeraTerm)

anstatt

geflashter uC --> USB-UART-Brücke --> PC (Tera Term) kommuniziert.

Dennis R. schrieb:
> Desweiteren nutz am besten eine uart routine die fertig ist , eliminiert
> mögliche fehlerquellen.
>
> Diese haben eigentlich alle Prototyp funktionen die die einstellung der
> register für die baudrate automatisch vornehmen, schau mal im AVR-GCC
> tutorial nach

Diese Funtion habe ich doch schon übernommen wie oben im Code zu sehen 
ist.  Ich hoffe ich habe deine beiden Aussagen richtig verstanden.

Easylife schrieb:
> was ist das für eine usb-uart brücke?

Hier der Link:
http://shop.in-circuit.de/pages/27/Schnittstellenmodule

Achim schrieb:
> Hast du vllt. RX und TX vertauscht?

Ausgeschlossen.

Ich arbeite mich gerade in die Thematik Fuse-Setzung ein (Will ja nichts 
verfusen). Ich wollte zuerst mittels PonyProg 2.7 durch 
Learning-by-doing machen. Allerdings kann Pony Prog den AT90USB1287 
nicht ansteuern. Jedenfalls habe ich den AT90USB1287 nicht im 
Verzeichnis von Pony Prog gefunden. Deshalb versuche ich es jetzt mit 
AVRDude.

Julian

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.