Runtime counter

Arduino specifieke Software
Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Runtime counter

Berichtdoor zuid » 15 Aug 2022, 21:32

Ik denk dat de locaties 0, 4, 8 en 12 byte adressen zijn.
Er is dus ruimte voor 4 bytes met ieder 8 bits (dus 32 bits per item)

Als nu de bibliotheek is geschreven voor een 16 bits computer zullen 2 bytes waarschijnlijk NIET worden weggeschreven.

Weggeschreven worden de linker 2 bytes en die zijn bij sec. min en uren altijd nul.
Je zou dit kunnen testen door het getal 66000 op te tellen bij de sec, min en uren vlak voor de WriteByte.



m.v.g. Nico

Advertisement

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

Re: Runtime counter

Berichtdoor shooter » 16 Aug 2022, 06:15

nico wil je dit even uitleggen want een int kan 16 maar ook 32 bits breed zijn :
On the Arduino Uno (and other ATmega based boards) an int stores a 16-bit (2-byte) value. This yields a range of -32,768 to 32,767 (minimum value of -2^15 and a maximum value of (2^15) - 1). On the Arduino Due and SAMD based boards (like MKR1000 and Zero), an int stores a 32-bit (4-byte) value. This yields a range of -2,147,483,648 to 2,147,483,647 (minimum value of -2^31 and a maximum value of (2^31) - 1).
paul deelen
shooter@home.nl

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

Re: Runtime counter

Berichtdoor zuid » 16 Aug 2022, 18:13

In het project zijn nog al wat onbekende factoren.
Zoals: welke hardware werd gebruikt in het oorspronkelijke project en welke bibliotheek werd daarbij gebruikt.

Ik begreep dat het voorbeeld uit de Adafruit bibliotheek inclusief FRAM correct werkt.
Als ik het voorbeeld bekijk begrijp ik dat dit een voorbeeld is waarbij uint8_t test wordt geschreven naar de FRAM.
Dus een byte van 8 bits!

In de opstelling met het op internet gevonden project worden de adressen 0 4 8 12 gebruikt.
Ik neem dan aan dat er 4 bytes van 8 bit naar de FRAM moeten worden geschreven dus bijvoorbeeld een integer van 32 bits.
Dus als gevraagd wordt schrijf naar adres 0 vult de software van de bibliotheek waarschijnlijk ook adres 1, 2 en 3 met info

Kennelijk snapt de nu gevonden bibliotheek deze opgave niet (het werkt in ieder geval niet)
Wel moeten we ons realiseren dat er relatief kleine getallen moeten worden geschreven naar de FRAM.
Van de 32 aangeboden bits is een groot deel 0 en alleen het vierde 8 bits deel van de 32 bits bevat eventueel ook data.

Om uit te proberen heb ik voorgesteld als test een groot getal op te tellen bij de weg te schrijven waarde (testen met een groot constant getal kan ook)
Bij een groot getal zal ook in de eerste 8 of 16 bits iets geschreven moeten worden.
Hiermee zou aangetoond kunnen worden dat de bibliotheek niet werkt voor het schrijven 32 bits maar alleen voor 8 of 16 bits eenheden.

m.v.g. Nico

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

Re: Runtime counter

Berichtdoor Creator » 16 Aug 2022, 19:03

Even wat feiten v.w.b. de originele hardware.
Inmiddels van de autheur reactie gehad dat hij gebruik heeft gemaakt van de FRAM_master library van B@ttosai30
https://github.com/battosai30/FRAM/blob/master/FRAM.h

Het gebruikte geheugen is de FM24C04B chip welke 4Kb geheugen heeft verdeeld over 8bits met 512 adressen (1 byte).
Dat is misschien de reden dat de adressen niet worden gevonden door de MB85RC256.
Dat is nl een 256Kb 32Byte geheugen met mogelijk een hele andere adressering..

Daardoor denk ik dat de adressen die gebruikt zijn bit adressen zijn.
#define FRAM_PAGE 0
#define LOC_SEC 0
#define LOC_MIN 4
#define LOC_HRL 8
#define LOC_HRM 12


Het geheugen is immers 1 byte groot of zie ik dat verkeerd?

