Runtime counter

Arduino specifieke Software
Berichten: 68
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Runtime counter

Berichtdoor Creator » 26 Jul 2022, 19:22

Nico,

Inmiddels ongeveer de hele Github site uitgespit naar Fram libraries en ik heb er wat gevonden, meer dan 20 die mogelijk konden werken.
Echter alle inmiddels geprobeerd maar geen enkele doet wat Blabz laat zien op zijn YouTube kanaal.
De library van "battosai30" werkt in zoverre dat de sketch laadt en runt.....
...alleen de tijd gaat 2 seconden omhoog per seconde (dus loopt 2x te snel) zo kom je snel op een fiks aantal werkuren.
...bij opnieuw de stroom erop begint de teller weer op nul, de reset button werkt wel.

mogelijke oorzaak (volgens mij)
...de data wordt niet geschreven naar de FRAM op het breakoutboard omdat dit een nieuwere versie fram is dan gebruikt in het origineel
...de Fram is stuk? krijg bij test examples geen return waarde op serieele monitor

Vanmiddag een fram besteld van 16kb zoals autheur heeft gebruikt, misschen dat dat ermee te maken heeft.

Als ik meer weet zal ik het melden

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Runtime counter

Berichtdoor nicoverduin » 01 Aug 2022, 08:18

Dat jouw seconden teller uitloopt klopt wel. Door gebruik te maken van de delay(250) doet de processor sowieso niets. Daarnaast voer je allerlei code uit roep jje allerlei functies aan. Daar verlies je met de loop cycle ook nog eens heel veel tijd. Wil je een "redelijk" betrouwbare teller gebruiken dan moet je eens kijken naar blink_without_delay. En dan nog moet je die delay definitie tweaken om te compenseren voor de code die in de loop uitgevoerd wordt.
Je krijgt met Blink_without_delay ahw 2 processen die "pseudo" parallel draaien. De ene die de tijd bijhoudt via millis(). De ander die allerlei stappen uitvoert mits deze binnen de 1 seconde (in jouw geval) worden uitgevoerd.
Een klok IC is meestal al een stuk betrouwbaarder.
En je kan er ook nog eens een "state machine" van maken. Dan kan je verschillende timings gebruiken per procesje
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 68
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Runtime counter

Berichtdoor Creator » 02 Aug 2022, 09:33

Dank voor je reactie Nico,

Ik ben momenteel bezig alle overbodige code eruit te gooien zoals;
- display SPI of I2C keuze
- blinking van interne led
- runonce leegmaken fram bij opstarten
en de klok met uitvoer naar display correct te krijgen. Denk daarbij aan een uint32_t millis timer ipv unsigned int counter10Sec.
ik ga zeker kijken naar blink without delay en wat ik daarmee kan.

Berichten: 68
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Runtime counter

Berichtdoor Creator » 02 Aug 2022, 13:28

Na wat te hebben gerommeld in de code ben ik toch wat wverder gekomen en e.e.a. werkend gekregen.

De gebruikte bibliotheek voor de FRAM is van battosai30 "FRAM_master" deze geeft geen fouten bij het compileren maar laat ook niet lezen of shrijven naar de fram.
Mijn volgende uitdaging wordt de .h en .cpp codes ontleden.

De originele sketch aangepast door:
- unsigned int counter10Sec te vervangen voor unsigned long previousMillis = 0;
- blink_without_delay geïmplementeert voor stabiele tijd weergave;
- de interne led blinking code verwijderd;
- de code voor SPI of I2C keuze Oled display verwijderd (gebruik alleen I2C interface);
- de eenmalige reset van de Fram verwijderd.

Wire begin(); is niet opgenomen omdat deze wordt geinitieerd door de <fram.h> lib.
Nu werkt de tijdtelling correct per sec op het display.
De reset knop op pin 2 werkt, echter alleeen op het interne geheugen van de pro-mini niet
met de Fram chip.
Geen communicatie, schrijft en leest niet naar de Fram module, daardoor bij stroom eraf alles op nul.
Mogelijk beperkingen in de library van de FRAM.

