Null im Array bricht Zählvorgang ab (AVR GCC)

OP #2623832
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...
Angehängte Dateien:
Gast #2623843
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?
(Firma: fritzler-avr.de) #2623848
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.
OP #2624447
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
Angehängte Dateien:
#2624456
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?
#2624495
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?
OP #2624587
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?!
Angehängte Dateien:
#2624605
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
OP #2624736
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren