Serielle Übertragung gelingt nicht mit 7,3728 MHz Quarz und Atmega8

Hallo Leute, ich bin der Neue und komme öfter :slight_smile:

Kleine Vorstellung:

Erfahrung mit Mikrocontrollern hab ich schon länger. Hab in den 2000ern Motorsteuergeräte umprogrammiert, usw.
Jugendsünden halt.;D

Programmieren tue ich nur C und C angelehnte Sprachen, also PHP, Javascript, JAVA c# usw.

Assembler Erfahrung habe ich kaum.

Bin ein Kind der DDR und naja das reicht als Vorstellung denke ich.

Nun zum Problem:

Wie es der Titel schon Anmerkt bekomme ich keine Serielle Verbindung zu Stande zwischen einem Atemga8 und dem PC.
Am PC hängt ein USB zu TTL Adapter mit cp_ irgendwas Chip.
Nutze ich den internen 8MHz takt, dann funktioniert alles prima.
Nehme ich aber einen externen Baudratenquarz (7,3728 MHz), kommt nur Kyrillische Keilschrift an.

Programmieren tue ich in der ArduinoIDE 1.8.8 und als Programmer nutze ich den USBasp.
Als hardware package habe ich den MicroCore heruntergeladen

Die Einstellung ist wie folgt:
-Clock: “8MHz external”
-BOD disabed
-LTO disabled
-Bootloader Ja.

Danach bin ich auf Bootloader brennen gegangen und dann auf Hochladen mit Programmer.

Es geht nicht, es kommen nur kryptische Symbole in der Konsole.

Ich bin dann noch ein Schritt weiter gegangen und habe die fuses mit dem STK500 Programmiert unter Atmel Studio 7.
Bei SUT_CSEL bin ich alle Ext.Crystal/Resonator Medium Frequency Punkte durch, habe sogar mal High Frequency probiert.

Nix es kommt nach wie vor nur Keilschrift an.

F_CPU ist gesetzt auf 7372800L

Was mir nun aufgefallen ist, das wenn ich auf Binärdatei exportieren gehe steht in der Ausgabe:
avr/bin/avr-gcc -c -g -x assembler-with-cpp -mmcu=atmega8 -DF_CPU=8000000L -DARDUINO=10808 -DARDUINO_AVR_ATmega8 -DARDUINO_ARCH_AVR

DF_CPU ist immer das was ich in dem Menü ausgewählt habe.

Überschreibt der Compiler etwa mein define F_CPU beim compiliren?

Als Kondensatoren habe ich leider keine 22pF gegen GND sondern nur 20pF. Fällt das ins Gewicht?

Beim STK500 habe ich nur die Datei ohne bootloader gebrannt.

Hier der code:

/*

  • Low Frequency ist bis 1Mhz, Medium ist bis 8Mhz und High über 8Mhz, also
    bis 16 oder 20.

*/

#include <Arduino.h>

#ifdef F_CPU
#undef F_CPU
#define F_CPU 7372800L//L = long UL = unsigned long
#endif

void setup() {
Serial.begin(9600);
}

void loop() {
String inStr = “”;

Serial.println(“dies ist ein Test”);

while (Serial.available()) {
inStr = Serial.readString();// read the incoming data as string
}
if (inStr != “”) {
Serial.println(inStr);
}
}

Ähm wie macht man hier Code Tags?? :roll_eyes:

Danke im voraus.

Hi

[*code] … ein Code … [/*code] (nur ohne die )
… oder Du klickst links auf </
> - da kommen die Code-Tags ‘von Selber’.

Was mir direkt ins Auge springt: Du definierst F_CPU NUR, wenn Diese zuvor schon definiert war.
Deine Definition ist IM #ifdef Block, wenn zuvor nicht definiert, wird der komplette Block ignoroert!

MfG

Hallo,

nimm das F_CPU im Sketch raus und ändere es in der

C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt

bzw. lege dir dort eine neuen Eintrag an.

Wenn ich fragen darf wofür der Baudratenquarz? Welche exotischen Baudraten benötigst du?

postmaster-ino:
… oder Du klickst links auf </*> - da kommen die Code-Tags ‘von Selber’.

Ach da ganz links, dass hab ich nicht gesehen :o

postmaster-ino:
wenn zuvor nicht definiert, wird der komplette Block ignoroert!

Ich hatte das #ifdef zuerst nicht, da ging es auch nicht. Oder ich hatte mit mit dem Fuses verhaspelt.
das #ifdef habe ich erst aus Verzweiflung hingemacht.

Doc_Arduino:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt

bzw. lege dir dort eine neuen Eintrag an.

Wenn ich fragen darf wofür der Baudratenquarz? Welche exotischen Baudraten benötigst du?

boards.txt → Linux bitte. :slightly_frowning_face:

Aber ja, so weit war ich auch schon mal. Da kam dann beim Starten eine Fehlermeldung irgendwas mit menü…ich weiß es nicht mehr genau.

Ich brauch keine exotischen Baudraten, sondern exotische Entfernungen. ich möchte 2 MCU’s 15 Meter miteinander verbinden. Bei 9600Baud eventuell eine Zacke weniger.

Und nicht nur dass, der Mega 8 brutzelt drausen bei Wind und wetter rum und er hängt an einer Antenne. Wenn da noch gesendet wird (WSJT) weiß ich ohnehin noch nicht was passiert. Deswegen sollte es schon möglichst genau funktionieren.

Also am #ifdef block liegt es nicht.
SUT_CSEL steht auf Ext. Crystal/Resonator Medium Frequency; Startup time 16k ck +64ms

Wäre da nicht ein serielles Protokoll besser, dass mehr Power auf die Leitung gibt, als TTL-Serial?
z.B. RS232 oder RS485

Gruß Tommy

Hallo,

der Baudratenfehler mit 8MHz ist bei 2400/4800/9600 und 14400 +0,2%. Das ist praktisch uninteressant.
Dazu kommt, wenn das zwischen 2 AVR passiert, tritt der Fehler bei beiden auf und ist damit 0, die reale Baudrate ist denn eben ein paar Bit/s höher.

Mach eben RS485 oder RS232 zwischen dem AVR und geschirmte Leitung und packe den in eine Blechbüchse als Abschirmung und mach alles HF-dicht enug, wenn die Sendeleistung höher sein sollte.

PS: Hallo Tommy56... :wink:

Gruß aus Berlin
Michael

Ich brauch keine exotischen Baudraten, sondern exotische Entfernungen.

Du willst eine exotische Taktfrequenz.

Das ist nicht schlimm....
Du musst nur eine eigene Boarddefinition schreiben, oder eine vorhandene modifizieren.

Dabei kann ich dir helfen.

Aber du darfst nicht "gegen" den Builder kämpfen.
Den Kampf verlierst du. (spätestens beim nächsten Update)
Dabei helfe ich nicht.

Ich habe das Problem nun mittlerweile gefunden.
Es ist wie Doc_Arduino sagt, f_cpu in der boards.txt angepasst und es rennt. :smiley:

Wenn aber eh nur das f_cpu in der boards.txt eine Rolle spielt da brauch ich das Makro ja gar nicht zu setzen im Quelltext. Oder etwa Doch?

Meine es bringt mich nicht um #define F_CPU 7372800L zu schreiben, aber ist es nicht ein wenig sinnlos wenn das Makro überschrieben wird?

Ich hätte es ja noch eingesehen wenn das Problem aufgetrennten wär wenn ich mit der ArduinoIDE den MCU gebrannt hätte. Habe ich aber nicht, ich habe die hex Datei auf ein Windows Rechner kopiert und dort mit dem STK500 gebrannt.

Tommy56:
Wäre da nicht ein serielles Protokoll besser, dass mehr Power auf die Leitung gibt, als TTL-Serial?
z.B. RS232 oder RS485

Ja, kommt danach.

combie:
Aber du darfst nicht “gegen” den Builder kämpfen.
Den Kampf verlierst du. (spätestens beim nächsten Update)

inwiefern Builder?

inwiefern Builder?

Hier
Dazu gehört natürlich auch die Verwaltung der Taktfrequenz.

Hallo,

hättest du eher gefragt hättest du dir das mit dem Baudratenquarz sparen können. Es steht jedem frei die Baudrate zu ändern. Damit der Baudratenfehler 0,0% ist nimmt man ganze Vielfache vom µC Takt. Mehr ist das nicht. Siehe Tabelle. Kannst auch andere Vielfache nehmen. Hauptsache es sind immer Ganzzahlen.

Du kannst dir auch mit Makros helfen um Tippfehler o.ä. abzufangen.
Änderst nur noch die Baudrate. Die Fehlergrenzen kannste auch enger setzen. Wie du lustig bist.

// UART Berechnungen des Wertes für das Baudratenregister aus Taktrate und gewünschter Baudrate
#define BAUDRATE 9600UL                             // gewünschte Baudrate
#define VAL ((F_CPU+BAUDRATE*8)/(BAUDRATE*16)-1)    // sauber runden
#define BAUD_REAL (F_CPU/(16*(VAL+1)))              // reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUDRATE)      // Fehler in Promille, 1000 = kein Fehler.
#if ((BAUD_ERROR<995) || (BAUD_ERROR>1005))
#error "Systematischer Fehler der Baudrate groesser 0,5% und damit zu hoch!"
#endif

void setup(void) {
  Serial.begin(BAUDRATE);
  Serial.println(F_CPU);
  Serial.println(BAUDRATE);
}

void loop(void) {
  
}

Wenn aber eh nur das f_cpu in der boards.txt eine Rolle spielt da brauch ich das Makro ja gar nicht zu setzen im Quelltext. Oder etwa Doch?

Die Antwort kennst du bestimmt selbst.

Dazu kommt, wenn das zwischen 2 AVR passiert, tritt der Fehler bei beiden auf und ist damit 0, die reale Baudrate ist denn eben ein paar Bit/s höher.

Das stimmt so allgemein nicht ganz. Man weiß nicht welche Taktabweichung alle Beteiligten selbst haben. Wenn alle einen Quarz statt Resonator haben, ja dann kann man davon ausgehen. Zur Not kann man noch die syncrone Übertragung verwenden. Allgemein würde ich immer wert auf einen möglichst geringen systematischen Baudratenfehler legen. Dann klappt auch in der Regel der Rest wenn die Verbindung okay ist.

Baudraten_vs_Takt.png

Baudraten_vs_Takt.png

Sketches are compiled by avr-gcc and avr-g++ according to the variables in the boards.txt file of the selected board's platform.

@combi, ich mache das ja nun auch schon länger aber auf der github Seite von Arduino war ich tatsächlich noch nie :blush:

@Doc_Arduino, nette Tabelle.

Ich bin erst mal bedient, eine guten Rutsch wünsche ich allen beteiligten.