De huidige sketch volgt hier.
Code: Alles selecteren
   Hardware voor deze setup is:
   - Mini 360 (Step down converter van In 4.75 - 23V / Out 1-17V instelbaar.
   - Arduino pro mini 5V.
   - FRAM I2C breakout board (Adafruit MB85RC256V chipset).address 0x50
   - 0,91 I2C Oled 128x32 display.
*/

#include <Wire.h>                 // library for I2C communication
#include <FRAM.h>                 // library for Fram read/write to memory access
#include <U8g2lib.h>              // library for SSD1306 Oled display

#define LOC_SEC 0                 //Locations in memory: Address
#define LOC_MIN 4                 //zijn deze addressen juist voor de MB85RC256V chipset?
#define LOC_HRL 8
#define LOC_HRM 12

unsigned int  prHr;               //16 bits 2 byte integer voor uren (0 - 65535)
unsigned char prSec, prMin;       //8 bits 1 byte (0- 255)voor minuten en seconden
unsigned char clearCtr;           //8 bits 1 byte (0- 255)voor sec tellen reset button
unsigned long previousMillis = 0; //staat laatste keer update sec op

const long interval = 1000;       //interval 1 sec (1000 milliseconds)

FRAM fram(0x50);                  //Fram breakout address MB85RC256V
#define FRAM_PAGE 0               //fram begin pagina

#define CLEAR_PIN 2               //Pin waarop de reset knop wordt aangesloten gebruikt interne pull-up weerstand
#undef RUNONCE                    //enable reset function bij pressing button for 3 secs

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R2, /* reset=*/ U8X8_PIN_NONE);  // Adafruit ESP8266/32u4/ARM Boards + FeatherWing OLED

void getHM();                    // function gets the hour meter values from FRAM location


void setup()
{
  u8g2.begin();                           // Initiate the display
  u8g2.clearBuffer();                     // clear the internal memory
  u8g2.setFont(u8g2_font_crox4h_tf );     // choose a suitable font
  u8g2.drawStr(5, 20, "CFSolutions");     // write text to the internal memory
  u8g2.sendBuffer();                      // transfer internal memory to the display

  pinMode(CLEAR_PIN, INPUT);              // Config switch pin
  delay(2000);                            // Tijd voor tekst openings scherm display
  getHM();                                // Get the value from FRAM
  printTime();                            // Display on Screen
}


void loop()
{
  unsigned long currentMillis = millis(); //de tijdteller werkt nauwkeuriger
  if (currentMillis - previousMillis >= interval) //zorgt dat iedere sec telt
  {
    previousMillis = currentMillis;       //een simpele klok functie
    if (prSec < 59)prSec++;               //telt tot 60 sec
    else
    {
      prSec = 0;
      if (prMin < 59)prMin++;             // telt tot 60 min
      else
      {
        prMin = 0;
        if (prHr < 9999)prHr++;          //telt tot 9999 uren (416 dgn) en reset zichzelf dan
        else prHr = 0;
      }
    }
    writeHM(prHr, prMin, prSec);          // Write to FRAM (doet dit nie!!!)
    printTime();                          // Display the time (werkt prima)
  }

  if (digitalRead(CLEAR_PIN) == 0)        //If the clear Switch is pressed and held for 3 seconds clear the values
  { //deze funtie werkt maar alleen voor het interne geheugen op de pro mini
    clearCtr++;
  }
  else clearCtr = 0;
  if (clearCtr == 3)                      //Clear after 3 second of continious press
  { // Reset memory to zero
    fram.WriteByte(FRAM_PAGE, LOC_SEC, 0);
    fram.WriteByte(FRAM_PAGE, LOC_MIN, 0);
    fram.WriteByte(FRAM_PAGE, LOC_HRL, 0);
    fram.WriteByte(FRAM_PAGE, LOC_HRM, 0);
    getHM();                               // Get the value after reset
  }
}

//This function writes the value into FRAM
//Deze funtie werkt niet mogelijk zijn de addressen niet juist??
void writeHM(unsigned int hmHour, unsigned char hmMin, unsigned char hmSec)
{
  fram.WriteByte(FRAM_PAGE, LOC_SEC, hmSec);
  fram.WriteByte(FRAM_PAGE, LOC_MIN, hmMin);
  fram.WriteByte(FRAM_PAGE, LOC_HRL, hmHour & 0xff);
  fram.WriteByte(FRAM_PAGE, LOC_HRM, (hmHour & 0xff00) >> 8);
}

//This function gets value from FRAM.
//Deze funtie werkt niet mogelijk zijn de addressen niet juist??
void getHM()
//Hour variable is a 16 bit
{
  prSec = fram.ReadByte(FRAM_PAGE, LOC_SEC);
  prMin = fram.ReadByte(FRAM_PAGE, LOC_MIN);
  prHr  = ((fram.ReadByte(FRAM_PAGE, LOC_HRM)) << 8 | (fram.ReadByte(FRAM_PAGE, LOC_HRL)));
}

