Forum: Mikrocontroller und Digitale Elektronik Atmega 328P wird nicht (mehr) erkannt


von John P. (brushlesspower)


Angehängte Dateien:

Lesenswert?

Hallo

ich habe folgendes Problem:

meine Platine mit Atmega 328P scheint sich nicht mehr programmieren zu 
lassen per ISP (USBasp)

Zuvor konnte ich problemlos programmieren.

GPIO setzen, Softserial zum debuggen und dann die I2C aktiviert.

Plötzlich wurde auf der Softserial nichts mehr ausgegeben.
und erneutes flashen schlug fehl.

Der Atmega wird nichtmal mehr erkannt.

Da der USBasp an einem anderen Atmega 328P funktioniert, gehe ich davon 
aus das dieser in Ordnung ist.


Zum flashen nutze ich AVRDUDESS.


Meine Vermutung: ich habe irgendwas geflasht/programmiert was meinen 
Atmega gekillt hat.
Bevor ich weitermache wüsste ich natürlich gerne was?

Code wurde mit Arduino IDE geschrieben.

: Bearbeitet durch User
von Sebastian R. (sebastian_r569)


Lesenswert?

Durch Quelltext lässt sich ein AVR eigentlich nicht so weit verstellen, 
dass man mit einem ISP nicht mehr draufkommt.

Wie sieht deine Schaltung aus und wie hast du die Fuses eingestellt?

Der wohl beliebteste Fehler ist das Konfigurieren der Fuses auf einen 
externen Clock, ohne dass eine solche vorhanden ist. Dann läuft der 
Controller ohne ext. Clock nicht mehr und lässt sich auch mitm ISP nicht 
mehr ansprechen.

von John P. (brushlesspower)


Angehängte Dateien:

Lesenswert?

Schaltung siehe Anhang

Fuses:

    Low Fuse = 0xFF
    High Fuse = 0xDA
    Extended Fuse = 0xFD

So wie es beim Arduino Pro Mini (Atmega328P) sein soll


Außerdem ließ er sich ja bereits programmieren und das mehrmals.


Als Anhng noch die Signale Miso (rot) Mosi (blau) SCK (gelb) bei klick 
auf "detect".

Miso sieht doch sehr ungewöhnlich aus. Als wenn der Ausgang nicht 
schaltet.

Edit:
Probeweise einen 10k Pullup an Miso gelötet. Signal ist jetzt bei 3,3V 
aber wird nicht vollständig auf gnd gezogen.

Miso Pin defekt?

: Bearbeitet durch User
von Sebastian R. (sebastian_r569)


Lesenswert?

Es passiert mal, dass man einen Controller himmelt. Aber eigentlich 
nicht durch Firmware oder den Flashvorgang. Aber ESD z.B. kann schon mal 
zu Problemen führen.

SPI braucht eigentlich keinen Pullup, also könnte wirklich der 
SPI-Treiber im Controller hinüber sein.

von John P. (brushlesspower)


Lesenswert?

Dann werde ich mal den Atmega ersetzen und neu flashen.

Hoffentlich überlebt er dieses mal.

von c-hater (Gast)


Lesenswert?

Sebastian R. schrieb:

> Durch Quelltext lässt sich ein AVR eigentlich nicht so weit verstellen,
> dass man mit einem ISP nicht mehr draufkommt.

Doch, bei etlichen Typen geht das durchaus. Teilweise sogar über mehrere 
Wege.

Am gefährlichsten dürfte CLKPR sein, da genügt ein einziger falscher 
Wert, um das Teil von unfähigen SPI-Programmern/deren unfähigen 
Benutzern sozusagen abzukoppeln...

von Sebastian R. (sebastian_r569)


Lesenswert?

c-hater schrieb:
> Doch, bei etlichen Typen geht das durchaus. Teilweise sogar über mehrere
> Wege.

Es geht, aber das ist eigentlich nichts, was man aus Versehen oder 
unbewusst macht.

von John P. (brushlesspower)


Lesenswert?

Ich habe den Atmeg328P getauscht. Alles wieder in Ordnung.