Inmiddels wacht ik op de levering van de FM24C04B chip om de originele setup te maken.
Verder is gebruik gemaakt van:
- mini360 step down buck om 5V te maken voor de componenten;
- Pro Mini 5V versie (voeding op RAW en GND)
- Oled 0,91 display (voeding van VCC en GND op Pro Mini, SCL en SDA van pin A4 en A5);
- Fram idem als Oled (natuurlijk met 2 4,7K weerstanden en een 0.1uf condensator).

Even over je opmerking over de adafruit fram.
ja die is getest met de library van adafruit, maar dat heb ik gedaan om zeker te zijn dat de fram goed is.
Ja je heb gelijk dat de library van battosai niet werkt.
Nu moet ik dus uitzoeken hoe spreek ik de 256Kb fram aan, alternatief is wachten op de 4Kb fram en dan testen hoe het dan gaat.

Maar iets in mij wil niet accepteren dat ik het niet werkend krijg op de MB85RC256 chip.

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

Re: Runtime counter

Berichtdoor Creator » 17 Aug 2022, 11:04

Een correctie op mijn vorige bericht.

De library van Battosai is geschreven voor de FM24C04B chip van 4Kb (512 x 8 bits)
Maar de gebruikte chip in het origineel is de FM25L16B met 16Kb geheugen (2,048 x 8 bits)
In het you tube filmpje van B-labs https://www.youtube.com/watch?v=rcMyQqEP7-I&t=1s
lijkt het allemaal te werken.

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

Re: Runtime counter

Berichtdoor Creator » 20 Aug 2022, 11:05

We gaan het even helemaal anders doen.
In afwachting van de bestelde FM25L16B fram zet ik de originele sketch in de wacht.

Omdat ik niet kan accepteren dat het breakoutboard met de MB85RC256 chip niet wil doen wat ik wil met de huidige sketch.
Ga ik proberen de sketch te herschrijven zodat deze met de MB85RC256 en de library van Rob Tillaard "FRAM_I2C" overweg kan, althans dat is de bedoeling ;) .
Beter van scratch af te beginnen dan rond te blijven dwalen in het huidige.

De hardware welke is gebruikt is;
- Arduino Pro Mini 5V (voeding via Usb to TTL board)
- Oled 0,91" display I2C comms (voeding via VCC, GND van Pro Mini, SCL op pin A5 en SDA op pin A4)
Dit kan ook met een Uno of Nano of een ander board.

Als eerste heb ik de klok en display gedeelte aangepast zoals hieronder weergegeven.
Code: Alles selecteren
/*
   Aanpassing code 08-2022
   Draaiuren teller voor diverse apparaten zoals 3D printer, Laser enz.
   Hardware voor deze setup is:
   - Arduino pro mini 5V.
   - 0,91 I2C Oled 128x32 display.
  Dit is een deel van de code om de tijd te presenteren op de oled display en de interne led te laten knipperen 1 sec aan, 1 sec uit.
  Het volgende  wordt de implementatie van de Fram chip voor opslag van de tijden.
*/

#include <Wire.h>                   // library for I2C communication
#include <U8g2lib.h>               // library for SSD1306 Oled display

uint8_t prSec;                          // 8bit (1Byte) numeriek voor seconden
uint8_t prMin;                          // 8bit (1Byte) numeriek voor minuten
uint16_t prHr;                          // 16bit (2Byte) numeriek voor uren (max 9999)

// Simpele teller voor klokfunctie
unsigned long previousMillis = 0; //set de teller initieel op nul
const long interval = 1000;         //interval 1 sec (1000 milliseconds)

const int ledPin = LED_BUILTIN;  //gebruik interne led 
int ledState = LOW;                    //uitgangspositie led uit

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



void setup()
{
  Wire.begin();                                            // Initate / start I2C comms
  u8g2.begin();                                           // Initiate / start 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
  delay(2000);                                           // Tijd voor tekst openings scherm display
  pinMode(ledPin, OUTPUT);                        // config led
}

