Forum: Mikrocontroller und Digitale Elektronik ATMega32 16PU Typenunterschied?


von Thorsten D. (elsche)


Lesenswert?

Hallo zusammen!
Ich verwende einen Mega32 16PU und mein Programm läuft einwandfrei.
Das Problem: Es läuft nur einwandfrei wenn der Zusatz auf dem Chip 0803B
lautet.
Ist aus einer älteren Lieferung von 2009 aber das Programm ist von 
01.15!
Jetzt haben wir neue bestellt, der Zusatz lautet 1049, funktioniert aber 
nur bedingt und das Programm hängt sich manchmal auf.
Das trifft nur auf die neuen zu, die 5 älteren Funktionieren 
einwandfrei.

Nun meine Frage: Gibts da einen Unterschied bei diesen Bezeichnungen im 
Bezug auf Fuses o.ä.!

Schon mal danke für die Hilfe....

: Bearbeitet durch Admin
von Falk B. (falk)


Lesenswert?

Wahrscheinlich hast du in dem alten ein paar Fuses geändert und in den 
neuen nicht. Technisch sollte es zwischen den alten und neuen keinen 
Unterschied geben.

von elsche (Gast)


Lesenswert?

Die Fuses sind absolut identisch, das ist ja das komische!

Ich habe das Gefühl, das die Fuses-Register gar nicht richtig 
funktionieren.
Ich habe Testweise mal eine wilkürliche Einstelllung genommen und der 
Fehler
ist immer der gleiche, es ändert nichts....

von Karl H. (kbuchegg)


Lesenswert?

Dann könnte es noch ein Programmfehler wie zb die implizite Annahme von 
Defaultwerten für nicht initialisierte Variablen im Speicher sein. Bei 
der einen Serie kippen die Bits zufällig in die eine Richtung, bei der 
neueren kippen sie in die andere Richtung.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

elsche schrieb:
> ist immer der gleiche, es ändert nichts....
Was sollte sich denn ändern?

von elsche (Gast)


Lesenswert?

kbuchegg schrieb:
> Dann könnte es noch ein Programmfehler wie zb die implizite Annahme von
> Defaultwerten für nicht initialisierte Variablen im Speicher sein. Bei
> der einen Serie kippen die Bits zufällig in die eine Richtung, bei der
> neueren kippen sie in die andere Richtung.

Wie muss ich mir das Vorstellen und wie kann ich das beheben?
Habe ich so noch nicht gehabt oder gehört!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

elsche schrieb:
> Wie muss ich mir das Vorstellen und wie kann ich das beheben?
> Habe ich so noch nicht gehabt oder gehört!
Die Zellen im RAM sind nach dem Einschalten undefiniert. Wenn deine 
unbekannte Software jetzt annimmt, das RAM wäre mit 0 initialisiert 
und diese Initialisierung nicht selber (oder per Compiler) macht, dann 
kann es beim Powerup zufällige Fehler geben.

Und evtl. kippen bei einer anderen Charge die Bits eher nach '1' als 
nach '0'...

: Bearbeitet durch Moderator
von Max D. (max_d)


Lesenswert?

Oder man hat dir Klone angedreht

von elsche (Gast)


Lesenswert?

>Oder man hat dir Klone angedreht
Ist das echt schon mal vorgekommen , hat ein Bekannter auch erzählt das 
schon mal
nicht funktionierende im Handel sind?!

von elsche (Gast)


Lesenswert?

Hallo!

Noch einmal zum Thema, ich kann machen was ich will, es funktioniert 
nicht.

Kann das denn echt minderwertige Ware sein?

Hat jemand schon mal davon gehört oder auch schon so etwas erlebt?

Bin drauf und dran von anderem Lieferanten welche kommen zu lassen, die 
ich jetzt hatte kosten ca. 3€ Stück und beim anderen ca.5€.

von spess53 (Gast)


Lesenswert?

Hi

>Noch einmal zum Thema, ich kann machen was ich will, es funktioniert
>nicht.

Und was hast du gemacht?

>Hat jemand schon mal davon gehört oder auch schon so etwas erlebt?

Nein.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

spess53 schrieb:

>>Hat jemand schon mal davon gehört oder auch schon so etwas erlebt?
>
> Nein.

Klones noch nicht.
Aber das Verhalten, dass sich ein Programm 'seltsam' verhält wohl schon 
hunderte male. Und es war immer ein Fehler im Programm.

Ich weiss auch nicht warum sich die Leute immer so sträuben zu 
akzeptieren, dass die bei weitem wahrscheinlichste Ursache darin 
besteht, dass der Programmierer Murx gemacht hat.
Und nein "Aber das Programm lief ja schon" ist kein Argument. Mein 
persönlicher Zeit-Rekord für einen Programmfehler der erst viel später 
aufgedeckt wurde, liegt bei knapp 15 Jahren. Das es nicht noch ältere 
bisher nicht entdeckte Fehler gibt, liegt wohl eher daran, dass aus 
meinen Anfangsjahren kaum noch Code vorhanden bzw. im Einsatz ist.

: Bearbeitet durch User
von Peter R. (pnu)


Angehängte Dateien:

Lesenswert?

Sehr oft wird vergessen, den Registern bei Programmbeginn feste Werte 
zuzuweisen, also sie zu initialisieren. (Meistens macht das nichts, weil 
sie im Programm vor der Verwendung mit Daten geladen werden).

Beim späteren Lauf des Programms wird nach reset entweder Null in den 
Registern stehen oder auch, je nach Zufall, Teile eines vor Sekunden 
oder gar Tagen in den Zellen gewesenen Werts. Selbstverständlich können 
sich dann chargenabhängige Unterschiede ergeben.

Die Auswirkung ähnelt manchmal wirklich einem Zufallsgenerator.

Also: Software durcharbeiten und den Registern bzw. Variablen einen 
Anfangswert geben, wenn dieser nicht per Hardware vorgegeben ist, wie 
dann in den Datenblättern beschrieben.

Beispiel, gerade selbst erlebt: ein Register wird für Stellen-multiplex 
mit dem Muster 00000001 verwendet und per Schiebefunktion über carry 
(ror)bestimmt die 1 die Auswahl der aktuellen Stelle.

Wenn dann das Register beim Start den Inhalt 00000000 oder 1001000 
bekommt, ergeben sich interessante Effekte: in einem Fall bleiben alle 
Stellen dunkel, im andren leuchten nur zweie.

Siehe, im Anhang, wie mit r2 umgegangen wird, in der routine seraus. Da 
fehlte in init zuerst das Laden von r2 mit 00000001.

: Bearbeitet durch User
von elsche (Gast)


Lesenswert?

Hallo!

mein Hauslieferant hat mir freundlicherweise einen Kostenlosen IC 
geschickt um zu testen ob es mein Fehler ist oder nicht.
Habe den Controller dann Programmiert und er lief nicht, alle 
Einstellungen und Variablen kontrolliert, meiner Meinung nach OK.

Interessant ist das ich Controller ,alternativ, zu unserem 
Hauslieferanten bei einem anderen Lieferanten bestellt habe.

Habe diese mit den gleichen Einstellungen und Programm versehen und sie 
Funktionieren, keine Probleme...

Ist sehr seltsam....

von SeDa (Gast)


Lesenswert?

Schon den Tipp alle Register und RAM zu initialisieren verfolgt?
Einfach direkt nach dem Reset R0 bis R31 auf 0 setzen, eine Schleife 
bauen die den gesamten RAM durchläuft und auf 0 setzt.
Programmieraufwand 10sec.

Wenn es dann immer noch Probleme gibt, vielleicht mal den Code hier 
anhängen.

von Dr. Sommer (Gast)


Lesenswert?

Das mit dem Initialisieren gilt nur für funktionslokale nichtstatische 
Variablen und Peripherie-Register, denn globale und statische Variablen 
werden automatisch, wenn nicht anders im Code angegeben, auf 0 
initialisiert (wenn der Compiler keinen Unsinn macht) . Falls du den GCC 
verwendest, kannst du mal -Wuninitialized (iirc) übergeben, um dir 
Warnungen bei fehlender Initialisierung anzuzeigen. Ansonsten gebe ich 
meinen Vorrednern recht, ein Programmierfehler ist viel 
wahrscheinlicher, da hilft nur debuggen...

von bal (Gast)


Lesenswert?

Peter R. schrieb:
> Beim späteren Lauf des Programms wird nach reset entweder Null in den
> Registern stehen oder auch, je nach Zufall, Teile eines vor Sekunden
> oder gar Tagen in den Zellen gewesenen Werts. Selbstverständlich können
> sich dann chargenabhängige Unterschiede ergeben.

Lothar Miller schrieb:
> Die Zellen im RAM sind nach dem Einschalten undefiniert. Wenn deine
> unbekannte Software jetzt annimmt, das RAM wäre mit 0 initialisiert
> und diese Initialisierung nicht selber (oder per Compiler) macht, dann
> kann es beim Powerup zufällige Fehler geben.

Es handelt sich ja um einen ATmega und es ist wohl davon auszugehen 
(ACHTUNG! unbestätigte Vermutung) dass avr-gcc + avr-libc zum Einsatz 
kommen.

Dort gibt es keine "undefinierten Werte".

Hier in der Firma erzählen manche aber auch immer Schauergeschichten 
über nicht-konforme Compiler. Meistens wollen die Kollegen da 
irgendwelche abstrusen MISRA-Regel damit rechtfertigen.
Ich selbst hab so ein Verhalten noch nie erlebt.

von Ulrich F. (Gast)


Lesenswert?

Ich denke mal, solange Programm UND Schaltung geheim bleiben, wird das 
nichts.
Zumindest nichts mit einer Lösung.

Aber man kann ja darüber reden.....
Und während man darüber redet, erledigt sich das Problem vielleicht von 
selber, oder die Sicht auf das Problem ändert sich.
(was irgendwie beides aufs gleiche hinaus läuft)

von Dr. Sommer (Gast)


Lesenswert?

bal schrieb:
> Dort gibt es keine "undefinierten Werte".

Doch. Lokale Variablen von built-in Typen (int, char, ...) werden 
nicht automatisch initialisiert. Nur deswegen gibt's ja auch (falls 
eingeschaltet) die Warnungen.

von elsche (Gast)


Lesenswert?

Morgen!

Ihr dürft mich jetzt steinigen ;) ,ich habe tatsächlich noch 2 Variablen 
in einzelnen Funktionen gefunden die ich nicht initialisiert habe.
Eigentlich sind das nur unterfunktionen mit nicht so wichtigen abläufen, 
aber anscheinend wichtig genug um mir das Leben schwer zu machen.

Trotzdem Danke für die Hilfe und ich finde es trotzdem seltsam das so 
eine Reaktion stattgefunden hat.

Danke!!

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.