Forum: Mikrocontroller und Digitale Elektronik Testfunktion im myAVR Work Pad


von P. F. (pfuhsy)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich benutze das mySmart USB MK2, Atmega32L und myAVR Work Pad und 
versuche über UART Zeichen zu senden. Als Verbindung vom µC zum PC, 
verwende ich UART und das als Progammer verwendete mySmart USB MK2. Mein 
Test-Code sieht so aus :
1
//----------------------------------------------------------------------
2
// Titel       : myAVR Beispiel "UART Senden" für den ATmega32
3
//----------------------------------------------------------------------
4
// Funktion    : sendet den String "Hallo Welt" per RS232 an PC
5
// Schaltung   : PC und AVR-Board mit Null-Modemkabel verbinden
6
//----------------------------------------------------------------------
7
// Prozessor   : ATmega32
8
// Takt       : 3.6864 MHz
9
// Sprache     : C
10
// Datum      : 11.07.2007
11
// Version     : 1.0
12
// Autor       : S.
13
// Programmer  : ...
14
// Port       : ...
15
//----------------------------------------------------------------------
16
#define F_CPU 3686400
17
#include <avr\io.h>
18
//----------------------------------------------------------------------
19
void initUART()
20
{
21
  UBRRL  = 23;           //9600Baud siehe Baudratentabelle
22
  UCSRB = 0x08;           //Sender enable UCSRB / UCR bei z.B.: 2313
23
}
24
//----------------------------------------------------------------------
25
void putChar(char data)
26
{
27
  //warte bis UDR leer ist UCSRA / USR bei z.B.: 2313
28
  while (!(UCSRA&32));
29
  //sende
30
  UDR=data;
31
}
32
//----------------------------------------------------------------------
33
void print(char buffer[])
34
{
35
  for (int i=0;buffer[i]!=0;i++)
36
    putChar(buffer[i]);
37
}
38
//----------------------------------------------------------------------
39
main ()
40
{
41
  initUART();
42
  while (true) // Mainloop
43
  {
44
    print("Hallo myAVR! ");
45
  }
46
}
47
//----------------------------------------------------------------------

Wenn ich jetzt ich die Testfunktion der Software benutze, scheint der µC 
wirklich Zeichen zu senden. Egal welche Einstellungen ich an der 
Baud-rate änder, die zeichen ändern sich zwar bleiben jedoch immer 
Hieroglypohen.

Was mache ich falsch ???


Gruss
Peter

von holger (Gast)


Lesenswert?

>Was mache ich falsch ???

Ein

#define F_CPU 3686400

Stellt noch lange nicht den Takt für die CPU ein.
Dazu müsstest du die Fuses auf Crystal Osc. oder so
ähnlich einstellen.

Versuch doch mal

#define F_CPU 1000000

Das ist der Takt mit dem dein uC wahrscheinlich läuft.

von P. F. (pfuhsy)


Angehängte Dateien:

Lesenswert?

Das habe ich auch schon alles probiert, ohne Erfolg. Nur mit den Fuses 
habe ich das noch nicht so ganz begriffen. Was muss ich denn das 
umstellen ? Unter Crystal Osc hab ich 30 unterschiedliche zur Auswahl.

Gruss

von P. F. (pfuhsy)


Lesenswert?

Ach noch was... ich benutze doch ein ATmega 32L, und laut Datenblatt 
kann der doch nur 8 MHz oder ? Also, wenn ich jetzt genau 1 MHz 
benutzten möchte, und im Code "#define F_CPU 1000000" schreibe, was muss 
ich noch tun damit der µC auch wirklich mit den Takt läuft ?

Gruss

von Michael S. (Firma: electro-tester) (michael0307)


Lesenswert?

Hallo,

hast/musst Du nicht den MK2 auf "UART-Bridge" stellen?

Techn. Beschreibung lesen!(Seite 8)

>>>http://www.myavr.info/download/produkte/mysmartusb_mk2/techb_mysmartusb-mk2_de_en.pdf

