Forum: Mikrocontroller und Digitale Elektronik ATmega328PB: UART(MC) empfängt falsche Daten


von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

Guten Tag,

das ist mein erster Beitrag auf diesem Forum, darum entschuldigt, wenn 
der Post nicht ganz vollständig ist. Ich arbeite gerade an einem 
Programm, dessen Ziel es ist, Daten vom PC über den UART fehlerfrei zu 
übertragen. Der UART im groben funktioniert, ich kann Daten an den 
Mikrokontroller schicken. Allerdings kommen die Fehler immer falsch an, 
un zwar systematisch. Schicke ich ein Carriage Return 
('\r'=0x0D=0b00001101), erhalte ich ein Y (=0x79=0b01111001). Schicke 
ich einen Zeilenumbruch ('\n'=0x0A=0b00001010) kommt ein 
Gleichheitszeichen (=0x3D=0b00111101) am MC an.
Was am MC ankommt habe ich mit dem folgenden Programm kontrolliert:

#define F_CPU 16000000L/*Taktfrequenz_ATmega328PB*/
#define Baud 19200L/*_Baudrate->Bitrate/s->seriell*/
#define UBRR_Wert ((F_CPU/(16*Baud))-1)/*_Berechungen*/
#define Baud_Rundung ((F_CPU+8*Baud)/(16*Baud)-1)
#define Baud_Real (F_CPU/(16*(Baud_Rundung+1)))
#define Baud_Fehler ((Baud_Real*1000)/Baud)
#if ((Baud_Fehler<990)||(Baud_Fehler>1010))/*_Sicherung*/
#error Die_Datenuebertragungsgeschwindigkeit_ist_um_+-1%_zu_hoch/niedrig
#endif

#include <avr/io.h>
#include <avr/interrupt.h>/*Ermoeglichung_Interrupts*/
#include <util/delay.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>

volatile char byte=0;/*datenbyte_fuer_RX*/
volatile uint8_t flag=0;

void Morsen(void)
{
  PORTB&=(~(1 << PORTB5));/*LED1_an->Signal_Morse_-_Start*/
  for(uint8_t i=0; i<8; 
i++)/*Shiften_Byte_um_alle_8_Byte->Pruefung:Fokus_letztes_Bit*/
  {
    if (byte & 0x80)/*Pruefung_Bit_an_Stelle_0*/
    {
      PORTB &=~ (1 << PORTB4);/*D2_Ein->1*/
      _delay_ms(500);
      PORTB|=(1<<PORTB4);
      _delay_ms(500);
    }

    else
    {
      PORTB&=~(1<<PORTB3);
      _delay_ms(500);
      PORTB|=(1<<PORTB3);
      _delay_ms(500);
    }
    byte <<= 1;/*shiften_1_nach_rechts->neues_0._Bit*/
  }
  PORTB |= (1 << PORTB5);/*LED1_aus->Ende_Byte*/
  _delay_ms(500);
  flag=0;

}

int main(void)
{
  sei();
  UCSR0A&=~(1<<FE0);/*kein_Frame_-_Fehler*/
  UCSR0A&=~(1<<DOR0);/*kein_Data_-_Overrun*/
  UCSR0A&=~(1<<U2X0);/*keine_doppelte_Uebertragungsgeschwindigkeit*/
  UCSR0A&=~(1<<MPCM0);/*keine_Multi_-_Prozessor_-_Kommunikation*/
  UCSR0B|=(1<<RXCIE0);/*RX_-_Interrupt*/
  UCSR0B&=~(1<<TXCIE0);/*kein_TX_-_Interrupt*/
  UCSR0B&=~(1<<UDRIE0);/*kein_UDRE_-_Interrupt*/
  UCSR0B|=(1<<RXEN0);/*Receiver*/
  UCSR0B&=~(1<<TXEN0);/*kein_Transmitter*/
  UCSR0B&=~(1<<UCSZ02);/*data_bit=8->[2:0]=011*/
  UCSR0B&=~(1<<RXB80);/*kein_9._Datenbit_empfangen*/
  UCSR0B&=~(1<<TXB80);/*kein_9._Datenbit_senden*/
  UCSR0C&=~(1<<UMSEL01);/*asynchroner_Modus*/
  UCSR0C&=~(1<<UMSEL00);
  UCSR0C&=~(1<<UPM01);/*keine_Paritaet*/
  UCSR0C&=~(1<<UPM00);/*kein_UPE(UCSR0A)-Flag*/
  UCSR0C&=~(1<<USBS0);/*ein_Stoppbit*/
  UCSR0C|=(1<<UCSZ01);/*8_Datenbits*/
  UCSR0C|=(1<<UCSZ02);
  UCSR0C&=~(1<<UCPOL0);/*keine_Abstimmung_Bitstelle_-_Clock*/
  UCSR0D&=~(1<<RXSIE);/*kein_Start_-_Interrupt*/
  UCSR0D&=~(1<<RXS);/*kein_Startbit_Interrupt*/
  UCSR0D|=(1<<SFDE);/*Ueberwachung_Startbit*/
  UBRR0H=Baud_Rundung>>8;/*Baud=_Bitrate->19,2kBit/s*/
  UBRR0L=Baud_Rundung&0xFF;

  DDRB=0xFF;/*PORTB->alles_Ausgaenge*/
  PORTB=0xFF; /*alle_Ausgaenge=1->Dioden_aus*/
  while (1)
  {
    if(flag)/*Morsen_UDR_von_Anfang_an*/
    Morsen();
  }
}