void loop()
{
  unsigned long currentMillis = millis();           //de tijdteller werkt nauwkeuriger
  if (currentMillis - previousMillis >= interval)  //zorgt dat iedere sec telt
  {
    previousMillis = currentMillis;                    //verifeert een seconde verloop
     
                                                                  // de klok voor de tijd weergave en data voor opslag
    if (prSec < 59)prSec++;                          //telt tot 60 sec
    else
    {
      prSec = 0;
      if (prMin < 59)prMin++;                        // telt tot 60 min
      else
      {
        prMin = 0;
        if (prHr < 0xFFFF)prHr++;                   // telt tot 16 bits op 1 staan
        else prHr = 0;
      }
    }
    previousMillis = currentMillis;                   // verifeert een seconde verloop
    printTime();                                           // Display the time (call subfuntion)
    digitalWrite(ledPin, ledState);                  // set the LED with the ledState of the variable: 
                                                                 // laat de led knipperen op de Pro Mini
    if (ledState == LOW)
    {
      ledState = HIGH;                                   //led 1 sec aan
    }
    else
    {
      ledState = LOW;                                    //led 1 sec uit
    }
  }
}

#define countof(a) (sizeof(a) / sizeof(a[0]))   // gebruikt voor dispay tijd icm "printTime"
void printTime()
{
  char hourmeterString[11];                          // bepaal lengte string
  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, 21, hourmeterString);       // write the constructed time value to internal memory
  u8g2.sendBuffer();                                    // transfer internal memory to the display
}



Nu ben ik benieuwd of dit volgens de kenners op een juiste manier is geschreven.
Wat zou ik anders moeten doen?

Volgende wordt het invoegen van de Fram code sectie.

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

Re: Runtime counter

Berichtdoor RobGood » 20 Aug 2022, 11:16

Hi Creator,
unsigned long currentMillis = millis(); //de tijdteller werkt nauwkeuriger
if (currentMillis - previousMillis >= interval) //zorgt dat iedere sec telt

die variabele declareer je in de functie loop..?
Klopt dit? Zo wordt het toch nooit groter dan je interval?

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

Re: Runtime counter

Berichtdoor Creator » 20 Aug 2022, 16:15

Hi Rob,
unsigned long currentMillis = millis(); //de tijdteller werkt nauwkeuriger
if (currentMillis - previousMillis >= interval) //zorgt dat iedere sec telt


Het hoeft volgens mij ook niet groter te worden want als het gelijk is aan het interval telt het 1 sec op.

Erik

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

Re: Runtime counter

Berichtdoor Creator » 21 Aug 2022, 12:02

Ik probeer nu het wegschrijven te gaan begrijpen maar loop vast. Ik heb nu zoveel gelezen dat ik het kwijt ben.
Hoe moet ik de seconden, minuten en uren wegschrijven op de fram?

Ik lees 2 soorten format in de bibliotheek van Rob Tillaard nl.
- void write8(uint16_t memaddr, uint8_t value) uint8_t
void write16(uint16_t memaddr, uint16_t value) uint16_t
en
-void write(uint16_t memaddr, uint8_t * obj, uint16_t size) other types / sizes.

De tijd is gedefineerd als uint8_t voor de sec en min en uint16_t voor de uren. (prSec, prMin, prHr)
Deze waarden worden vermeerderd middels de klok functie en gepresenteerd op de display middels (printTime()).
Nu moeten deze tergelijkertijd ook naar de fram verzonden worden middel (writeTime()) (functie moet nog geschreven worden), gelijk aan de display.

In de regel "void write8(uint16_t memaddr, uint8_t value) uint8_t"
Wat is het "uint16_t memaddr" ? De "uint8_t value" is waarschijnlijk de prSec, enz. En de laatste "uint8_t"

Hoe moet ik dit nu in de juiste format paatsen?

Dit geldt later ook voor de read functie welke bij iedere initieële start moet worden uitgevoerd om de starttijd voor de klok te geven.
Wwie kan mij weer op de rails krijgen

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

Re: Runtime counter

Berichtdoor shooter » 21 Aug 2022, 16:04

zoals jezelf ook wel snapt maakt het voor de fram niet uit of het 8 of 16 is als het maar overal gelijk is en dus zorg er voor dat alles in hetzelfde of alles 16 of alles 8 (en ja de uno is 8 maar er zijn er ook die 16 als standaard hebben.
paul deelen
shooter@home.nl

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: JustinzeLeade en 22 gasten