Ich habe erstmal den sketch ohne I2C geflasht. Beide MCU's funktionieren 
und senden Daten über die Softserial.

Sobald ich aber die I2C wieder einkommentiere, bekomme ich nichts mehr 
auf der Softserial...so hats beim letzten mal auch angefangen.

Bevor wieder der MCU kaputt geht lasse ich es erstmal mit der I2C.


Zum Verständnis:

Auf der PCB sind 2 Atmega 328P verbaut.
Die Softserielle wird durchgeschleift. Also USB TX -> MCU1 -> MCU2 -> 
USB RX

I2C wollte ich nutzen und bidirektional zwischen den MCU's daten 
auszutauschen.

von Adam P. (adamap)


Lesenswert?

John P. schrieb:
> Auf der PCB sind 2 Atmega 328P verbaut.
> Die Softserielle wird durchgeschleift. Also USB TX -> MCU1 -> MCU2 ->
> USB RX

Also das weckt jetzt grad mein Interesse, wie hast du das genau 
verbunden und was wolltest du damit erreichen.

von Adam P. (adamap)


Lesenswert?

John P. schrieb:
> Sobald ich aber die I2C wieder einkommentiere, bekomme ich nichts mehr
> auf der Softserial...so hats beim letzten mal auch angefangen.

Sind vllt. aus einem blöden Zufall die Pin-defines die gleichen?
Würde aber laut deinem Schaltplan-Ausschnitts kein Sinn ergeben...

Oder vllt. bleibt dein µC ja in irgendeinem I2C Interrupt oder 
Sofwareteil hängen, wodurch der Code für die Softserial nicht mehr zur 
Ausführung kommt?

Hast du mal versucht das Verhalten im Debug-Mode nachzuvollziehen?

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Adam P. schrieb:
> Oder vllt. bleibt dein µC ja in irgendeinem I2C Interrupt oder
> Sofwareteil hängen, wodurch der Code für die Softserial nicht mehr zur
> Ausführung kommt?

was ist mit Clockstretching? das soll der I2C nicht beherrschen, es wird 
ein weiterer Port benötigt um einen hängenden Clock zu erkennen und 
abzubrechen!

von John P. (brushlesspower)


Lesenswert?

Adam P. schrieb:
>> Auf der PCB sind 2 Atmega 328P verbaut.
>> Die Softserielle wird durchgeschleift. Also USB TX -> MCU1 -> MCU2 ->
>> USB RX
>
> Also das weckt jetzt grad mein Interesse, wie hast du das genau
> verbunden und was wolltest du damit erreichen.

Auf der Platine ist ein USB-UART Konverter.

USB/UART TX geht an MCU1 RX (PB0)
MCU1 TX (PB1) geht an MCU 2 RX (PB0)
MCU2 TX (PB1) geht an USB/UART RX

in jedem MCU wird alles was auf der Softserial ankommt gleich wieder 
versendet. Wie ein Echo, nur das es erstmal zum nächsten Empfänger geht.


Ich brauche beide Hardserials für andere Sensoren. Daher sind diese 
belegt.
Und der USB/UART Konverter hat bereits 2 UART's

Ich wollte mir einen USB zu 4x UART Konverter sparen
Die Softserial soll nur zum Debuggen dienen
Ein MCU mit 2 Hardserials wurde ausgeschlossen und hier im forum bereits 
diskutiert.

von Joachim B. (jar)


Lesenswert?

John P. schrieb:
> in jedem MCU wird alles was auf der Softserial ankommt gleich wieder
> versendet.

das klappt aber nur wenn er nicht im I2C modus hängt!

von John P. (brushlesspower)


Lesenswert?

Joachim B. schrieb:
> was ist mit Clockstretching? das soll der I2C nicht beherrschen, es wird
> ein weiterer Port benötigt um einen hängenden Clock zu erkennen und
> abzubrechen!

Bevor ich die Platine fertig gemacht hatte, habe ich die sketches auf 2 
Arduino Pro Mini's getestet. Dort liefen sie ohne Probleme.

Außerdem erklärt dies nicht warum die Hardware SPI dabei schaden nehmen 
sollte.