ISR(USART0_RX_vect)
{
  byte=UDR0;/*speicherung_UDR0->Beendigung_ISR*/
  flag=1;/*Morsen*/
}

Aus dem Programm lassen sich alle Einstellungen für den UART und 
RXCIE-Interrupt vor der main-Schleife und in der main-Schleife ablesen.
Mein Mikrokontroller ist ein ATmega328PB mit zwei UARTs, ich benutze als 
Entwicklungsumgebung AtmelStudio7 als Terminalprogramm HTerm. Die 
Baudrate bei HTerm und im MC ist 19,2 kbps (seriell).
Ein bisschen habe ich im Forum schon nach Lösungen für das Problem 
gesucht, aber weder ein zweites Stoppbit, noch ein Delay (in der 
while(1)) zur Synchronisation des MC auf das Start-Bit noch eine 
Überprüfung der Baudrate haben das Problem behoben.
Ich sitze an den Problem schon seit ein paar Tagen. Kann mir bitte 
jemand einen Tipp geben, wie ich das Problem der falsch empfangen Daten 
lösen kann?

Mit freundlichen Grüßen

Philipp

von S. Landolt (Gast)


Lesenswert?

> UCSR0C|=(1<<UCSZ02);

?
Damit wird UCSZ1 gesetzt, oder?

von Martin B. (Firma: BINE Automatentechnik ◔) (pac-man)


Lesenswert?

Philipp K. schrieb:
> Allerdings kommen die Fehler immer falsch an,

Dann passt ja alles...

Sorry, konnte nicht widerstehen. :)

von Wolfgang (Gast)


Lesenswert?

Philipp K. schrieb:
> Kann mir bitte jemand einen Tipp geben, wie ich das Problem der
> falsch empfangen Daten lösen kann?

Fehlt dir vielleicht ein Inverter?
Wie sind PC und µC miteinander verbunden?

von Stefan F. (Gast)


Lesenswert?

Bei Dir ist
1
UBRR0H = ((16000000L+8*19200L)/(16*19200L)-1)>>8     = 0
2
UBRR0L = ((16000000L+8*19200L)/(16*19200L)-1)&0xFF   = 51

Die Standard Bilbiothek <util/setbaud.h> berechnet die gleichen Werte, 
deswegen wird es daran nicht liegen. Läuft der Prozessor denn wirklich 
auf 16 MHz? Das könntest du mit einer Blink-LED im Sekundentakt testen.

von Stefan F. (Gast)


Lesenswert?

S. Landolt schrieb:
> Damit wird UCSZ1 gesetzt, oder?

Gute Frage.

UCSZ02 hat den Wert 2.

Ich würde auch gerne wissen, warum dieses Symbol für zwei 
unterschiedliche Register benutzt wird. Das passt nicht zur 
Registerbeschreibung im Datenblatt.

In UCSR0B befindet sich nur das Bit UCSZ02.
In UCSR0C befinden sich die Bits UCSZ00 und UCSZ01.
1
  UCSR0B&=~(1<<UCSZ02);  // hier gehört es hin
2
3
  UCSR0C|=(1<<UCSZ01);   // ok
4
  UCSR0C|=(1<<UCSZ02);   // das sollte sicher UCSZ00 heissen!

von S. Landolt (Gast)


Lesenswert?

Ja, ist aber leider nicht die Fehlerursache, die 1 vom Resetwert wird 
mit 1 überschrieben, und die Reset-1 von USCZ0 bleibt stehen. Ich habe 
mich täuschen lassen.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Diese Kombination ist "Reserved":
1
  UCSR0D&=~(1<<RXSIE);/*kein_Start_-_Interrupt*/
2
  UCSR0D&=~(1<<RXS);/*kein_Startbit_Interrupt*/
3
  UCSR0D|=(1<<SFDE);/*Ueberwachung_Startbit*/

von S. Landolt (Gast)


Lesenswert?

I'll be darned. Ich finde beim ATmega328PB kein UCSR0D - ist hier vom 
ATmega324PB die Rede?

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

Hallo, danke für die Antworten!

Ich arbeite mit einem ATmega328PB. Das UCSR0D-Register findet man unter 
dem Punkt 25.11.5 UART Controll Register and Status Register n D.

Wegen der Einstellung des UCSR0D: Anfangs habe ich auch gedacht, dass 
der Status "Reserved" ist. Zwar habe ich RXSIE aus, dafür aber RXCIE als 
RX-Interrupt und SFDE als Aktivator der Startbit-Überwachung an. Damit 
habe ich nur die Startbit_Überwachung an.

Ich prüfe gleich noch die anderen Vorschläge. Jeder Vorschlag hilft.

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

Wolfgang schrieb:
> Philipp K. schrieb:
>> Kann mir bitte jemand einen Tipp geben, wie ich das Problem der
>> falsch empfangen Daten lösen kann?
>
> Fehlt dir vielleicht ein Inverter?
> Wie sind PC und µC miteinander verbunden?

Einen Inverter habe ich tatsächlich nicht. Die Signale die ich bekomme 
sind augenscheinlich aber nicht einmal eine invertierte Variante der 
Ausgangssignale vom PC.
PC und Mikrokontroller verbinde ich mit einem USB-Kabel mit 
Mikro-USB-Ausgang, den UART des MC's mit einem 9-Poligen RS232-Kabel.

von c-hater (Gast)


Lesenswert?

Philipp K. schrieb:
> Hallo, danke für die Antworten!
>
> Ich arbeite mit einem ATmega328PB. Das UCSR0D-Register findet man unter
> dem Punkt 25.11.5 UART Controll Register and Status Register n D.

