Arduino DUO läuft fast mit Lazarus.

Mathias
Beiträge: 5224
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Arduino DUO läuft fast mit Lazarus.

Beitrag von Mathias »

Ich habe schon im englischen Forum über den Arduino DUE diskutiert: https://forum.lazarus.freepascal.org/in ... 11.15.html

Jetzt habe ich es fast hingekriegt, jetzt startet das Programm sofort nach dem Hochladen, auch startet es auch sofort, sobald der DUE Strom bekommt.
Als Test-Programm, habe ich einen einfachen Blinker.

Aber jetzt hat der DUE ein ganz komischen Manko. Das Programm läuft etwa 10 Sekunden, dann unterbricht es, auch etwa für 10 Sekunden, dann startet es wieder, usw.

Ich verwende jetzt Bossac 1.9.1

Hat da noch einer ein Rat ?

Mit folgende Parameter hat der DUE jetzt das Manko:

Code: Alles auswählen

/bin/bossac -e -b -s -R -v -w Project1.bin  

Code: Alles auswählen

program Project1;

{$H-,J-,O-}

uses
  cortexm3;

  procedure Delay;
  var
    i: uint32;
  begin
    for i := 0 to 10000 do begin
      asm
               Nop // Leerbefehl
      end;
    end;
  end;

const
  led = 1 shl 27;

begin
  PIOB.PER := led;
  PIOB.OER := led;

  repeat
    // Pin13 -- High
    PIOB.SODR := led;
    Delay;

    // Pin13 -- Low
    PIOB.CODR := led;
    Delay;
  until False;
end.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 554
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von siro »

Könnte es sein, dass der Watchdog vom Prozessor zuschlägt ?
Slow Clock 32768 Hz / 128 = 256
Der Watchdog Timer hat 12 Bit, er zählt also 4096 Schritte.
das wären dann 16 Sekunden.

WDDIS Bit im Watchdog Timer Register WDT_MR auf 1 setzen um den Watchdog abzuschalten.

Oder im Hauptprogramm den Watchdog entsprechend bedienen:
In normal operation, the user reloads the Watchdog at regular intervals before the timer underflow occurs, by
writing the Control Register (WDT_CR) with the bit WDRSTT to 1.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 5224
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von Mathias »

Ich habe gerade geguckt, die 16 Sekunden könnte stimmen.
Diesen Timer abzustellen, werde ich bei Gelegenheit testen.

Aber, was ist der Sinn daran, das per default, alle 16 Sekunden das Programm unterbrochen wird ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5066
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von af0815 »

Ein Watchdog soll sicherstellen, das das Programm wirklich läuft. Ansonsten kann man davon ausgehen, das da Programm hängt. Stell dir eine Temperatursteuerung vor, die aus einen blöden Grund hängt und voll ansteuert. Besser ein externer Prozess startet alles neu, damit der gewohnet Zustand wieder hergestellt werden kann.

Watchdogs sind nicht so selten, man muss nur lernen damit umzugehen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1066
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von fliegermichl »

Dein Programm muss den Watchdog regelmäßig zurücksetzen. Dann läuft das Programm auch weiter.

Mathias
Beiträge: 5224
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von Mathias »

Dank eurer Hilfe, bin ich nun einen Schritt weiter gekommen, ich habe beim initialisieren folgendes gemacht:

Code: Alles auswählen

  WDT.CR := 0;
Jetzt scheint die LED endlos zu blinken.

Auch beim neusten Bossac (1.9.1) habe ich noch den Parameter "-a" gefunden, welcher einem das LEben einfacher macht, jetzt ist es nicht mehr nötig mit einem Geflicke den Com-Port zurück zu setzen.

Code: Alles auswählen

/bin/bossac -v -b -s -R -a -w Project1.bin
So wie ich eure Kommentare gelesen habe, macht so ein Watchdog echt Sinn. Es kann ja mal sein, das der Controller sich aufhängt, weil er auf Daten von I²C erwartet und nicht weiter macht, weil ein Kabel defekt ist. Somit hätte man mit Watchdog die Möglichkeit, eine rote LED zum leuchten zu bringen. Bei einem AVR, könnte man sowas sicher auch mit einem Timer lösen.

Was mich verwundert, wieso schaltet der DUE standardmässig Watchdog ein, nach meiner Meinung macht der WD erst Sinn, wen man auch eine eigene Interrupt Unterbrechung hat.
Oder auch, wieso geht es ganze 16 Sekunden, bis das Programm auf dem DUE wieder startet.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 5224
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von Mathias »

Ich wollte vorhin in der Sourcen von Arduino rumschmökern. wie die Watchdog handhaben, da bin ich aber bei externen Funktionen stecken geblieben.
ZB. wollte ich wissen, wie watchdogReset(void); funktioniert.

Code: Alles auswählen

#ifndef _WDT_
#define _WDT_

#include "../chip.h"

#include <stdint.h>