Adam P. schrieb:
> Sind vllt. aus einem blöden Zufall die Pin-defines die gleichen?
> Würde aber laut deinem Schaltplan-Ausschnitts kein Sinn ergeben...

Laut define's liegen SDA und SCL auf PC4 und PC5
Die Softserial auf PB0 und PB1

> Oder vllt. bleibt dein µC ja in irgendeinem I2C Interrupt oder
> Sofwareteil hängen, wodurch der Code für die Softserial nicht mehr zur
> Ausführung kommt?

Das wäre ja ok. Erklärt aber nicht die Beschädigung der Hardware SPI

> Hast du mal versucht das Verhalten im Debug-Mode nachzuvollziehen?

Nein. Geht das mit der Arduino IDE überhaupt?

von Adam P. (adamap)


Lesenswert?

John P. schrieb:
> Nein. Geht das mit der Arduino IDE überhaupt?

Hast recht, ne geht nicht.

1
  Wire.beginTransmission(8); // transmit to device #8
2
  Wire.write("Master\n\r");        // sends five bytes
3
  Wire.endTransmission();    // stop transmitting
4
  delay(500);
5
  Wire.requestFrom(8, 7);    // request 6 bytes from slave device #8
6
7
  while (Wire.available()) { // slave may send less than requested
8
    char c = Wire.read(); // receive a byte as character
9
    altSerial.print(c);         // print the character
10
  }
11
  Wire.endTransmission();    // stop transmitting

Was ist mit Zeile 5 "Wire.requestFrom(8, 7);" wenn du doch 6 Byte 
empfangen willst, warum steht da 7?

Und vllt versuch das mit der Serial zu trennen. Also nicht in der 
while(), schieb die Daten lieber in ein Buffer und versenden diese nach 
dem Empfangen.

Falls an der Aussage von Joachim B. etwas dran sein sollte.

: Bearbeitet durch User
von John P. (brushlesspower)


Lesenswert?

Adam P. schrieb:
> Was ist mit Zeile 5 "Wire.requestFrom(8, 7);" wenn du doch 6 Byte
> empfangen willst, warum steht da 7?

Hatte das mal mit 2 Arduino Pro Mini's aufgebaut.
mit "Wire.requestFrom(8, 6);" fehlte immer das letzte Byte. Daher habe 
ich es einfach auf 7 gesetzt.

Habe allerdings auch nicht weiter darüber nachgedacht, da es ja nur ein 
funktionstest sein sollte.


An meinem Code sind sicher noch fehler. Und es kann durchaus sein das 
sich der Code irgendwo aufhängt und daher keine Daten auf der Softserial 
ankommen.


Aber...als ich das letzte mal versucht habe das Problem zu 
identifizieren ist die Hardware SPI abgeschmiert und ich konnte nicht 
mehr flashen.
Also MCU runterlöten und neuen drauf.

Bevor sich das ganze wiederholt (aus welchen Gründen auch immer) möchte 
ich erstmal die eigentliche Application schreiben und testen. Halt ohne 
I2C.

Wenn ich dann unbedingt I2C brauche, kann ich ja die Softserial 
auskommentieren.

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

John P. schrieb:
> Auf der Platine ist ein USB-UART Konverter.

USB auf RS232 oder USB auf TTL Pegel?
USB auf RS232 himmelt den Prozessor recht zuverlässig.

von Adam P. (adamap)


Lesenswert?

Also ich hab das jetzt mal hier nachgebastelt mit einem Nano 
(atmega328p).

Es ist nun so, JA du hast recht, sobalb I2C aktiviert wird, kommt über 
deine Softserial nix mehr - ABER, der Code läuft, hab ein toggle auf ne 
LED gemacht.

Hab dann mal die Softserial auf D2 und D3 gelegt und siehe da, läuft.

Da beißt sich intern etwas.

: Bearbeitet durch User
von John P. (brushlesspower)


Lesenswert?

Georg G. schrieb:
> USB auf RS232 oder USB auf TTL Pegel?
> USB auf RS232 himmelt den Prozessor recht zuverlässig.

TTL Pegel
Verbaut ist ein CP2105