//This functions builds string to move it to u8g2 on SSD1306
//dit werkt prima
#define countof(a) (sizeof(a) / sizeof(a[0]))
void printTime()
{
  char hourmeterString[11];
  snprintf_P(hourmeterString,
             countof(hourmeterString),
             PSTR("%04u:%02u:%02u"),
             prHr,
             prMin,
             prSec );
  u8g2.clearBuffer();                   // clear the internal memory
  u8g2.setFont(u8g2_font_helvR18_tn );  // choose a suitable font
  u8g2.drawStr(5, 22, hourmeterString); // write the constructed time value to internal memory
  u8g2.sendBuffer();                    // transfer internal memory to the display
}

Berichten: 68
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Runtime counter

Berichtdoor Creator » 09 Aug 2022, 19:43

Een update van de voortgang.
Een nieuwe Fram breakoutboard gekocht en aangesloten, de Adafruit_I2C library voor de MB85RC256V geladen en uitgevoerd. Op de serieële monitor geeft deze de communicatie en geheugenplaatsen weer dus dat werkt. Ook nog even de oude fram aangesloten en gestest, die blijkt dus ook prima te werken (waarom eerder niet????).

Momenteel heb ik twee gelijke setups gemaakt een met de oude Fram en oude pro mini een met de nieuwe Fram en een nieuwe pro mini, beide met 0.91inch oled display en gevoed via de usb - ttl print.

Nu iets wat ik niet kan begrijpen of verklaren.
Beide pro mini's geladen met dezelfde sketch (de laatste gepost).
De oude setup geeft op de display het startup scherm en begint daarna de seconden te tellen en loopt prima droor.
De nieuwe setup geeft op de display het startup scherm en daarna 0000.00.00 en blijft in deze status.
How can???

Bij beide wordt trouwens niets naar het fram geheugen geschreven of uitgelezen.
Bij het uitpluizen van de .cpp en .h lib kon ik niet vinden wat er veranderd zou moeten worden om dit gedaan te krijgen.

Ik loop krakend vast op dit projectje.
Wie heeft een suggestie???

Berichten: 3845
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Runtime counter

Berichtdoor shooter » 10 Aug 2022, 06:04

er staat een get fram (nou ja HM in) wellicht is 1 ram wel gezet en de andere leeg
paul deelen
shooter@home.nl

Berichten: 44
Geregistreerd: 04 Sep 2021, 08:31

Re: Runtime counter

Berichtdoor RobGood » 10 Aug 2022, 13:10

Die oled displeetjes op scl en sda moeten 2 10k pullups zijn geplaatst. Soms doet het display het prima zonder soms niet....
Rob

Berichten: 68
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Runtime counter

Berichtdoor Creator » 10 Aug 2022, 14:24

Ok nogmaals op beide setups de voorbeelden van de Adafruit_I2C library voor de FRAM MB85RC256V gedraaid en beide testen ze prima op alle fronten.
Hierna de sketch geladen in beide pro mini's en..... Murphy moet langs zijn gekoen want beide tellen weer de tijd en geven dit correct op de displays weer.

Dus dat probleem is nu weer de wereld uit.

Paul,
De ontwerper van deze sketch heeft twee subfuncties gemaakt nl. void getHM(); en void writeHM;
Nu heeft hij de eerste in de declaratie sectie geplaatst en de functie aan het einde van de sketch.
De tweede is niet gedeclareert en is onderdeel van de loop.
Nu gebruikt hij voor de tijd die op de display komt prHr, PrMin en prSec en zet deze om met writeHM naar hmHour, hmMin en hmSec om naar de fram te schrijven.
Via de getHM(); zou nu de geschreven tijd weer opgehaald moeten worden en als prHr, prMin en prSec weer getoond moeten worden.
Ergens gaat hier iets fout, maar ik kan mijn vinger er niet op krijgen.

Rob,
de oled is het probleem niet die doet prima wat er verlangt wordt, geen probleem met pull-up weerstanden.

Ben iets verder gekomen maar nog lang niet bij een oplossing ;)

Gebruikers-avatar
Berichten: 235
Geregistreerd: 22 Jan 2013, 16:40

Re: Runtime counter

Berichtdoor zuid » 10 Aug 2022, 18:06

Zou het kunnen zijn dat de Fram bij een WriteByte niet het juiste resultaat geeft omdat de Pro Mini een 32 bit machine is ?

Probeer bij het schrijven en lezen van uren eens een WirteInt resp. ReadInt
mvg Nico
PS Testen met alleen de code blijft lastig :)

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten