Guten Tag!
Atmega32 | AVR Studio 5.0
Wie jeder der hier eine Frage rein stellt, komme auch ich nicht weiter
bei meinem "Programm".
Mein Programm (im Anhang) soll ein Byte aus einem Array lesen und dieses
an einen Port ausgeben. Der Index (Array[Index]) wird mit Hilfe des
16-bit Timers bei jedem Overflow erhöht.
Das ganze läuft solange gut, bis eine Null im Array steht! Ist dies der
Fall, wird der Index plötzlich auch Null und die Variable wird nicht
mehr erhöt.
Beim Debuggen im AVR Studio passiert das nicht.
Warum bricht die erhöhung der Variable bei einer Null im Array ab?
Danke für eure Hilfe!
Frohe Ostern!
Michael
Edit: Die Null wurde aus dem Array in der Angehängten C-Datei gelöscht,
für Test's ergänzen...
> // Static >> feste Adresse
Falsch. Nur in dieser Datei sichtbar.
Wie sinnvoll const volatile ist weiß ich nicht...
>int posArray = 0; // Position im Array
Da fehlt ein volatile.
Der Zugriff auf posArray in der Hauptschleife muss atomar erfolgen.
Timer: Vielleicht mal den CTC-Modus angucken?
int sind beim AVR 16 bit (1 Wort) damit braucht er 2 Zugriffe und wenn
die ISR zwischenfunkt ist sense.
uint8_t sind 8 bit und somits wirds atomar.
durch volatile landez die Variable imemr gleich im RAM und wird nicht im
Register gelassen.
Vielen Dank für die Korrektur Hinweise meines Programms!
Habe alles berücksichtigt und ausgetestet (Null ins Array geschrieben).
Leider kein Erfolg! Sobald posArray auf die Null zeigt (vierte stelle
bei mir), beginnt alles von vorne.
Im ARV Studio 5 kann ich Disassembly (Alt+F8) einschalten, somit sieht
man den Code in Assembler. Da ich Assembler nicht beherrsche (wäre
oftmals nützlich) habe ich ihn trotzdem kopiert und im Anhang beigefügt,
ev. findet Ihr dort noch etwas.
Könnte es sein, dass der Compiler einen Fehler bei der Übersetzung
macht?
Danke!
Michael
Michael Ammann schrieb:> Könnte es sein, dass der Compiler einen Fehler bei der Übersetzung> macht?
Kann man ziemlich sicher ausschliessen.
Natürlich sind Compiler nicht fehlerfrei, aber
* dein Fehlersymptom ist atypisch für einen Compilerfehler.
der baut ja nicht ein
if( Wert == 0 )
häng_den_Prozessor_auf
Für deinen Compiler ist eine 0 im Array ein Datenwert wie jeder
andere. Da ist nichts Spezielles drann.
* Es ist nicht sehr wahrscheinlich, dass ein Anfänger einen Compiler-
fehler findet. Wenn Compiler fehlerhaft sind, dann meistens in den
eher esoterischen Bereichen der Sprache. Die Standardsachen fallen
normalerweise auf, noch ehe der Compiler den Entwicklungsrechner
verlässt.
* zu 99.9% sitzt das Problem immer VOR dem Bildschirm
Sind deine Projekteinstellungen richtig. Ist da auch wirklich ein Mega32
eingetragen?
Was hängt physikalisch am Port?
In den Projekteinstellungen habe ich den Atmega32 ausgewählt. Es standen
noch andere Atmega32 zur Auswahl (Bild im Anhang, schwarz umrahmt)
welche ich nicht kannte und somit nicht auswählte.
Auf meinem Atmega32 steht noch 16PU wobei sich das ja nur auf die
Bauweise bezieht.
Beantworte bitte auch die andere Frage von Karl Heinz:
> Was hängt physikalisch am Port?
Denn da dürfte mit ziemlicher Sicherheit die Ursache liegen. Ich tippe
auf so was wie low-aktive LEDs, und auf einen Hardware-Reset, wenn eine
gewisse Anzahl gleichzeitig eingeschaltet wird.
Sorry!
An PORTA ein ULN2801A und an PORTB ein ULN2803A, hatte nur noch diese
beiden. Wollte an beiden die gleichen verwenden.
Edit: An den ULN2801A danach LEE mit einem Vorwiderstand für 5V
Betriebsspannung 5V mit einem Netzteil
Michael Ammann schrieb:> An PORTA ein ULN2801A und an PORTB ein ULN2803A, hatte nur noch diese> beiden. Wollte an beiden die gleichen verwenden.>> Edit: An den ULN2801A danach LEE mit einem Vorwiderstand für 5V>> Betriebsspannung 5V mit einem Netzteil
Kannst du das mal aufmalen bzw. zusätzlich ein Photo machen?
Ein Bauchgefühl sagt mir, dass deine 0 dafür sorgt, dass deine externe
Hardware sowas wie einen Kurzschluss macht und daher der µC resettet
wird. Entweder das, oder du überlastest dein Netzteil, so dass die
Versorgungsspannung einbricht. Was steht denn auf deinem Netzteil drauf,
wieviel Strom es liefern kann?
Die obligaten Blockkondensatoren an den Versorgungspins des Mega hast du
drann?
Karl Heinz Buchegger schrieb:> Was steht denn auf deinem Netzteil drauf,> wie viel Strom es liefern kann?
Netzteil:
https://www.distrelec.ch/schaltnetzteil-35-w-1-ausgang/mean-well/ps-35-5/360822
35W | 5V | 6A Ausgangsstrom
etwas überdimensioniert...
>Die obligaten Blockkondensatoren an den Versorgungspins des Mega hast du>dran?
Diese sind nicht dran. Meiner Meinung nach bei diesem Netzteil nicht
nötig, lasse mich aber eines Besseren belehren!
Ist schon eine Weile her seit ich die Printplatte gemacht habe, es fehlt
die Dateie. Habe sie kurz und nur grob nachgezeichnet.
Was sicherlich fehlt: Pull-Up Widerstand und Kondensator am Reset
Eingang!
hoffe dies reicht?!
Michael Ammann schrieb:>>Die obligaten Blockkondensatoren an den Versorgungspins des Mega hast du>>dran?>> Diese sind nicht dran.
Dann reden wir erst weiter, wenn du sie drann gemacht hast.
Die Dinger haben einen Grund.
> Was sicherlich fehlt: Pull-Up Widerstand und Kondensator am Reset> Eingang!
Der nächste Fauxpas.
> hoffe dies reicht?!
Ja bring erst mal deine Hardware in Ordnung. Es hat schon seinen Grund,
warum in allen erfolgreichen Schaltungen diese Teile vorhanden sind. Bei
dir sind sie nicht vorhanden und seltsame Dinge gehen vor. Da könnte ein
Zusammenhang bestehen (freundlich ausgedrückt)
Minimum:
Pins 10-11 100nF
Pins 30-31 100nF
Pin 9 10k nach VCC
Michael Ammann schrieb:> Diese sind nicht dran. Meiner Meinung nach bei diesem Netzteil nicht> nötig, lasse mich aber eines Besseren belehren!
Die Notwendigkeit für Blockkondensatoren hat nichts damit zu tun, wie
viel Strom dein Netzteil maximal liefern kann, sondern ergibt sich aus
der Induktivität der Verbindung zwischen Netzteil und IC.
Weiss auch nicht was ich mir gedacht habe als ich das Schema für den
Print gezeichnet habe!
Habe den Reset Pull-Up und Kondensator angelötet sowie die beiden
Blockkondensatoren an den beiden Speisungen des Atmega's. Dabei ist mir
aufgefallen, dass ich die Speisung für GND und AVCC (Pin31 und 30)
vergessen habe! Diese habe ich auch noch angeschlossen.
Alles angeschlossen und Programmier: Siehe da es Funktioniert!!
Grosses Dankeschön an euch und sorry für die Umstände!
Super dieses Forum!
Michael