#ifdef __cplusplus
 extern "C" {
#endif

/*----------------------------------------------------------------------------
 *        Exported functions
 *----------------------------------------------------------------------------*/

extern void WDT_Enable( Wdt* pWDT, uint32_t dwMode ) ;

extern void WDT_Disable( Wdt* pWDT ) ;

extern void WDT_Restart( Wdt* pWDT ) ;

extern uint32_t WDT_GetStatus( Wdt* pWDT ) ;

extern uint32_t WDT_GetPeriod( uint32_t dwMs ) ;

#ifdef __cplusplus
}
#endif

#endif /* #ifndef _WDT_ */

Hat einer von euch Anhaltspunkte, wie ich da die Watchdog Befehle komme ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3040
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von Socke »

Mathias hat geschrieben:
Fr 6. Mai 2022, 17:18
Ich wollte vorhin in der Sourcen von Arduino rumschmökern. wie die Watchdog handhaben, da bin ich aber bei externen Funktionen stecken geblieben.
ZB. wollte ich wissen, wie watchdogReset(void); funktioniert.
Durchsuch mal die Dateien in den Arduino-Verzeichnissen nach watchdogReset. Hier im Header steht ja nur, dass es extern dazu gelinkt wird - also müssen sie irgendwo auftauchen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

siro
Beiträge: 554
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von siro »

Info:
Wichtig ist, dass der Watchdog NIEMALS in Interrupt Funktionen bedient wird,
denn ein Timer Interrupt könnte noch regelmässig auftreten, aber das Hauptprogramm steht irgendwo.
Deshalb wird der Watchdog nur vom Haupprogramm oder aber auch von Unterprogrammen bedient.

Wenns irgendwo stockt, dann wird ein Watchdog Reset ausgelöst.
Normalerweise (so habe ich das immer eingebaut) kann nach einem Reset ermittelt werden wer der Verursacher war.

Reset Controller Status Register

0 0 0 General Reset First power-up Reset
0 0 1 Backup Reset Return from Backup mode
0 1 0 Watchdog Reset Watchdog fault occurred
0 1 1 Software Reset Processor reset required by the software
1 0 0 User Reset NRST pin detected low

Während der Softwareentwicklung und Debugging schalte ich aber meist den Watchdog aus, da er hier oftmals nur stört.
Wenn alles fertig ist, wird an ganz gezielten Punkten der Watchdog bedient.
Den Intervall wähle ich dann der Anwendung entsprechend aus.
16 Sekunden ist vermutlich eher Blödsinn.
Ich habe meist Zeiten von z.B. 25 bis 50 Millisekunden.
Nirgends in meiner Software sollte bei mir eine Schleife länger als 25ms fest hängen.
Das ist natürlich je nach Anwendung völlig unterschiedlich.

Bei nicht sicherheistkritischen Anwendungen kann man den Watchdog natürlich auch ganz ausschalten.

Der Watchdog im DUE ist standardmässig eingeschaltet und der Zeitgeber (Downcounter) auf den höchsten Wert gesetzt.
bei 12 Bit also 0x0FFF.
Den Intervall kannst Du dann in ca. 4ms (0,00390625s) Schritten auswählen.

Wo die Watchdog Funktion Funktion definiert kann ich Dir nicht sagen, das ist ja sicher nur eine Zeite mit einen Portbefehl wo ein Bit gesetzt wird.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 5224
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von Mathias »

Mathias hat geschrieben:
Fr 6. Mai 2022, 16:41
Dank eurer Hilfe, bin ich nun einen Schritt weiter gekommen, ich habe beim initialisieren folgendes gemacht:

Code: Alles auswählen

  WDT.CR := 0;
Jetzt scheint die LED endlos zu blinken.

Auch beim neusten Bossac (1.9.1) habe ich noch den Parameter "-a" gefunden, welcher einem das LEben einfacher macht, jetzt ist es nicht mehr nötig mit einem Geflicke den Com-Port zurück zu setzen.

Code: Alles auswählen

/bin/bossac -v -b -s -R -a -w Project1.bin
So wie ich eure Kommentare gelesen habe, macht so ein Watchdog echt Sinn. Es kann ja mal sein, das der Controller sich aufhängt, weil er auf Daten von I²C erwartet und nicht weiter macht, weil ein Kabel defekt ist. Somit hätte man mit Watchdog die Möglichkeit, eine rote LED zum leuchten zu bringen. Bei einem AVR, könnte man sowas sicher auch mit einem Timer lösen.

Was mich verwundert, wieso schaltet der DUE standardmässig Watchdog ein, nach meiner Meinung macht der WD erst Sinn, wen man auch eine eigene Interrupt Unterbrechung hat.
Oder auch, wieso geht es ganze 16 Sekunden, bis das Programm auf dem DUE wieder startet.
Ich habe mich zu früh gefreut. :evil:
Folgender Code funktioniert, die LED blinkt endlos.

Code: Alles auswählen

program Project1;

{$H-,J-,O-}

uses
  cortexm3;

  procedure Delay;
  var
    i: uint32;
  begin
    for i := 0 to 10000 do begin
      asm
                Nop // Leerbefehl
      end;
    end;
  end;