Adam P. schrieb:
> Also ich hab das jetzt mal hier nachgebastelt mit einem Nano
> (atmega328p).
>
> Es ist nun so, JA du hast recht, sobalb I2C aktiviert wird, kommt über
> deine Softserial nix mehr - ABER, der Code läuft, hab ein toggle auf ne
> LED gemacht.

Das werde ich auch mal mit dem Arduino Pro Mini machen. Da brauche ich 
die SPI ja auch nicht zum flashen.

Warscheinlich ist das ganze I2C-Softserial-SPI Problem völliger quatsch

Das die SPI gehimmelt wurde ist ein Problem
Und das die I2C sich nicht mit der Softserial versteht das andere.

von John P. (brushlesspower)


Lesenswert?

Adam P. schrieb:
> Hab dann mal die Softserial auf D2 und D3 gelegt und siehe da, läuft.
>
> Da beißt sich intern etwas.

Hm...teilen sich I2C und Softserial vielleicht einen gemeinsamen 
Interrupt?

von Adam P. (adamap)


Lesenswert?

John P. schrieb:
> Hm...teilen sich I2C und Softserial vielleicht einen gemeinsamen
> Interrupt?

Nein,

jedoch hat die Softserial Klasse ein Debug-Mode in dem Pin 11 (PD7) und 
13 (PB1) verwendet werden, aber ich denke kaum das du das aktiviert hast 
im Code.

Sehr merkwürdig.

Also auf anhieb finde ich auch nix in dem Code der Klassen was auf eine 
Überschneidung hindeutet (habs mal kurz überflogen).

Vllt. wissen die Arduino-Nutzer mehr.

: Bearbeitet durch User
von John P. (brushlesspower)


Lesenswert?

Adam P. schrieb:
> jedoch hat die Softserial Klasse ein Debug-Mode in dem Pin 11 (PD7) und
> 13 (PB1) verwendet werden, aber ich denke kaum das du das aktiviert hast
> im Code.


Ist bei mir nicht aktiviert.
Eventuell mal direkt auskommentieren.

Oder mal die AltSoftSerial verwenden. Diese will ja explizit PB0 und PB1 
für RX und TX nutzen.

von John P. (brushlesspower)


Lesenswert?

Kleines bisheriges Fazit:

Beide Controller funktionieren weiterhin, keine weiteren Probleme mit 
der SPI oder beim flashen.


Zur Softserial:
Die habe ich aus beiden controllern auskommentiert. Die zuverlässigkeit 
ist wirklich mies. Selbst bei 9600 Baud kommt sehr oft nur noch müll an.
Vermutlich werden die Timings durch das 2 fache lesen/schreiben total 
verzerrt. Schade....

Die I2C läuft jetzt auch problemlos.
Zum Debuggen sende ich alles über I2C und schreibe es dann auf die SD 
Karte.
Nicht gerade effizient, aber es reicht.


Wenn später die Application(en) fertig sind probiere ich nochmal die 
Softserial zu verbessern.

von Adam P. (adamap)


Lesenswert?

Hast du auch ein Schaltplan vom ganzen Board mit beiden µC?

Denn so richtig verstehe ich deinen Aufbau nicht, bzgl. der UART und USB 
usw.
Mir kommt da eher der Gedanke, dass es evtl. ein falscher Design-Ansatz 
ist...was die Controller-Kommunikation betrifft.

Du sagtest:

John P. schrieb:
> Also USB TX -> MCU1 -> MCU2 -> USB RX

Somit sieht das doch so aus:
1
 USB        MCU_1           MCU_2
2
 ----       ----            ----
3
| TX | --> | RX |     /--> | RX |
4
|    |     |    |    /     |    |
5
|    |     | TX | --/      | TX | --\
6
|    |      ----            ----    |
7
|    |                              |
8
| RX | <----------------------------/
9
 ----

Wird von USB auch etwas versendet, oder ist das nur ein Durchschleifen 
von Debug-Ausgaben an den USB-Serial Adapter.

Und für was hast du die Hardware-UART verwendet?

: Bearbeitet durch User
von John P. (brushlesspower)


Lesenswert?