Sowas gibt es beim 328PB nicht. Jedenfalls nicht in dem DB von 
Microchip. Weder das Register, noch einen Abschnitt mit der genannten 
Nummer.

von S. Landolt (Gast)


Lesenswert?

Danke, c-hater, ich begann an meinem Verstand zu zweifeln.
  Hatte extra das aktuelle Datenblatt von Microchip heruntergeladen.

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

Stefan ⛄ F. schrieb:
> Bei Dir ist
>
1
> UBRR0H = ((16000000L+8*19200L)/(16*19200L)-1)>>8     = 0
2
> UBRR0L = ((16000000L+8*19200L)/(16*19200L)-1)&0xFF   = 51
3
>
>
> Die Standard Bilbiothek <util/setbaud.h> berechnet die gleichen Werte,
> deswegen wird es daran nicht liegen. Läuft der Prozessor denn wirklich
> auf 16 MHz? Das könntest du mit einer Blink-LED im Sekundentakt testen.

Ich habe eine LED im Sekundentakt blinken lassen. Ich habe die Zeit auf 
die Hunderstelsekunde genau auf 1 s messen können - allerdings mit der 
Handystoppuhr. Einen Oszi habe ich bei mir gerade nicht.
Allerdings ist mein MC mit 16 MHz geliefert worden und seit dem Erhalten 
habe ich an den Fusebits nicht geändert. Ich gehe von F_CPU=16MHz aus.

von HolgerT (Gast)


Lesenswert?

Philipp K. schrieb:
> PC und Mikrokontroller verbinde ich mit einem USB-Kabel mit
> Mikro-USB-Ausgang, den UART des MC's mit einem 9-Poligen RS232-Kabel.

Klingt für mich sehr verwirrend.

Richtig ist:

 PC --- USB/RS232wandler --- 9-pol-RS232-Kabel --- RS232/TTL-Wandler -- 
µC-UART

Der RS232/TTL-Wandler kann z.B. MAX232 o.ä sein.

Hast Du diesen Aufbau?

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

c-hater schrieb:
> Philipp K. schrieb:
>> Hallo, danke für die Antworten!
>>
>> Ich arbeite mit einem ATmega328PB. Das UCSR0D-Register findet man unter
>> dem Punkt 25.11.5 UART Controll Register and Status Register n D.
>
> Sowas gibt es beim 328PB nicht. Jedenfalls nicht in dem DB von
> Microchip. Weder das Register, noch einen Abschnitt mit der genannten
> Nummer.

Du hast Recht. Ich habe mich auf das Datenblatt 10/2015 gestützt. 
Allerdings ändert sich nichts am Problem, wenn ich UCSR0D rausnehme. 
Kennt ihr eine neuere Entsprechung / Verbesserung dafür?

von S. Landolt (Gast)


Lesenswert?

> an den Fusebits nicht geändert. Ich gehe von F_CPU=16MHz aus

Also nach dem aktuellen Datenblatt läuft der ATmega328PB, wie alle seine 
Geschwister, ab Werk mit 1 MHz.

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

HolgerT schrieb:
> Philipp K. schrieb:
>> PC und Mikrokontroller verbinde ich mit einem USB-Kabel mit
>> Mikro-USB-Ausgang, den UART des MC's mit einem 9-Poligen RS232-Kabel.
>
> Klingt für mich sehr verwirrend.
>
> Richtig ist:
>
>  PC --- USB/RS232wandler --- 9-pol-RS232-Kabel --- RS232/TTL-Wandler --
> µC-UART
>
> Der RS232/TTL-Wandler kann z.B. MAX232 o.ä sein.
>
> Hast Du diesen Aufbau?

Nein, diesen Aufbau habe ich so nicht. Mir fehlt der RS232/TTL-Wandler 
für die Pegelwandlung 15V zu 5V. Diesen werde ich noch hinzufügen 
müssen. Danke für den Hinweis!

von c-hater (Gast)


Lesenswert?

Philipp K. schrieb:

> Du hast Recht. Ich habe mich auf das Datenblatt 10/2015 gestützt.

Das ist spannend. Auch im entsprechenden Assembler-Includefile existiert 
das Register.

Naja, Microchip halt. Mit der Pflege der Datenblätter hatten sie es noch 
nie so richtig...

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

S. Landolt schrieb:
>> an den Fusebits nicht geändert. Ich gehe von F_CPU=16MHz aus
>
> Also nach dem aktuellen Datenblatt läuft der ATmega328PB, wie alle seine
> Geschwister, ab Werk mit 1 MHz.

Auf der Hochschule haben wir den Mikrokontroller für Timerinterrupt 
benutzt und dabei immer 16 MHz angenommen. Die Zeitmessung der 
LED-blink-Dauer über <util/delay.h> und _delay_ms war grob auch richtig. 
Ich beschäftige mich mal mit der Frequenz weiter.

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

> immer 16 MHz angenommen
Wie dem auch sei - laut Anhang laufen ab Werk 8 MHz, mit dem gesetzten 
CKDIV8 wird 1 MHz daraus.

von jo mei (Gast)


Lesenswert?

HolgerT schrieb:
> Richtig ist:
>
>  PC --- USB/RS232wandler --- 9-pol-RS232-Kabel --- RS232/TTL-Wandler --
> µC-UART

Was soll der Mist? Auf RS232 Pegel Wandeln braucht es nicht.

Ein USB zu TTL Serial reicht doch aus. So:

https://www.ebay.de/itm/FT232RL-3-3V-5-5V-FTDI-Mini-USB-to-TTL-Serial-UART-Adapter-Module-Cable-Ardu-ino/223727784480?hash=item3417371220:g:zcwAAOSwDF5d366w

Die ganze AVR- und Arduino-Welt arbeitet mit solchen Dingern und
sie haben noch nie was von RS232 Pegeln gehört weil es die nicht
braucht!

von Tatenblatt (Gast)


Lesenswert?

c-hater schrieb:
> Philipp K. schrieb:
>
>> Du hast Recht. Ich habe mich auf das Datenblatt 10/2015 gestützt.
>
> Das ist spannend. Auch im entsprechenden Assembler-Includefile existiert
> das Register.
>
> Naja, Microchip halt. Mit der Pflege der Datenblätter hatten sie es noch
> nie so richtig...


Soviel zu der hier gern gestellten blöden Frage:
"Was sagt denn das Datenblatt?!"

SCNR

von S. Landolt (Gast)


Lesenswert?

> Auf der Hochschule haben wir ... 16 MHz ...
Dann wurde ein fertig gekauftes Board mit Resonator oder Quarz benutzt, 
und die Fuses waren vom Hersteller entsprechend geändert worden.

von HolgerT (Gast)


Lesenswert?

jo mei schrieb:
> Die ganze AVR- und Arduino-Welt arbeitet mit solchen Dingern und
> sie haben noch nie was von RS232 Pegeln gehört weil es die nicht
> braucht!

Und warum spricht Philipp dann die ganze Zeit von RS232 und einem 
RS232-Kabel? Weil er vermutlich keinen USB-TTL, sondern einen 
USB-RS232-Wandler benutzt! Und dann muß er natürlich RS232->TTL wandeln. 
Und auf diesen Wandler wollte ich hinweisen. Punkt!

von Wolfgang (Gast)


Lesenswert?

Philipp K. schrieb:
> PC und Mikrokontroller verbinde ich mit einem USB-Kabel mit
> Mikro-USB-Ausgang, den UART des MC's mit einem 9-Poligen RS232-Kabel.

Der UART liefert kein RS232-Signal. Wie passiert bei dir genaue die 
Signalumsetzung vom USB-Signal bis zum RX/TX des ATmega328?

von Stefan F. (Gast)


Lesenswert?

S. Landolt schrieb:
> I'll be darned. Ich finde beim ATmega328PB kein UCSR0D - ist hier vom
> ATmega324PB die Rede?

Guck mal auf meinen Screenshot direkt über deinem Beitrag.

von Stefan F. (Gast)


Lesenswert?

Philipp K. schrieb:
> Wegen der Einstellung des UCSR0D: Anfangs habe ich auch gedacht, dass
> der Status "Reserved" ist. Zwar habe ich RXSIE aus, dafür aber RXCIE als
> RX-Interrupt und SFDE als Aktivator der Startbit-Überwachung an. Damit
> habe ich nur die Startbit_Überwachung an.

Ach wie gemein! Jetzt sehe ich auch dass die Tabelle unter den drei Bits 
sich nur auf zwei Bits davon bezieht.

von Stefan F. (Gast)


Lesenswert?

Philipp K. schrieb:
> den UART des MC's mit einem 9-Poligen RS232-Kabel.

RS232 hat invertierte Pegel. Der Ruhezustand (HIGH) ist -9V, 
dementsprechend ist LOW dann +9V. Wobei diede USB Adapter oft weniger 
Spannungshub liefern, als die ursprünglichen +/- 9V.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Ich hänge mal das Datenblatt an, welches das UCSR0D Register beschreibt. 
Das ist die letzte mir bekannte Fassung von Atmel.

Irgendwie habe ich das Gefühl, dass Microchip die Datenblätter im Laufe 
der Zeit immer kaputter macht.

von S. Landolt (Gast)


Lesenswert?

Das Verschwinden des UCSR0D ist nicht einmal in der 'Revision History' 
erkennbar. Und mir graust, wenn ich "• Change of document style" und "• 
New Microchip document number. Previous version was Atmel document 42397 
rev.C." lese.

von S. Landolt (Gast)


Lesenswert?

PS:
Da ich keinen ATmega328PB zum Ausprobieren habe, stellt sich mir nun die 
Frage: gibt es dieses Register tatsächlich, und erfüllt es seine 
Funktion?

von Stefan F. (Gast)


Lesenswert?

Es ist nicht das erste mal.

Wir (die Community hier) haben Microchip auch schon mal erwischt, ganze 
Absätze im neuen Style einfach von anderen AVR kopiert zu haben obwohl 
sie fachlich gegensätzliche Infos hatten (da ging es um die notwendige 
Reihenfolge bei Zugriffen auf 16 bit Register).

Und als sie die PIN-Diagramme im Arduino Style bunt machten, hatten sie 
auch einige Fehler eingebaut, wo es vorher richtig war.

von c-hater (Gast)


Lesenswert?

S. Landolt schrieb:

> Da ich keinen ATmega328PB zum Ausprobieren habe, stellt sich mir nun die
> Frage: gibt es dieses Register tatsächlich, und erfüllt es seine
> Funktion?

Also ich würde mal davon ausgehen, dass das ursprüngliche Atmel-DB die 
Realität korrekter abbildet, also dass es das Register tatsächlich gibt 
und es auch seinen Job tut.

Beweisen kann ich das derzeit nicht, weil ich ebenfalls keinen 328PB 
besitze. Aber wie Stefan F. schon korrekt anmerkte, ist das nicht der 
erste Fall, bei dem Microchip Atmel-DBs nachweislich kaputtredigiert 
hat.

Und aus meiner eigenen Erfahrung mit diversen PICs kann ich hinzufügen, 
dass die Mikrochip-Datenblätter schon länger grundsätzlich ziemlich 
Scheisse sind, weil sie viele Fehler enthalten (viel mehr als man es 
vergleichsweise damals bei Atmel gewohnt war) und außerdem ganz 
offensichtlich kein sauberes Versionsmanagement und nur relativ selten 
überhaupt ein Bugfixing dafür erfolgt. Sogar wenn wegen Änderungen der 
Hardware-Revision eine neue DB-Version erschien, wurden oftmals bereits 
bekannte und bestätigte Fehler in der Dokumentation nicht behoben.

von my2ct (Gast)


Lesenswert?

Philipp K. schrieb:
> Einen Oszi habe ich bei mir gerade nicht.

Ein Logiganalysator für ein paar Euro reicht völlig.  Häng dich damit 
auf die RX- und die TX-Leitung vom µC und sende einmal vom µC und einmal 
vom PC das selbe Zeichen und vergleiche.
Und zeige deinen Schaltplan. Sonst werden hier morgen noch irgendwelche 
Atmel Datenblätter von MicroChip diskutiert und deine Übertragung läuft 
trotzdem nicht.

von Philipp K. (Firma: keine) (philippw_k)


Angehängte Dateien:

Lesenswert?

S. Landolt schrieb:
>> immer 16 MHz angenommen
> Wie dem auch sei - laut Anhang laufen ab Werk 8 MHz, mit dem gesetzten
> CKDIV8 wird 1 MHz daraus.

Danke nochmal wegen deiner Beharrlichkeit zur Systemfrequenz:
Ich habe beim Device Programming in AS7 nochmal nachgeguckt wegen den 
Fusebits: CKDIV8 ist aktiv, genauso wie von CKSEL[3:0] der interne 
RC-Oszillator als Quelle ausgewählt ist.
Jetzt habe ich im aktuellen Datenblatt von 2018 nachgesehen. Bei 
F_CPU=1MHz hat der UART des MC eine Fehlerquote von 8,5%. Daher wollte 
ich die F_CPU auf 8MHz erhöhen wo die Fehlerquote niedriger ist und den 
CKDIV8-Fuse deaktivieren. Jetzt taucht aber der Fehler auf, dass die 
Device Signature nicht gefunden werden konnte. So kann ich die Fusebits 
nicht ändern. Wie kann man diesen Fehler beheben?

von Stefan F. (Gast)


Lesenswert?

Philipp K. schrieb:
> Ich habe beim Device Programming in AS7 nochmal nachgeguckt wegen den
> Fusebits: CKDIV8 ist aktiv

Wie kann das sein, du kannst die Fuses doch gar nicht auslesen!

> Daher wollte ich die F_CPU auf 8MHz erhöhen wo die Fehlerquote
> niedriger ist und den CKDIV8-Fuse deaktivieren. Jetzt taucht aber
> der Fehler auf, dass die Device Signature nicht gefunden werden konnte.

Dabei hast du wohl mehr als nur diese eine Fuse geändert. Vielleicht 
kommst du da noch raus, indem du eine externe Taktquelle an XTAL1 
anschließt. Wenn nicht, scheiß den Controller weg oder besorge Dir einen 
sogenannten "High Voltage" Programmer.

von Wolfgang (Gast)


Lesenswert?

Philipp K. schrieb:
> Danke nochmal wegen deiner Beharrlichkeit zur Systemfrequenz:
> Ich habe beim Device Programming in AS7 nochmal nachgeguckt wegen den
> Fusebits: CKDIV8 ist aktiv, genauso wie von CKSEL[3:0] der interne
> RC-Oszillator als Quelle ausgewählt ist.

War das Thema nicht schon lange erledigt?
Wenn die LED im Sekundentakt blinkt und das Programm so geschrieben ist, 
dass ein Sekundentakt rauskommen müsste, hat sich die Diskussion um den 
Systemtakt doch irgendwie erledigt, oder?

Philipp K. schrieb:
> Ich habe eine LED im Sekundentakt blinken lassen. Ich habe die Zeit auf
> die Hunderstelsekunde genau auf 1 s messen können - allerdings mit der
> Handystoppuhr.

von Philipp K. (Firma: keine) (philippw_k)


Angehängte Dateien:

Lesenswert?

my2ct schrieb:
> Philipp K. schrieb:
>> Einen Oszi habe ich bei mir gerade nicht.
>
> Ein Logiganalysator für ein paar Euro reicht völlig.  Häng dich damit
> auf die RX- und die TX-Leitung vom µC und sende einmal vom µC und einmal
> vom PC das selbe Zeichen und vergleiche.
> Und zeige deinen Schaltplan. Sonst werden hier morgen noch irgendwelche
> Atmel Datenblätter von MicroChip diskutiert und deine Übertragung läuft
> trotzdem nicht.

Anbei schicke ich den den Schaltplan plus ein Foto von dem richtigen 
Aufbau. Sicher fällt sofort der fehlende RS232-Wandler auf. Ich habe 
gestern noch schnell versucht im Laden den von Holger empfohlenen MAX233 
zu kaufen, kam aber ein paar Minuten nach der Ladenschließung an, sodass 
ich gerade keinen habe.

