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?
Mach aus:
1 | int posArray = 0; // Position im Array |
maln:
1 | volatile uint8_t posArray = 0; // Position im Array |
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.
Und die Überprüfung von posArray bzw rücksetzen auf 0 machst du besser auch in der ISR und nirgendwo anders.
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? Das ist ziemlich sicher auszuschließen.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.