Adam P. schrieb:
> Somit sieht das doch so aus:
>  USB        MCU_1           MCU_2
>  ----       ----            ----
> | TX | --> | RX |     /--> | RX |
> |    |     |    |    /     |    |
> |    |     | TX | --/      | TX | --\
> |    |      ----            ----    |
> |    |                              |
> | RX | <----------------------------/
>  ----
>
> Wird von USB auch etwas versendet, oder ist das nur ein Durchschleifen
> von Debug-Ausgaben an den USB-Serial Adapter.

Richtig. Genau so sieht es aus.

Von USB kann was gesendet werden. Beide MCU's geben die empfangenen 
Daten auf RX wieder auf TX raus.

Wenn ich per USB immer "Hello World" sende...
bekomme ich mal "Hello World" ein anderes mal "Hello Wor(komische 
Zeichen)" und manchmal nur komische Zeichen.
Es würde ja funktionieren, aber schön ist anders.

Adam P. schrieb:
> Und für was hast du die Hardware-UART verwendet?

An MCU1 ist ein "Sensor" der mir Daten mit 115200 Baud sendet (zu 
schnell für SoftSerial)
An MCU2 ist die Telemetrie zum Nutzer die mit 100000 Baud arbeitet. 
(Zeitkritisch)

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

Entweder du nimmst eine andere Softserial.
Du schreibst alles selbst mit AtmelStudio und hast alles in der Hand.
Du hättest lieber ein µC mit 2 UART nehmen können (ATmega1284P).

Und das mit deinem ISP Problem,
ich hab es gestern auch irgendwie hinbekommen, aber nur weil ich 
zwischen DebugWire und ISP gewechselt hatte.

ATmega1284P hat JTAG :-)

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Der ATmega328PB hat auch zwei UART Schnittstellen.

von Adam P. (adamap)


Lesenswert?

Ja die sind doch bis auf den PE Port, Pin gleich.
Leider fehlen dir dann die Bahnen auf deiner PCB.

von John P. (brushlesspower)


Lesenswert?

Adam P. schrieb:
> Entweder du nimmst eine andere Softserial.

Will ich noch machen, vorher sind aber andere Dinge dran.

> Du schreibst alles selbst mit AtmelStudio und hast alles in der Hand.

Ich weiß, aber dafür fehlt mir auch deutlich die Erfahrung mit dem 
Atmels.

> Du hättest lieber ein µC mit 2 UART nehmen können (ATmega1284P).
Ich verweise mal auf Stefanus F's Beitrag

Stefanus F. schrieb:
> Der ATmega328PB hat auch zwei UART Schnittstellen.

Richtig, der war auch schon fast im Schaltplan/Layout drin. Für ein 
Redesign würde ich den auf jedenfall bevorzugen.

Mich hat aber folgendes abgehalten:
Für den Nutzer gibt es mehrere Telemetrieprotokolle (5 die ich kenne, 2 
die ich selber nutze)
Für alle Telemetrieprotokolle gibt es Arduino code für den 328P.

Leider habe ich es bisher nicht geschafft mal den 328PB (mit 
entsprechender Hardware Library) auszuprobieren.
Das will ich aber noch nachholen.

von Joachim B. (jar)


Lesenswert?

Adam P. schrieb:
> Entweder du nimmst eine andere Softserial.

würde ich auch sagen,

ich bin ja gerade dabei den genannten Code mit meiner Softserial aus den 
Beispielen der ArduinoIDE zu vergleichen, die sind verschieden!

> Du schreibst alles selbst mit AtmelStudio und hast alles in der Hand.
auch eine Lösung

von Adam P. (adamap)


Lesenswert?

John P. schrieb:
> Leider habe ich es bisher nicht geschafft mal den 328PB (mit
> entsprechender Hardware Library) auszuprobieren.
> Das will ich aber noch nachholen.

Sollte aber eigentlich laufen.

Dann noch viel spaß :) und vllt. hab ich ja mal langweile, dann schau 
ich mal was sich da beißt (Softserial & I2C).

von Adam P. (adamap)


Lesenswert?

Joachim B. schrieb:
> ich bin ja gerade dabei den genannten Code mit meiner Softserial aus den
> Beispielen der ArduinoIDE zu vergleichen, die sind verschieden!

Aber ich konnte nichts erkennen, was auf ein Ausfall deuten würde, 
sobald I2C aktiviert wird und die main() lief ja auch.

von Joachim B. (jar)


Lesenswert?

Adam P. schrieb:
> ...und vllt. hab ich ja mal langweile, dann schau
> ich mal was sich da beißt (Softserial & I2C).

zumindest ist sein Soft Tempo 4x höher als das Beispiel in der IDE

ohne in den Quellcode geschaut zu haben, mir war so als wenn man das 
nicht überreizen darf, eigentlich muss das Startbit mehrfach abgetastet 
werden, aber das war bei Autobauderkennung, trotzdem sollte man in der 
Mitte vom Bit abtasten und wenn das Bit zu schmal wird?

Also Beispiel sagt 4800 Bd und nicht 19200 Bd

wer schneller will muss wohl selber Hand anlegen.

von Adam P. (adamap)


Lesenswert?

Ja das Problem liegt aber auch schon dabei,
dass sobald I2C aktiviert wird, versendet der µC erst gar nichts.

Im Ablauf ist ja I2C irgendwann fertig auch mit den ISR und erst dann 
kommt software-technische der Serial Versand.

Da beleibt die Software aber auch nicht hängen, so als ob es wirklich 
gemacht wird, aber irgendwas den Pin daran hindert es auch auszugeben - 
habe es jetzt noch nicht mit einem LA getestet.

Ich werde mal alle Arduino Libs in ein AtmelStudio Projekt laden und es 
dort mal debugen.

Kann auch sein, dass irgendwas die Pin-Config überschreibt.

Alles was man im Arduino IDE nicht sieht.

: Bearbeitet durch User
von John P. (brushlesspower)


Lesenswert?

Joachim B. schrieb:
> Also Beispiel sagt 4800 Bd und nicht 19200 Bd
>
> wer schneller will muss wohl selber Hand anlegen.

deswegen habe ich es schon auf 9600 Baud reduziert. Hat geholfen aber 
eben nicht so das man zufrieden sein kann.

Ich hatte hier auch schonmal die Softserial getestet (da gingen 57600 
Baud Problemlos)
Allerdings nicht mit verketteten MCU's sondern direkt TX/RX mit einem 
FTDI verbunden.

Bei der verkettung der MCU's wird natürlich jedesmal das Timing verzerrt

RX MCU1 -> Bytes könnten fehlerhaft eingelesen werden
TX MCU1 -> Timing der Bytes eventuell fehlerhaft, und eventuell bereits 
falshe Bytes  im Buffer

RX MCU2 -> Fehlerhafte Bytes werden fehlerhaft eingelesen
TX MCU2 -> Fehlerhafte Bytes werden noch fehlerhafter gesendet

RX USB -> nur noch Fehler ;)

von Joachim B. (jar)


Lesenswert?

John P. schrieb:
> deswegen habe ich es schon auf 9600 Baud reduziert. Hat geholfen aber
> eben nicht so das man zufrieden sein kann.

ist ja immer noch doppelt so schnell, vielleicht wärst du ja mit 4800 
zufrieden?

von Manfred (Gast)


Lesenswert?

John P. schrieb:
> Zum Debuggen sende ich alles über I2C und schreibe es dann auf die SD Karte.

Wie kommst Du von I2C auf eine SD-Karte? Ich kenne die nur mit 
SPI-Inteface.

von Adam P. (adamap)


Lesenswert?

Manfred schrieb:
> Wie kommst Du von I2C auf eine SD-Karte? Ich kenne die nur mit
> SPI-Inteface.

Er meint wohl damit:

MCU_1 sendet Daten per I2C zu MCU_2, MCU_2 schreibt die Daten dann auf 
die SD.

von John P. (brushlesspower)


Lesenswert?

Adam P. schrieb:
> MCU_1 sendet Daten per I2C zu MCU_2, MCU_2 schreibt die Daten dann auf
> die SD.

Korrekt ;)

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.