const
  led = 1 shl 27;

begin
  PIOB.PER := led;
  PIOB.OER := led;

  WDT.CR := 0; // Watchdog deaktivieren

  repeat
    // Pin13 --> High
    PIOB.SODR := led;
    Delay;

    // Pin13 --> Low
    PIOB.CODR := led;
    Delay;
  until False;
end.
Vergrössere ich das Delay um den Faktor 10, greift der Watchdog wieder ein. :roll:
Wieso ?

Code: Alles auswählen

  procedure Delay;
  var
    i: uint32;
  begin
    for i := 0 to 100000 do begin // 10x langsamer, Watchdog greift.
      asm
                Nop // Leerbefehl
      end;
    end;
  end;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 5224
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von Mathias »

Ich habe die Arduino Source durchforscht, und nach denen müsste es so aussehen, für eine Deaktivierung:

Code: Alles auswählen

  WDT.MR := 1 shl 15;  // Watchdog deaktivieren
Und es scheint zu funktionieren.

Folgendes habe ich gefunden:
component_wdt.h

Code: Alles auswählen

#define WDT_MR_WDDIS (0x1u << 15) /**< \brief (WDT_MR) Watchdog Disable */
wdt.c

Code: Alles auswählen

extern void WDT_Disable( Wdt* pWDT )
{
    pWDT->WDT_MR = WDT_MR_WDDIS;
}
Noch interessant, für das Timeout:
watchdog.cpp

Code: Alles auswählen

void watchdogEnable (uint32_t timeout)
{
	/* this assumes the slow clock is running at 32.768 kHz
	   watchdog frequency is therefore 32768 / 128 = 256 Hz */
	timeout = timeout * 256 / 1000; 
	if (timeout == 0)
		timeout = 1;
	else if (timeout > 0xFFF)
		timeout = 0xFFF;
	timeout = WDT_MR_WDRSTEN | WDT_MR_WDV(timeout) | WDT_MR_WDD(timeout);
	WDT_Enable (WDT, timeout);
}
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 554
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von siro »

Hallo Mathias,
warum ist das ein "C" Code ? :shock:

folgender Code sollte eigentlich funktionieren, dann brauchst Du keine extra Datei:

Code: Alles auswählen

var WDT_MR : DWORD absolute $400E1A54;  // Das Watchdog Timer Mode Register befindet sich an dieser Adresse 
im Hauptprogramm dann:

Code: Alles auswählen

WDT_MR := 1 SHL 15;  // WDIS Bit muss 1 sein damit der Watchdog ausgeschaltet wird. 
-----------------------------------------------------------------------------------
Wenn Du den Watchdog bedienen möchtest, dann muss in regelmässigen Abständen das WDRSTT Bit gesetzt werden.
Hier muss man jedoch eine Besonderheit beachten.
Damit nicht versehentlich dieses Bit gesetzt wird, muss man im oberen Byte des 32 Bit Wertes einen konstanten Code mit anfügen,
so habe ich es zumindest im Datenblatt verstanden.
0xA5 damit ergibt sich zum Watchdog bedienen folgender Code:

Code: Alles auswählen

var WDT_CR : DWORD absolute $400E1A50;

WDT_CR:= ($A5 SHL 24) +1;  // Bit 24..31 Key,  Bit 0 ist das WDRSTT Bit
-------------------------------------------------------------------------------
[EDIT] Du hattest es ja schon geklärt, ich war so im Eifer des Gefechts...... :)
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 5224
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von Mathias »

Was ich nicht einsehe, wieso erfindest du WDT.MR und CR neu ?
Diese Register sind schon in der sam3x8.pp von fpc deklariert.

Irgendwie, wird der DUE immer spannender.

So nebenbei, wen man wieder mal etwas total unleserliches in C sehen will, ist die "component_wdt.h" ideal, :roll:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 554
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von siro »

Mathias hat geschrieben:
So 8. Mai 2022, 10:40
Was ich nicht einsehe, wieso erfindest du WDT.MR und CR neu ?
Diese Register sind schon in der sam3x8.pp von fpc deklariert.
Weil ich mit dem Arduinos noch nie etwas gemacht habe und daher auch keine entsprechenden Dateien auf dem Rechner habe :wink:
Konnte also nicht nachgucken was da schon definiert ist und was nicht. Zudem schreibe ich IMMER alles neu, habe noch nie Bibliotheken verwendet. :oops: zum mindest im Embedded Bereich
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 5224
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von Mathias »

Ich schreibe auch lieber selbst, als fremde Pakete einzubinden.
Nur die sam3x8.pp ist bei FPC dabei, man muss sie nicht mal mit Uses einbinden. Diese Datei hast du sicher auch auf deinem Rechner, ausser du hast kein FPC/Lazarus installiert.
Ich habe schon versucht den Raspi Pico nativ zu programmieren, nur das braucht es so eine doofe *.obj, welche mal mit C++ erstellt wurde, ohne diese, kann FPC nicht mal kompilieren.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Antworten