mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Programmierung - µC verrent sich


Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

warum funktioniert dieses einfache Unterprogramm nicht (siehe Anhang)?
Es dient dazu, einen Variableninhalt seriell an einem Portpin
auszugeben. Die wait-Routinen sind einfache, nichtstuende Schleifen.

Wird das Unterprogramm Show() im Hauptprog. aufgerufen und durch einen
Interrupt unterbrochen, so stürzt bzw. verrennt sich der µC.

Gibt man nur 8 Bit große Variablen aus, ändert also u16 nach u8 und
i<=15 in i<=7, so funktioniert.

Hat jemand eine Erklärung dafür????

Gruß,
Michael

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,


for(i=0;i<=15;i++)
  {
    if(reg&(1<<i))

Ich vermute das dein Problem da liegt:

        i<=15

Bin mir aber nicht sicher ober der ATMega dort sich weghängt wenn er 15
mal ein bit verschiebt ...


Lg


Christian

Autor: Jens Mundhenke (jensbert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,

andere Theorie: Die 1 wird als Byte betrachtet, mehr als 7 mal
geschoben, wird sie immer zur Null - Schluß mit lustig.

Schlage vor, Du schaust Dir den Assemblercode an, dort sollte das recht
schnell zu erkennen sein.

Als Alternative, die noch dazu schneller ist, empfehle ich Dir eine
Hilfsvariable u16, die Du als Maske benutzt und die bei jedem
Schleifendurchlauf um einen weitergeschoben wird. Natürlich mit 1
initialisiert und schieben nach der Verwendung.

Vielleicht so:
void Show(u16 reg)
{
  u16 mask=1;

  while ( mask )
  {
    if(reg&mask)
    { SetBit(SHOWPORT,SHOWOUT);
      wait100us();
      ClrBit(SHOWPORT,SHOWOUT);
      wait20us();
      wait50us();
    }
    else
    {
      SetBit(SHOWPORT,SHOWOUT);
      wait20us();
      ClrBit(SHOWPORT,SHOWOUT);
      wait100us();
      wait50us();
    }
    mask <<= 1;
  }
}

Gruß

Jens

Autor: billy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eigentlich logisch dass sich dein controller verrennt, wenn du keine
endlosschleife zum schluß hast. mal überlegt was er nach der
for-schleife machen soll????

wie wär's wenn du danach noch
while(true){}
einfügst???

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

zuerst vielen Dank für eure Anregungen!

@Christian: Warum meinst du, dass er mit 15 mal eine for-Schleife
durchlaufen ein Problem haben könnte? Probleme mit 15 mal schieben wäre
die gleiche Theorie wie sie Jens hat.

@Jens: Deine Theorie kann ich nachvollziehen und hört sich logisch an.
Leider funktioniert dein Vorschlag mit der Hilfsvariable als Maske auch
nicht. Die gleichen Symptome stellen sich ein.

@billy: In meinem Hauptprogramm ist die für µC zwingend notwendige
Endlosschleife versteckt. In dieser wird das Unterprogramm Show
aufgerufen und man kann einfach mit einem Oszi die 1er und 0er
auslesen.

Als Anmerkung: Die Unterroutine funktioniert, auch mit Hilfsvariable
mask, solange, bis sie durch einen Timer-Interrupt unterbrochen wird.

Grüße,
Michael

Autor: Jens Mundhenke (Jensbert) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,

es verdichtet sich der Eindruck, dass es an Deiner Interrupt-Routine
liegt. Ist natürlich schwierig zu raten, aber vielleicht hat sie ein
Problem mit dem Stack, der ja für die lokale Variable und besonders die
Rücksprung-Adresse verwendet wird.

Ich fürchte, da sind wir mit unserem Latein am Ende...

Gruß

Jens

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

noch als Nachtrag den betroffenen Assemblercode im Anhang.

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke auch, dass es mit dem Interrupt zusammen hängt. Ich hatte
schon mal etwas Ähnliches. Damals ist ein zweiter Interrupt während des
Ausführend der ersten ISR aufgetreten und hat den µC aus der Bahn
geworfen. Ich verwende übrigens den AVR Tiny26.

Ist es vielleicht ein Problem, dass der Interrupt und das Unterprogramm
Show dieselben wait-Routinen aufruft?

Der Stack umfasst 16 Ebenen.

Gruß,
Michael

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael

Ich weiß nicht wie sich der µC verhällt, wenn er über 0
hinausschiebt...

Ich kann es zur Zeit auch nicht testen, da mein Mega16 beim Umzug
flügge geworden ist ...

Poste doch bitte mal den ganzen code ...


Lg


Christian

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich glaub ich habs gefunden;

Zum einen, wenn ich die wait-Schleifen nicht per Unterprogramme
realisiere sondern die warteschleifen direkt einbaue funktionierts.
Zum anderen, wenn ich die Werte CSTACK auf 0x2f und RSTACK auf 32 Level
verdopple (IAR-C-Compiler), dann funktionierts auch mit Warteschleifen
in Unterprogrammen.

Verstanden hab ichs aber noch nicht...
Auser, dass der Stack zu klein ist und dadurch Rücksprungadressen
verlohren gehen. Wozu braucht man zwei Stellen,an welchen man den Stack
definieren kann?

@Christian: Den kompletten Code posten fänd mein Cheffe nicht so
toll...

Gruß,
Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.