Forum: Mikrocontroller und Digitale Elektronik Null im Array bricht Zählvorgang ab (AVR GCC)


von Michael A. (ammannm)


Angehängte Dateien:

Lesenswert?

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...

von Diplomtroll (Gast)


Lesenswert?

> // 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?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Und die Überprüfung von posArray bzw rücksetzen auf 0 machst du besser 
auch in der ISR und nirgendwo anders.

von Michael A. (ammannm)


Angehängte Dateien:

Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Michael Ammann schrieb:
> Könnte es sein, dass der Compiler einen Fehler bei der Übersetzung
> macht?

Das ist ziemlich sicher auszuschließen.

von Karl H. (kbuchegg)


Lesenswert?

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?

von Michael A. (ammannm)


Angehängte Dateien:

Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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.

von Michael A. (ammannm)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von Michael A. (ammannm)


Angehängte Dateien:

Lesenswert?

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?!

von Karl H. (kbuchegg)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Michael A. (ammannm)


Lesenswert?

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
Noch kein Account? Hier anmelden.