- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 13

Thema: IRremote auf einem 328P-PU @ 16MHz, 5V

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Könnte es an der Versorgung oder dem watchdog liegen?

    Eventuell die Fusebits kontrollieren.

    MFG Hannes

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Watchdog habe ich nicht aktiviert. Ist original Bootloader für einen UNO, nichts manipuliert. Die Motortreiber habe ich entfernt. Läuft alles auf Akku. Habe im Programm gerade noch einen Zähler eingebaut. Nun sehe ich am Zähler, dass der AVR immer nach dem dritten Schleifendurchlauf weg ist. Ein Schleifendurchlauf geht immer so in etwa, über I2C: ein Byte aus einem Array von dem AVR lesen, um einen Status zu erfahren, dann noch ein Byte daraus lesen, dann ein Byte ins Array auf dem AVR schreiben (das, was zu Anfang gelesen wurde). Diese Prozedur funktioniert ein Mal. Dann noch Mal und dann noch ein Mal, dann startet der AVR neu. Wenn ich jetzt die Prozedur neu anschubse, funktioniert das ein Mal und noch ein Mal, dann ist der AVR wieder weg.

    Das wird noch etwas dauern, bis ich das Problem gefunden habe.

    MfG

    - - - Aktualisiert - - -

    Den verfügbaren freien Variablen-Speicher habe ich auf 895 Bytes erhöht (keine Meldung - Warnung - von der Arduin-IDE). Vorher war der etwa bei 400 Bytes, da hat der AVR sich genau so verhalten.
    IR-Diode entfernt und Reset-Pin nochmals auf HIGH-Pegel gelegt - keine Änderung.

    - - - Aktualisiert - - -

    Habe jetzt einen neuen AVR genommen, Problem ist dasselbe. Also weiter suchen...

    - - - Aktualisiert - - -

    Fuses habe ich noch mal kontrolliert, da ist nichts eingeschaltet, was einen Reset hervorrufen könnte. BOD war auf 2.7V eingestellt (üblich). Ein 2936 versorgt nur diesen einen AVR. Max. Strom sind hier 50mA über den Regler. Kann mir aber nicht vorstellen, dass die 50mA überschritten werden. Ich hatte mal eine LED zum Testen an genau diesen AVR angeschlossen, wo schon mal 15mA extra für die LED verbraten wurden, das lief (die LED blinkte) über Stunden in einer Testsschleife. Auch jetzt läuft der AVR problemlos in einer Programmschleife, solange keine Kommunikation hinzukommt (hier i2c). Als ich das Programm aufgebaut habe, habe ich das nodeMCU 1.0 und den AVR im fliegenden Aufbau mit Steckern verbunden (AVR auf einem UNO-Board) damit ich serielle Ausgaben zum Testen benutzen konnte, ob die Kommunikation einwandfrei ist. Da ist das dann auch sehr lange Zeit gelaufen, ohne dass es zu Fehlern kam. Wenn ich jetzt den freien RAM-Speicher erhöhe, auf über 1400 Byte, schafft der AVR ein paar Zyklen mehr (wenn es vorher 2 oder 3 waren, sind es jetzt bis zu 9). Macht den Eindruck, als ob da Daten ein Stapel überläuft oder was anderes, durch sich ansammelnde Daten. Aber auch das kann eigentlich nicht möglich sein. Ich mache da nichts extravagantes im Programm, wie extra Speicher reservieren. Alles wird durch den Compiler erledigt. Arrays lege ich nicht zur Laufzeit an, sondern deklariere die im Quellcode (das Erstellen macht dann der Compiler) und die müssen auch nicht entfernt werden, die bleiben immer erhalten. Manchmal habe ich lokale Variablen in Funktionen, die natürlich dann Speicher benötigen und anschließend wird der Platz wieder freigegeben. Aber auch das erledigt der Compiler. Ich habe keine Ahnung , was da los ist. Leider finde ich keine List-Files, wo ich sehen könnte, was da compiliert wird. So kann ich das Ergebnis des Compilers nicht kontrollieren. Was ich jetzt wieder tun kann, dass ich das nodeMCU und den AVR wieder mal fliegend verknüddele und mit Serial.print dann die Vorgänge überprüfe, um genauer herauszufinden, an welcher Stelle der AVR dann rebootet.
    Geändert von Moppi (24.12.2020 um 08:41 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich konnte einige Ungereimtheiten finden, die der Verschachtelung von Programmcode geschuldet sind. Zumindest habe ich eine Erklärung für den Reboot. Der kann z.B. auftreten, wenn der Bytecodeinterpreter eine nicht existierende Funktion aufrufen soll. Normalerweise hat jedes Gerät (AVR) seine eigenen Funktionen und damit unterschiedlich viele. Wenn es nun, durch Kuddelmuddel der Sende-/Empfangspuffer bei der Verschachtelung von Programmcodes, der unterschiedlichen Kommunikationskanäle, zur falschen Adressierung von Codeblöcken kommt, kann das darin enden, dass ein AVR eine Funktion der Firmware aufruft, die nicht existiert (der Zeiger auf die Funktion ist dann mit Nullbytes belegt) und damit der AVR neu startet (allerdings nicht durch einen Hardware-Reset). So wie es aussieht, konnte ich das beheben. Allerdings habe ich div. Verbesserungen auch gleich auf den ESP8266 übertragen, jetzt macht der mal wieder Probleme, indem der einfriert, zumindest ist der Webserver per WLAN dann nicht erreichbar. Hier muss ich noch weitersuchen. Ich denke, dass IRremote noch funktionieren wird, aber das kann ich derzeit wegen der andern Probleme nicht genau sagen. Das werde ich später nochmals versuchen.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.211
    Was das ESP-Problem angeht: du weisst, dass man den ab und zu "warten" lassen muss (ich glaube, alle 20 ms), damit der einwandfrei läuft?
    Das brauchen die für die Kommunikation.
    https://stackoverflow.com/questions/...-yieldfunction
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Danke für den Hinweis! Aber, wegen der Frage: ja, ich weiß das. Deswegen baue überall yield() ein. Allerdings sind mir die 20ms neu. Da werde ich mal nach schauen.

    MfG

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Noch mal kurz zu IRremote:

    belegt bei mir ~380 Byte RAM, also fast 20% des verfügbaren RAM auf einem 328P. Und muss in kurzen Abständen immer wieder auf einen neue erkannten Code abgefragt werden. Am besten nimmt man dafür einen extra µC, nur für diese Aufgabe.

    MfG

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.211
    Das sollte doch funktionieren, wenn man den Code möglichst eindampft (keine Variablen grösser deklarieren als nötig, und immer schön lokale Variablen benutzen, wo das geht)...
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

Ähnliche Themen

  1. atmega 328P - Servomotor Steuerung
    Von ArduUser im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 11.04.2016, 07:11
  2. Antworten: 0
    Letzter Beitrag: 15.01.2016, 17:16
  3. Baby Orangutan B-328p
    Von hunikuni im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 25.05.2012, 20:58
  4. Immer diese Fuses ... Atmega 328p
    Von Sebas im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 16.05.2012, 18:18
  5. 16Mhz Quarz schwingt von einem Tag auf anderen nicht korrekt
    Von Frank im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 03.06.2004, 21:04

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test