Grüße...

von Karl H. (kbuchegg)


Lesenswert?

Peter F. schrieb:
> Das habe ich auch schon alles probiert, ohne Erfolg. Nur mit den Fuses
> habe ich das noch nicht so ganz begriffen. Was muss ich denn das
> umstellen ? Unter Crystal Osc hab ich 30 unterschiedliche zur Auswahl.


Wenn du dir die Tabelle mal genauer ansiehst, dann merkst du dass die 
vielen Varianten nur dadurch entstehen, dass das alle möglichen 
Kombinationen von 3 Werten sind

  *  low Frequency / middle Frequency / high Frequency

  * STartup Time, wobei die wieder in ein paar Möglichkeiten
    für die Takte und eine fixe Zeit zerfällt.


Im Datenblatt zum Mega32 findet sich eine Tabelle, bis zu welcher 
Frequenz low, niddle und high anzusehen sind. Wobei das nicht ganz so 
kritisch ist. 3.6Mhz kann man schon die High Einstellung nehmen.

Und für die Startup Zeit: da nimmst du einfach die längste.

von Karl H. (kbuchegg)


Lesenswert?

Peter F. schrieb:
> Ach noch was... ich benutze doch ein ATmega 32L, und laut Datenblatt
> kann der doch nur 8 MHz oder ? Also, wenn ich jetzt genau 1 MHz
> benutzten möchte, und im Code "#define F_CPU 1000000" schreibe, was muss
> ich noch tun damit der µC auch wirklich mit den Takt läuft ?

Gar nix.
Atmel liefert seine Prozessoren so aus, dass jeder mit dem internen Takt 
auf 1Mhz kommt. Nur ist der nicht besonders genau. Wenn du einen Quarz 
am Board hast, solltest du den auch aktivieren.

von P. F. (pfuhsy)


Lesenswert?

Tut mir leid, ich kapier das nicht.

Also ich hab ein Atmega32L (8 MHz !), was muss ich denn jetzt genau 
einstellen, damit das UART auch das richtige ausgibt.
1
#define F_CPU ?????
2
...
3
UBRRL  = ?????;     //23 = 9600 Baud bei 3,6864 MHz lt. SiSy-Hilfe

Und bei den Fuses, gibt es 30 verschiedene Einstellungen, Int. RC Osc., 
Ext. RC OSC., Ext. Low-Freq., Ext. Crystal/Resonator ???????

Ausprobieren geht ja wohl schlecht, des wegen funktioniert der 
Controller jetzt auch nicht mehr.


Gruss
Peter

von P. F. (pfuhsy)


Lesenswert?

Peter F. schrieb:
> Ausprobieren geht ja wohl schlecht, des wegen funktioniert der
> Controller jetzt auch nicht mehr.

Ok, der Controller geht wieder. Hab mit einen anderen Controller eine 
Frequenz auf XTAL1 gelegt und die Fuses reset. Die Fragen bleiben 
trotzdem offen.

Bitte helft mir.

Gruss
Peter

von Karl H. (kbuchegg)


Lesenswert?

Peter F. schrieb:
> Tut mir leid, ich kapier das nicht.
>
> Also ich hab ein Atmega32L (8 MHz !),

das wichtigste zuerst.
Läuft der auch mit 8Mhz?
Hast du das getestet?

> was muss ich denn jetzt genau
> einstellen, damit das UART auch das richtige ausgibt.
>
> #define F_CPU ?????

Wenn dein µC mit 8Mhz läuft, dann logischerweise 8000000.
Du willst ja schliesslich deinen Compiler nicht anlügen

> ...
> UBRRL  = ?????;     //23 = 9600 Baud bei 3,6864 MHz lt. SiSy-Hilfe

Das lässt du den Compiler ausrechnen, was da rein muss.
Im AVR-GCC-Tutorial findest du Code für die UART.
Dort kannst du dir ansehen, wie das gemacht wird, so dass der Compiler 
die meiste Arbeit erledigt.

Aber: Dazu MUSS dein Mega auch wirklich mit 8Mhz laufen!
Nur weil du bei F_CPU 8Mhz reinschreibst, tut er das nicht!

>
> Und bei den Fuses, gibt es 30 verschiedene Einstellungen, Int. RC Osc.,
> Ext. RC OSC., Ext. Low-Freq., Ext. Crystal/Resonator ???????
>
> Ausprobieren geht ja wohl schlecht, des wegen funktioniert der
> Controller jetzt auch nicht mehr.

Bischen nachdenken?

Was hast du?
Hast du einen Quarz?
Oder hast du einen Quarzoszillator?
Oder hast du extern ein RC_Glied drann?

Also reduziert sich deine Tabelle schon mal gewaltig.

Weiter oben hab ich dir gesagt, dass man bei 3.6Mhz laut Datenblatt 
durchaus schon High-Frequency benutzen kann.

Und schon reduziert sich das Angebot schon wieder enorm

Und dann kannst du auch noch die längste Startup Zeit einstellen.

Und wieder reduziert sich das Angebot.

Ooops. Jetz bleibt nur noch 1 Möglichkeit übrig

> Ausprobieren geht ja wohl schlecht, des wegen funktioniert der
> Controller jetzt auch nicht mehr.

Irgendwann muss man mal ins kalte Wasser springen und schwimmen lernen.


http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

von P. F. (pfuhsy)


Lesenswert?

Hallo Karl heinz,

danke dür die Infos.

Vorab schonmal, ich habs gestern abend doch noch hinbekommen anständige 
Zeichen aus dem UART zu lesen, aber leider nur mit einem interen Takt 
und der entsprechenden UBRRL. Um den Wert für UBRRL zu errechenen habe 
ich mich eines kleinen Tools im Internet bedient, der mir die 
Einstellung je nach Frequenz anzeigt. Den extern beschalteten Quarz hab 
ich nicht zum laufen bekommen.

Karl heinz Buchegger schrieb:
> Läuft der auch mit 8Mhz?
> Hast du das getestet?
Mit 1 Mhz, läuft er. Ein Programm das die Ports toggeln lässt und mit 
LED anzeigt, zeigt es.

Karl heinz Buchegger schrieb:
> Wenn dein µC mit 8Mhz läuft, dann logischerweise 8000000.
> Du willst ja schliesslich deinen Compiler nicht anlügen
Den #define F_CPU brauche ich aber nur, wenn ich den Wert für UBRRL 
ausrechnen lasse, richtig ?

Karl heinz Buchegger schrieb:
> Das lässt du den Compiler ausrechnen, was da rein muss
Wie gesagt, hab ich erstmal nen festen Wert in UBRRL eingetragen, die 
Ausrechnunggeschichte werde ich mir jetzt auch zur Brust nehmen.

Karl heinz Buchegger schrieb:
> Bischen nachdenken?
>
> Was hast du?
> Hast du einen Quarz?
> Oder hast du einen Quarzoszillator?
> Oder hast du extern ein RC_Glied drann?
Stimmt, wo finde ich das im Datenblatt.

Karl heinz Buchegger schrieb:
> Und dann kannst du auch noch die längste Startup Zeit einstellen.
Was sagt die Startup Zeit aus ? Verzögerung oder wie soll ich das 
verstehen.

Karl heinz Buchegger schrieb:
> Irgendwann muss man mal ins kalte Wasser springen und schwimmen lernen.
Das Problem ist, wenn ich was falsches einstelle kann es passieren, dass 
ich den Controller gar nicht mehr programmieren kann, deswegen ist auch 
mit ausprobieren schlecht, es sei denn ich hab eine ganze LKW-Ladung 
davon. Aber jetzt weiß ich ja wie ich den doch wieder ansprechen kann 
und hoffe, dass das ganze bei den anderen falschen Einstellungen auch so 
einfach geht.

Gruss

von dreilira (Gast)


Lesenswert?

Hallo Peter,
die Sache stellt sich am Anfang viel verwirrender dar, wie sie ist.

Zuerstmal zu den Fuses: Solange Du nicht Reset abschältst, kommst Du 
immer wieder an den uC dran. Hast ja selbst schon einen ext. Take 
angelegt. Der mysmart USB kann den Takt auch liefern, Beschreibung hab 
ich irgendwo auf myavr.de gefunden. Ich hab die Doku leider zuhause, 
"Recovery" war glaub ich das Stichwort.

Ok, nächste Thema ust F_CPU. Im Prozessor läuft der internen R-C auf 
8MHz, das wird über den Prescaler durch 8 geteilt. Letztlich kommen dann 
für den Prozessor 1 MHz raus. Wenn Du ein 24MHz ext. Quarz anschließt, 
und nur die Fuses umstellst auf ext. Quarz, dann läuft die Kiste mit 
3MHz.Wenn Du dann noch den Prescaler auf 1:1 setzt, kommen 24 MHz 
zusammen. Es ist also ein Zusammenspiel aus Taktquelle, Frequenz der 
Quelle und Prescaler/Vorteiler.

Die Boot-Time ist tatsächlich eine Wartezeit, bei PowerOn wird erstmal 
nix gemacht, bis sich die Elektronik eingespielt hat. Solange Du nichts 
hyper-zeitkritisches unternimmst, bist Du mit der höchsten BootUp-Time 
gut beraten. (Ok, frag jetzt aber nicht, wenn er schon erst einschwingen 
muß, wie er dann genau ermittelt, wann 64ms rum sind)

Wichtig ist dann noch der Unterschied Quarz zu Quarz-Oszillator. Das 
Quarz ist eine Blechkiste mit 2 Pins, der Q-Osc eine größere Kiste mit 4 
Pins. Letztlich sind im Q-Osc. gleich die Kondensatoren mit drin, soweit 
ich weiß sind die auch etwas genauer.

Gruß
Ralf

von P. F. (pfuhsy)


Lesenswert?

Hallo,

dreilira schrieb:
> Der mysmart USB kann den Takt auch liefern, Beschreibung hab
> ich irgendwo auf myavr.de gefunden.
Du meinst den myMultiBoard MK2, soviel ich weiß kann der mySmart USB MK2 
das nicht, hab mich gestern noch schlau gemacht.

dreilira schrieb:
> Prescaler
Denn hab ich bei mir nicht. Wenn dann würde ich Ihn im Code sehen, nicht 
in den Fuses, richtig ?

dreilira schrieb:
> Es ist also ein Zusammenspiel aus Taktquelle, Frequenz der
> Quelle und Prescaler/Vorteiler
Achso, ich glaube ich hab das jetzt geschnallt, jetzt muss ich das ganze 
nur noch in der Hardware umsetzten. Ich hab das jetzt so verstanden:

1. Wenn ich in den Fuses einen interen Takt 1Mhz einstelle, läuft der µC 
mit ca. 1Mhz, egal ob ich einen Quarz an XTAL1 und XTAL 2 anschliessen.
Ob im Code jetzt noch '#define F_OSC 8000000' steht, spielt dabei keine 
Rolle.

2. Wenn ich in den Fuses ein externen Quarz von 6Mhz einstelle, erwartet 
der µC eine externe Beschaltung um auf die 6Mhz zukommen. Ob im Code 
jetzt wieder '#define F_OSC 8000000' steht, spielt dabei auch keine 
Rolle.

3. Mit dem Vorteiler kann ich den Takt dann im Code nochmal reduzieren.

Hab ich das soweit richtig verstanden ?


dreilira schrieb:
> Das
> Quarz ist eine Blechkiste mit 2 Pins, der Q-Osc eine größere Kiste mit 4
> Pins.
Das hab ich auch mittlerweile auch heraus gefunden, danke.


Danke für die Hilfe.



Gruss

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.