mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEAG16 macht Resets


Autor: Mario L. (dg1leo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich habe für den ATMEGA16 ein kleines Programm geschrieben das es mir
ermöglichen soll 10 Ein- und 10 Ausgänge durch ein Byte das ich dem
ATMEGA über die USART schicke zu setzten bzw auszulesen(Quelltext hängt
an). Dabei passiert es in unregelmäßigen Abständen immer wieder das der
ATMEAG16 einen RESET macht dessen Ursache ich nicht finden kann. Ich
betreiben den ATMEAG mit einem 16MHz Quarz mit 22pF Cs und wie hier auf
den Seiten beschrieben ist mit 100nF Cs an VCC und GND an allen
Versorgungspins des ATMEAG. Zusätzlich hab ich einen 10k von VCC an den
Reset PIN gehängt. Meine 5V VCC ist lt. Oszi stabil un glatt. Ein Byte
wird von einem PC über die RS232 über einen MAX232 an die USART mit
115.2kb gesendet, der ATMEGA reagiert darauf und senden 2 byte als
Antwort zurück, und das bis etwa 100 mal in der Sekunde.

Kann mal bitte bitte bitte einer der Experten hier im Forum über meinen
Quelltext schauen und mir Tips und Hinweise geben wie ich die Sache
stabiler, besser machen könnte?
Gibt es eine Möglichkeit den Zustand der Ports vor einem RESET zu
sichern und diese nach dem RESET wieder herzustellen?

Für Antworten und Hinweisse schon mal vielen Dank!

MfG DG1LEO

Autor: Ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal die Fuses kontrolliert, ob da vielleicht der Watchdog-timer
eingeschaltet ist?

/Ernst

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CKOPT Fuse gesetzt ?

Autor: Mario L. (dg1leo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
mhh - weiss nicht, fusses sind siehe Anhang gesetzt.
merci für die super schnelle Antwort.
Dg1LEO

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir nach dem Reset mal da Register MCUCSR an. Wenn Du nicht
debuggen kannst, dann gib es über die RS232 aus oder leg den Wert auf
einen unbenutzten, auf Output geschalteten Port.

Viele Grüße, Stefan

Autor: Mario L. (dg1leo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht noch mal kurz zur Erläuterung...
Das ganze funktioniert eigentlich genau so wie ich mir das vorstelle,
d.h. ich schick dem ATMEGA den Befehl, der setzt mir die Ausgänge,
schickt mit in 2 bytes den status der eingänge zurück, und das ganze
etwa 100 mal in der sekunde. Allerdings macht er nach etwa 10, 15 oder
20 sekunden einen reset, d.h. die leds an den ausgänge laufen durch ->
meine initroutine, und dann macht er ganz normal weiter bis zum
nächsten reset nach xx sekunden. :(

Leo

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
10uF zwischen VCC und GND ist immer eine gute Idee (reimt sich sogar
:))

Die fuses sind richtig würde ich sagen. Was genau schalten die ports?

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind die LEDs denn direkt am AVR? Das würde natürlich nicht gehen.

Also ich glaube mit einen 10uF c sollte das Problem gelöst sein, hatte
ich auch schon mal...

Autor: Mario L. (dg1leo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
100uF sind drann...
Ich glaub aber ich hab irgendein anderes problem. Ich hab meine
INTi_PORTS routine abgeänder in:
void INIT_PORTS(void) {
  //Ausgänge setzen: PC0-PC7+PA6+PA7
  DDRC = 0xff;
  DDRD |= (1 << DDD6) | (1 << DDD7);

  PORTC= MCUCSR;
/*
  //alle Ausgänge auf low...
  PORTC= 0x00;  */
  PORTD |= (1 << PD6) | (1 << PD7);
  _delay_ms(1000);
  PORTD &= ~(1 << PD6) | (1 << PD7);
  _delay_ms(1000);
  PORTD |= (1 << PD6) | (1 << PD7);
  _delay_ms(1000);
  PORTD &= ~(1 << PD6) | (1 << PD7);
  _delay_ms(1000);
  PORTD |= (1 << PD6) | (1 << PD7);
  _delay_ms(1000);
  PORTD &= ~(1 << PD6) | (1 << PD7);
  _delay_ms(1000);
  PORTD |= (1 << PD6) | (1 << PD7);
  _delay_ms(1000);
  PORTD &= ~(1 << PD6) | (1 << PD7);

  //Eingänge setzen
  DDRB = 0x00;
  DDRD &= ~(1 << DDD2) | (1 << DDD3);
  //no pull-ups...
  PORTB = 0x00;
  PORTD &= ~(1 << PD2) | (1 << PD3);
  //AD-Port als eingänge...
  DDRA = 0x00;
}
.. um zu sehen wie das MCUCSR nach dem reset aussieht - hier sind immer
PC0 und PC1 high, alle anderen low. ABER...
Nachdem die routine durch ist leuchtet nur PD7, PD6 ist aus und die
beiden ldes blinken auch nicht, was sie doch aber tun müssten - das
versteh ich nun wieder überhaupt nicht, da stimmt doch was nicht...
Die leds an PORTC und PORTD sind über 330Ohm auf masse.

thx für eure antworten
mixblick Leo

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Villeicht noch JTAG Aktiv?

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wiso rätselt ihr noch rum, ich habe es doch schon geschrieben woran es
liegt:
CKOPT Fuse setzen !

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dir glaubt halt keiner.

Nee, im ernst... was macht denn CKOPT?

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CKOPT schaltet den Oszillator bei Verwendung eines Quarzes vom
Stromsparmodus auf volle Amplitude.

Ab etwa 8MHz aufwärts soll CKOPT gesetzt werden. Tut man es nicht,
interpretiert der AVR manche Takte anscheinend doppelt und läuft so ab
und zu mal mit doppelter Frequenz. Das ist natürlich viel zu schnell ->
AVR hängt sich auf.
Das ist zumindest meine Interpretation des Verhaltens.
Was man merkt: Der AVR hängt sich ohne Grund auf, und zwar meist an
bestimmten stellen:
Bei meinem Spektrumanalyser war es ab einer bestimmten Lautstärke, bei
meinem Displaycontroller immer dann wenn ein bestimmtes Bitmuster
geschrieben wurde.

Autor: Mario L. (dg1leo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit der CKOPT werd ich gleich mal probieren. Irgendwie steh ich mit
den fusses auf kriegsfuss. Nach dem ATMEGA16 Datenblatt ist ckopt für:
"For resonators, the maximum frequenzy is 8Mhz with CKOPT unprogrammed
and 16MHz with CKOPT programmed" - sollte dann doch heissen "kein
hacken" bei CKOP und ich kann das 16MHz quarz richtig nutzen...
Genau so bei der JTAGEN fusse - JTAG Enabled -> kein
Hacken==programmiert==JTAG Enabled, ABER nur wenn dort kein Hacken
drinn ist kann ich PC3, PC4, PC5, PC6 usw. setzten, also JTAG aus, wenn
ich nen hacken setzte dann kann ich die pins nicht setzten - müsste
meiner menung nach genau anders herum sein - muss ich aber wohl nicht
verstehen.
Bei mir scheint auch die funktion _delay_ms(); aus der neuen
util/delay.h nicht richtig zu funktionieren. Wenn ich _delay_ms(1000)
(sollte doch 1 sekunde sein) aufrufe werden da max. ein paar
mikrosekunden verzögert... merkwürdig.

MfG und noch nen schönen Abend
DG1LEO

Autor: Mario L. (dg1leo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der läuft und läuft und läuft - zumindest seit 5 min ohne reset - ich
bin hin und weg und völlig begeister. Vielen Dank an alle die sich so
rege mit meinem Problem auseinandergesetzt haben. (+big thx to
benedikt!!)
Vielleicht sollte man wirklich mal ein richtiges tutorial für die
fusses schreiben, oder gibts sowas schon?

DG1LEO

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mario schrieb
...
Genau so bei der JTAGEN fusse - JTAG Enabled -> kein
Hacken==programmiert==JTAG Enabled, ABER nur wenn dort kein Hacken
drinn ist kann ich PC3, PC4, PC5, PC6 usw. setzten, also JTAG aus,
wenn
ich nen hacken setzte dann kann ich die pins nicht setzten - müsste
meiner menung nach genau anders herum sein - muss ich aber wohl nicht
verstehen.
...

ein gesetzter Haken bedeutet programmiert, Bit = 0
nicht gesetzter Haken bedeutet nicht programmiert, Bit = 1

Ist also schon alles so wie es sein soll.

Volker

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt für beide Arten der Häckchen einen Sinn:
Für Häckchen = 1: bit gesetzt
Für Häckchen = 0: Fuse programmiert.

Daher steht in einem ordentlichen Programm auch dabei ob ein Häckchen
jetzt sich auf eine programmierte Fuse oder auf ein gesetzes Bit
bezieht.

Am besten ist es aber so wie im AVR Studio:
Man wählt z.B. "externern Quarz>1MHz, BOD aus" aus, und das Programm
stellt die Fuse Bits automatisch ein.

Autor: Die Waldfee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wundere mich die ganze Zeit schon - noch kein Frühling, und alle
sind schon im Garten am Hacken...

@Benedikt: Interessanter Tipp mit der CKOPT-Fuse... Ich hatte zwar (3x
auf Holz klopf) noch nie derartige Probleme, aber nun hat man schonmal
einen Ansatz, wenn sich etwas seltsam verhält.
Also, fröhliches Hacken und nicht vergessen, die Haken richtig zu
setzen ;)

Autor: Mario L. (dg1leo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. Ich hab das wohl wirklich einfach falsch asoziiert - hatte bisher
immer gedacht bit gesetzt= fuse programmiert - nun gut, jetzt hab ichs
glaub ich begriffen :).
Noch mal zu der Frage ob man die den Status von pPrts vor einem rRset
sichern kann und diesen nach dem Reset wieder herstellen kann. Ich kann
nicht den Status jeweils in das EEProm schreiben weil es erstens zu
lange dauern würde und zweitens ich zu viele werte ständig sichern
müsste und wohl auch in absehbarer Zeit die max 100.000
Schreib/Lesezyklen des EEProm erreichen würde. Was bbleibt nach einem
Reset alles erhalten und gibt es sowas wie einen Reset-Interrupt?

schönes we @ all.
MfG Leo

Autor: Mario L. (dg1leo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...und noch mal zu der CKOPT-Fuse - der Tip war echt klasse - der
ATMEAGA macht wohl keine RESETS mehr - ist aber schon sehr gemein die
Fuse, so läuft alles normal bis der ATMEGA aus unerfindlichen Gründen
einen RESET macht - böse böse...
Ich glaub ich geh mal nen Kaffee trinken, irgendetwas stimmt mit meinen
Fingern oder meiner Tastatur nicht (Böse Buchstabendreher ;( )

Leo

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.