Um auf Wolfgang einzugehen: Ich schicke das Signal vom PC über HTerm hin 
zu einem RS232-Kabel, dass mit einem USB-Adapter an den PC angeschlossen 
ist. Dann schließe ich direkt, bisher ohne den TTL-Wandler, den TX des 
RS232-Kabels mit dem RX über ein Jumpwire zusammen. Gerade kommen 
+-9/+-12/+-15 V (unterschiedliche Angaben zum Pegel bei RS-Signal im 
Internet) am MC-UART an.

von Stefan F. (Gast)


Lesenswert?

Philipp K. schrieb:
> Sicher fällt sofort der fehlende RS232-Wandler auf.

Allerdings. Du kannst doch nicht einfach mit +/- 9V direkt auf den RxD 
Eingang des AVR gehen! Der ist jetzt mit hoher Wahrscheinlichkeit 
kaputt.

Abgesehen davon sind die Pegel bei RS232 invertiert.

> Gerade kommen +-9/+-12/+-15 V (unterschiedliche Angaben zum Pegel)

Wie wäre es mit Messen anstatt zu raten?

Nach der Nummer möchte ich meinen Vorschlag mit der Soundkarte zurück 
ziehen. Mach Dir deinen Laptop nicht kaputt.

Aber ich habe noch einen Kauftipp: Besorge Dir bei Aliexpress einen USB 
Isolator (https://de.aliexpress.com/item/33014611683.html) und einen 
USB-Hub mit eigenem Netzteil, damit du diese Sachen sicher an den Laptop 
anschließen kannst.

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

Stefan ⛄ F. schrieb:
> Philipp K. schrieb:
>> Ich habe beim Device Programming in AS7 nochmal nachgeguckt wegen den
>> Fusebits: CKDIV8 ist aktiv
>
> Wie kann das sein, du kannst die Fuses doch gar nicht auslesen!
>
>> Daher wollte ich die F_CPU auf 8MHz erhöhen wo die Fehlerquote
>> niedriger ist und den CKDIV8-Fuse deaktivieren. Jetzt taucht aber
>> der Fehler auf, dass die Device Signature nicht gefunden werden konnte.
>
> Dabei hast du wohl mehr als nur diese eine Fuse geändert. Vielleicht
> kommst du da noch raus, indem du eine externe Taktquelle an XTAL1
> anschließt. Wenn nicht, scheiß den Controller weg oder besorge Dir einen
> sogenannten "High Voltage" Programmer.

Ich kann dich beruhigen, der MC funktioniert noch. Gerade habe ich einen 
neues Programm für ein LED-Blinken daraufgeladen. Auf die Fuses kann ich 
über AS7->Device Programming->Fuse->LOW.CKDIV8->Programm zugreifen. Ich 
habe offenbar nichts verstellt, weil von vorein ich keine Device 
Signature erhalten habe.

von Wolfgang (Gast)


Lesenswert?

Philipp K. schrieb:
> Gerade kommen
> +-9/+-12/+-15 V (unterschiedliche Angaben zum Pegel bei RS-Signal im
> Internet) am MC-UART an.

Damit gehen zwei Dinge schief.
1. Der µC bekommt an seinem DIO negative Spannung, die nur durch die 
Schäche der Ladungspumpe im USB-RS232-Wandler begrenz ist und deshalb 
den µC wahrscheinlich nicht schädigt.
2. Die Signalpolarität der übertragenen seriellen Signale ist falsch. Es 
fehlt ein Inverter (s.o.)

Miss mal in deinem Aufbau mit einem Multimeter den Ruhepegel an RX und 
TX vom µC.

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

Wolfgang schrieb:
> Philipp K. schrieb:
>> Danke nochmal wegen deiner Beharrlichkeit zur Systemfrequenz:
>> Ich habe beim Device Programming in AS7 nochmal nachgeguckt wegen den
>> Fusebits: CKDIV8 ist aktiv, genauso wie von CKSEL[3:0] der interne
>> RC-Oszillator als Quelle ausgewählt ist.
>
> War das Thema nicht schon lange erledigt?
> Wenn die LED im Sekundentakt blinkt und das Programm so geschrieben ist,
> dass ein Sekundentakt rauskommen müsste, hat sich die Diskussion um den
> Systemtakt doch irgendwie erledigt, oder?
>
> Philipp K. schrieb:
>> Ich habe eine LED im Sekundentakt blinken lassen. Ich habe die Zeit auf
>> die Hunderstelsekunde genau auf 1 s messen können - allerdings mit der
>> Handystoppuhr.

Da hast Du recht. Ja, anderseits habe ich den internen RC-Oszillator als 
Taktgeber ausgewählt, der Fuse CKDIV8 ist offenbar auch gesetzt.
Auf der Hochschule haben wir allerdings nie externe Clocks angeschlossen 
und ich habe gerade den Kommilitonen gefragt, der uns die MC besorgt 
hat. Er meinte, er hätte die Standardversion gekauft.

von Wolfgang (Gast)


Lesenswert?

Philipp K. schrieb:
> Er meinte, er hätte die Standardversion gekauft.
Was auch immer auf der Standardversion drauf ist...
Auf einem Photo von der µC-Platine könnte man nachgucken, ob ein 
Quarz/Resonator oder gar nichts an den Oszillator-Pins des µCs hängt.

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

Wolfgang schrieb:
> Philipp K. schrieb:
>> Er meinte, er hätte die Standardversion gekauft.
> Was auch immer auf der Standardversion drauf ist...
> Auf einem Photo von der µC-Platine könnte man nachgucken, ob ein
> Quarz/Resonator oder gar nichts an den Oszillator-Pins des µCs hängt.

Ich habe mir bei Freunden ein Multimeter besorgt und den Ruhezustand von 
RX TX am MC gemessen. U(RX)=0,14V, U(TX)=0,01V.
Außerdem haben wir die Platine 
XplainedMini(http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega328P-Xplained-Mini-UG-DS50002659B.pdf) 
auf die Oszilator-Pins (PB6,PB7) geprüft. Der User-Guide besagt, dass 
eine 16MHz-Clock des Debuggers an den Clockinput-Pin des MC 
angeschlossen ist.

von c-hater (Gast)


Lesenswert?

Philipp K. schrieb:

> Der User-Guide besagt, dass
> eine 16MHz-Clock des Debuggers an den Clockinput-Pin des MC
> angeschlossen ist.

Selbst wenn das tatsächlich so wäre (was ich nicht glaube): Das 
interessiert allerdings den µc kein bissel, jedenfalls solange nicht 
auch die Fuses so gesetzt sind, dass er diesen Takt benutzt. Und wenn 
sie so gesetzt sind, dann wird das Target nur laufen, solange der 
Debugger angeschlossen ist...

Eben deshalb glaube ich das nicht. Es ergibt praktisch keinerlei Sinn.

von spess53 (Gast)


Lesenswert?

Hi

>Außerdem haben wir die Platine
>XplainedMini(http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega328P-Xplained-Mini-UG-DS50002659B.pdf)
>auf die Oszilator-Pins (PB6,PB7) geprüft.

Was hat der ATMega328PB mit dem Controller auf dem XPLAIN-Board zu tun?

MfG Spess

von Stefan F. (Gast)


Lesenswert?

Philipp K. schrieb:
> Ich habe mir bei Freunden ein Multimeter besorgt und den Ruhezustand von
> RX TX am MC gemessen. U(RX)=0,14V, U(TX)=0,01V.

Tx müsste im Ruhezustand HIGH Pegel (5V) haben. Ein deutliches Zeichen 
dafür, dass entweder dein Programm den Pin nicht korrekt initialisiert 
hat oder dass der Pin kaputt ist.

Eingänge (Rx) haben keine definierten Pegel, solange keine Signalquelle 
angeschlossen ist. Deine gemessenen 0,14V sind daher plausibel aber auch 
wenig aussagekräftig.

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

c-hater schrieb:
> Philipp K. schrieb:
>
>> Der User-Guide besagt, dass
>> eine 16MHz-Clock des Debuggers an den Clockinput-Pin des MC
>> angeschlossen ist.
>
> Selbst wenn das tatsächlich so wäre (was ich nicht glaube): Das
> interessiert allerdings den µc kein bissel, jedenfalls solange nicht
> auch die Fuses so gesetzt sind, dass er diesen Takt benutzt. Und wenn
> sie so gesetzt sind, dann wird das Target nur laufen, solange der
> Debugger angeschlossen ist...
>
> Eben deshalb glaube ich das nicht. Es ergibt praktisch keinerlei Sinn.

Soweit ich den User-Guide richtig verstanden habe, funtioniert der 
Debugger nur, wenn die mEDBG-Frequenz und die F_CPU gleich sind. Die 
Frequenz des Debuggers liegt bei mir wegen der Schaltung eines kleinen 
Widerstandes nahe dem Anschluss Pin für die externe Clock bei 
F_Debugger=16MHz. Soweit ich das richtig verstanden habe, müssen für 
einen funktionierenden Debugger dessen Clock (die offenbar auf der 
Platine angebaut ist) und die F_CPU gleich groß sein. Mein Debugger 
arbeitet, also muss meine F_CPU=16MHz groß sein (ein abschließender 
Beweis für mich). Ansonsten ja, der Mikrokontroller arbeitet auch ohne 
aktiven Debugger die geladenen Programme ab.

von Philipp K. (Firma: keine) (philippw_k)


Angehängte Dateien:

Lesenswert?

Wolfgang schrieb:
> Philipp K. schrieb:
>> Er meinte, er hätte die Standardversion gekauft.
> Was auch immer auf der Standardversion drauf ist...
> Auf einem Photo von der µC-Platine könnte man nachgucken, ob ein
> Quarz/Resonator oder gar nichts an den Oszillator-Pins des µCs hängt.

Anbei zwei Fotos von der Vorder- und Rückseite der Platine. Im 
Vordergrund ist immer die Stelle, wo nach Angaben des Datenplattes für 
die Platine der PB7 (XTAL2) sein sollte. Dieser liegt offenbar unter dem 
Taster. Auf PB6 sollte XTAL1 liegen, diesen Pin habe ich aber bei besten 
Willen nicht finden können.

von Peter Z. (hangloose)


Lesenswert?


von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

Stefan ⛄ F. schrieb:
> Philipp K. schrieb:
>> Ich habe mir bei Freunden ein Multimeter besorgt und den Ruhezustand von
>> RX TX am MC gemessen. U(RX)=0,14V, U(TX)=0,01V.
>
> Tx müsste im Ruhezustand HIGH Pegel (5V) haben. Ein deutliches Zeichen
> dafür, dass entweder dein Programm den Pin nicht korrekt initialisiert
> hat oder dass der Pin kaputt ist.
>
> Eingänge (Rx) haben keine definierten Pegel, solange keine Signalquelle
> angeschlossen ist. Deine gemessenen 0,14V sind daher plausibel aber auch
> wenig aussagekräftig.

Da ist Dir ein Fehler an meinem Messobjekt aufgefallen. Ich habe 
vergessen den Transmitter anzuschalten, habe einfach das 
Ausgangsprogramm (habe das UCSR0C- Register mit UCSZ00 verbessert) auf 
den MC geladen.

Die Messung des TX habe ich mit Hilfe einer Diode auf einem Steckbrett 
nachgeholt: die LED leuchtet, der Ruhezustand des TX ist U=HIGH.

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Außerdem haben wir die Platine
>>XplainedMini(http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega328P-Xplained-Mini-UG-DS50002659B.pdf)
>>auf die Oszilator-Pins (PB6,PB7) geprüft.
>
> Was hat der ATMega328PB mit dem Controller auf dem XPLAIN-Board zu tun?
>
> MfG Spess

Hallo,

die Beziehung von PB6 und PB7 ist, dass man über diese die 
Quarzoszillatoren anschließen kann, falls man sich über die Fusebits aus 
dem MC ausgeschlossen hat. So hat es mir z.B. Stefan empfohlen, nachdem 
ich versucht habe, den Fuse CKDIV8 zu ändern.
Ansonsten hat Peter Z. gerade einen sehr detallierten Plan von der 
Beziehung ATmega328PB und Xplainedmini in den Chat gegeben.

Mfg Philipp

von Wolfgang (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Eingänge (Rx) haben keine definierten Pegel, solange keine Signalquelle
> angeschlossen ist. Deine gemessenen 0,14V sind daher plausibel aber auch
> wenig aussagekräftig.

Nach Aufbau sollte da der TX vom USB-Wandler dran hängen

von Stefan F. (Gast)


Lesenswert?

Philipp K. schrieb:
> Anbei zwei Fotos von der Vorder- und Rückseite der Platine.

Die Platine gefällt mir, so hätten sie man die Arduino Boards gestalten 
sollen.

von Stefan F. (Gast)


Lesenswert?

Wolfgang schrieb:
> Nach Aufbau sollte da der TX vom USB-Wandler dran hängen

Wenn das denn der Fall wäre, müsste der Ruhepegel ungefähr 5V betragen. 
Da er aber nur ein paar mV gemessen hat, muss wohl die Verbindung 
fehlen, kaputt sein oder der USB-UART Adapter ist kaputt.

von Wolfgang (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wenn das denn der Fall wäre, müsste der Ruhepegel ungefähr 5V betragen.

Oder er beträgt 0V, weil der USB-RS232-Wandler -3..12V liefert, die 
durch die Eingangsschutzdioden des ATmega auf 0V geklemmt werden.
Wenn man den USB-RS232-Wandler vom ATmega abzieht, müsste der Ruhepegel 
der TX-Leitung vom PC irgendetwas negatives liefern.

von Wolfgang (Gast)


Lesenswert?

p.s.
... oder der USB-RS232 Wandler spart bei der negativen Spannung und 
liefert tatsächlich 0V.
Kaputt sein wird das Ding nicht, sonst würden Daten kaum reproduzierbar 
übertragen werden.

von Philipp K. (Firma: keine) (philippw_k)


Lesenswert?

Guten Abend,

Danke nochmal für die vielen hilf- und lehrreichen Kommentare hier.
ich habe mir heute als TTL-Wandler das Modell MAX3232 gekauft und diesen 
zwischen das RS232-Kabel und den UART angeschlossen. Die Übertragung ist 
geglückt.
Anmerkung zum MAX3232: zuerst die Versorgungsspannung vom 3.3V-5.0V 
anlegen und erst dann das RS232-Kabel mit seinen +-12V anschließen. 
Schließt man das RS232-Kabel zuerst an, brennt der MAX3232 wegen der 
hohen Spannung durch und ist unbrauchbar. Wegen diesem Fehler ist einer 
der beiden MAX3232 bei mir draufgegangen.

Mit freundlichen Grüßen

Philipp

von Kopfschüttelnder (Gast)


Lesenswert?

Philipp K. schrieb:
> Guten Abend,
>
> Danke nochmal für die vielen hilf- und lehrreichen Kommentare hier.
> ich habe mir heute als TTL-Wandler das Modell MAX3232 gekauft und diesen
> zwischen das RS232-Kabel und den UART angeschlossen. Die Übertragung ist
> geglückt.
> Anmerkung zum MAX3232: zuerst die Versorgungsspannung vom 3.3V-5.0V
> anlegen und erst dann das RS232-Kabel mit seinen +-12V anschließen.
> Schließt man das RS232-Kabel zuerst an, brennt der MAX3232 wegen der
> hohen Spannung durch und ist unbrauchbar. Wegen diesem Fehler ist einer
> der beiden MAX3232 bei mir draufgegangen.
>
> Mit freundlichen Grüßen
>
> Philipp

Da stimmt wahrscheinlich mehr nicht. Normale RS232 Transceiver sind so 
konstruiert im ausgeschalteten Zustand mit einem aktiven angeschlossenen 
RS232 Gerät aushalten zu können. Vielleicht besteht zwischen dem PC und 
dem Netzteil auf der uC Seite ein unzulässiger Fehlerstrom wodurch dann 
unzulässige Spannungsdifferenzen zwischen PC Masse und uC Masse 
verursacht werden die dann die zulässigen Maximalwerte des MAX3232 
übersteigen.

Miss zur Vorsicht mit einem DMM in AC und DC Bereich ob im abgesteckten 
Zustand zwischen PC und uC Stromversorgung Masse eine messbare Spannung 
festzustellen ist.

In meiner jahrzehntelangen Praxis ist mir ein solcher Fall noch nie 
passiert. Deshalb ist es wichtig zuerst die plausiblen Ursachen zu 
eliminieren.

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.