Posunutí o jedno místo v paměti

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od ondraN » 18 úno 2021, 06:43

Zkus tenhle upravený kód.

Kód: Vybrat vše

#include <SPI.h>
#define csPIN 10 
#define posPIN 9 
#define negPIN 8 


#define WREN  6
#define WRDI  4
#define RDSR  5
#define WRSR  1
#define READ  3
#define WRITE 2
#define EEPROMSIZE 512


int8_t intValueOfHexaKey(char c)
{
  if ((c >= '0') && (c <= '9')) return c - '0';
  if ((c >= 'A') && (c <= 'F')) return c - 'A' + 10;
  return -1; 
}


uint8_t readByteAt(uint8_t cs, uint16_t adr)
{
  SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
  digitalWrite(cs, LOW);
  uint8_t b = highByte(adr);
  b = b << 3;  
  b = b | READ;  
  SPI.transfer(b); 
  SPI.transfer(lowByte(adr)); 
  b = SPI.transfer(0); 
  digitalWrite(cs, HIGH);
  SPI.endTransaction();
  return b;
}
//end



uint8_t writeByteAt(uint8_t cs, uint16_t adr, char d)
{
  SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
  digitalWrite(cs, LOW);
  SPI.transfer(WREN); 
  digitalWrite(cs, HIGH);
  delay(10);
  digitalWrite(cs, LOW);
  uint8_t a = highByte(adr);
  a = a << 3;  
  a = a | WRITE;  
  SPI.transfer(a); 
  SPI.transfer(lowByte(adr)); 
  a = SPI.transfer(d);
  digitalWrite(cs, HIGH);
  delay(15);
  SPI.endTransaction();

  return a;
}
//end

//setup 
void setup()
{
  Serial.begin(9600);
  digitalWrite(csPIN, HIGH);
  pinMode(csPIN, OUTPUT);
  pinMode(posPIN, OUTPUT);
  digitalWrite(posPIN, HIGH);
  pinMode(negPIN, OUTPUT);
  digitalWrite(negPIN, LOW);
  SPI.begin();
  
  Serial.setTimeout(7000);
}

//main loop
void loop()
{
  if (Serial.available() > 0)
  {
    char command = Serial.read();
    
    if (command == '1')
    {
      digitalWrite(posPIN, LOW);
      digitalWrite(negPIN, HIGH);
      delay(20);
      char ch[30];
      for (uint16_t i = 0; i < EEPROMSIZE; i++)
      {
        sprintf(ch, "%02X", readByteAt(csPIN, i));  
        Serial.print(ch);
      }
      digitalWrite(negPIN, LOW);
      digitalWrite(posPIN, HIGH);
    }
    else if (command == '2')
    {
      digitalWrite(posPIN, LOW);
      digitalWrite(negPIN, HIGH);
      delay(5);
      while(Serial.available() > 0){
      	Serial.read();
      }
      delay(50);
      char dump[EEPROMSIZE];
      char readData[EEPROMSIZE * 2];
      Serial.readBytes(readData, EEPROMSIZE * 2); 
      for (int i = 0; i < EEPROMSIZE; i++)
      {
        dump[i] = intValueOfHexaKey(readData[i*2+1]) + 16 * intValueOfHexaKey(readData[i*2]);
        Serial.print(dump[i]);
      }
      char ch[30];
      for (int i = 0; i < EEPROMSIZE; i++)
      {
        
        sprintf(ch,"%02X",writeByteAt(csPIN,i,dump[i]));
      }

      delay(500);
      digitalWrite(negPIN, LOW);
      digitalWrite(posPIN, HIGH);
    }
  }
  delay(10);
}

mourison
Příspěvky: 18
Registrován: 07 led 2019, 21:15
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od mourison » 18 úno 2021, 12:28

Ahoj funguje skvěle.
Kdyžtak mi hoď učet do PM, pošlu ti tam nějakou malou uplatu, moc mi to pomohlo. ;)

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od ondraN » 18 úno 2021, 14:02

Nic za to nechci. A přišel jsi na to, v čem byl ten problém a proč to teď funguje :?: :mrgreen:
Z toho je vidět, že když potřebuješ pomoc, tak to sem musíš dát všechno a podrobně to popsat, protože chyba byla úplně jinde než v zápisu nebo čtení z paměti.

mourison
Příspěvky: 18
Registrován: 07 led 2019, 21:15
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od mourison » 18 úno 2021, 18:01

No v podstatě po zadání 2ky to tedka čeká na zadání HEXU, předtím se to pustilo rovnou, ale furt nechápu proč o jedno místo :D

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od ondraN » 18 úno 2021, 19:33

Je to tak, že když jsi zadal číslo, tak terminál za něj doplnil znak new line '\n'. Ten zůstal v bufferu. Funkce převodu z textového Hex vrátila spávně hodnotu -1, ale protože nikde nekontroluješ, jestli nevrací chybovou hodnotu, tak jsi ji klidně zpracoval a z toho vzniklo to F. Takže příště, čistit buffery a hlídat chybové stavy :!: :mrgreen:

mourison
Příspěvky: 18
Registrován: 07 led 2019, 21:15
Reputation: 0

Re: Posunutí o jedno místo v paměti

Příspěvek od mourison » 18 úno 2021, 20:41

Aha vidíš, to je super, já vůbec nevěděl, že doplní znak /n automaticky :/
Je to protože já zadal 2 a hned za to HEX ?
Kdežto ted zadám 2, a začne to čekat znova tudíž je to bez toho /n ?

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů