Toon posts:

Enkele bit uitlezen Arduino (C++)

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijn queeste

[ Voor 97% gewijzigd door Verwijderd op 01-07-2020 08:06 ]

Beste antwoord (via Verwijderd op 04-12-2019 20:03)


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-10 16:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als ik zo vrij mag zijn, het lijkt op een ascii tabel met de eerste 32 karakters eraf (spatie is namelijk 32). De rest van de tabel zal dus wel 96 tekens lang zijn. En er zjin dus 9 bytes per karakter (oftewel het font is 8x9). Dan is dit waarschijnlijk wat je bedoelt:
C++:
1
uint8_t teletext[96][8] = {


Voor je bitRead() zul je eerst ook nog de juiste rij moeten selecteren. De pixel op (x, y) van character c lees je dus uit met bitRead(teletext[c][y], x)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
code:
1
(teletext[n] >> i) & 0x01

Maar dat is waarschijnlijk identiek aan hoe bitRead is geimplementeerd. Wat het doet is het karakter dat je wil uitlezen zovaak naar rechts schuiven totdat het bit wat je wil uitlezen helemaal rechts staat. Dan met bitwise-AND filter je al het andere eruit, en wat overblijft is enkel dat ene bit waar je geinteresseerd in was.

Maar goed, ik vermoed dat bitRead hetzelfde doet, dus ik verwacht dat je ergens anders een probleem hebt. Je weet dat hij van hoog naar laag telt? Oftewel B1000000 heeft '1' op positie 7, en B00000001 heeft een '1' op positie 0.

Edit, even gegoogled, en bitRead doet inderdaad hetzelfde:
code:
1
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)

[ Voor 9% gewijzigd door Sissors op 04-12-2019 16:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit is de foutmelding:
invalid operands of types 'uint8_t [96] {aka unsigned char [96]}' and 'int' to binary 'operator>>'

Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Dat is wel handig om er direct bij te vermelden ;)

Maar ik zie nu dat het een 2D array is waar je in bezig bent. Dus één karakter heeft (als ik goed tel) 8 uint8_ts die hem beschrijven. Je moet dus ook opgeven in welk van die bytes je een bit wil uitlezen:
code:
1
bool pix=bitRead(teletext[0,n],i);

Dat zal wel werken (en pakt dus altijd eerste byte van een karakter).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Notatie is blijkbaar teletext[0[[n], maar nu krijg ik error dat variabelen 300% van ruimte gebruiken...
Heel raar, de schets gebruikt zonder de bool=... zin 49 bytes van het dynamisch geheugen, en met die zin 9265 bytes wat niet meer past. Dat terwijl het enkel vullen van reeds bestaande variabele is met iets uit andere variabele.

[ Voor 52% gewijzigd door Verwijderd op 04-12-2019 16:24 ]


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 03-10 23:11

DataGhost

iPL dev

Verwijderd schreef op woensdag 4 december 2019 @ 16:17:
Notatie is blijkbaar teletext[0[[n], maar nu krijg ik error dat variabelen 300% van ruimte gebruiken...
Door alleen het veranderen van een notatie (waar?) kan ik me niet voorstellen dat je opeens veel meer ruimte gaat gebruiken. Je doet dus waarschijnlijk iets anders verkeerd, wat je niet laat zien. Kijk naar de wijzigingen die je gedaan hebt ten opzichte van de vorige code en probeer je te bedenken wat je nu gedaan hebt wat dat kan veroorzaken. Als je hier hulp komt vragen moet je ook je foutmeldingen gewoon copy/pasten ipv in je eigen woorden vertellen, eventueel met bijbehorende context als regelnummers genoemd worden. Ook mag je de foutmelding direct plaatsen in plaats van alleen een "werkt niet". Voor ons is nu in ieder geval volstrekt onduidelijk wat je veranderd hebt aan je code en wat je probeert.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zo compileert ie met 49 byte geheugen:
C++:
1
2
3
4
5
6
7
8
9
10
void loop() {
  for(byte n=0; n<96; n++){
  for(int i=0; i<strip.numPixels(); i++) {
   // pix=(teletext[0][n]>>i)&0x01;
    if (pix) strip.setPixelColor(i, white);
    else  strip.setPixelColor(i, black);
    strip.show();
  }
  }
}


en zo dus niet:
Zo compileert ie met 49 byte geheugen:
C++:
1
2
3
4
5
6
7
8
9
10
void loop() {
  for(byte n=0; n<96; n++){
  for(int i=0; i<strip.numPixels(); i++) {
    pix=(teletext[0][n]>>i)&0x01;
    if (pix) strip.setPixelColor(i, white);
    else  strip.setPixelColor(i, black);
    strip.show();
  }
  }
}


Dan is dit de foutmelding:
Build-opties gewijzigd, alles wordt opnieuw gebuild
De schets gebruikt 15056 bytes (52%) programma-opslagruimte. Maximum is 28672 bytes.

Globale variabelen gebruiken 9405 bytes (367%) van het dynamisch geheugen. Resteren -6845 bytes voor lokale variabelen. Maximum is 2560 bytes.
Niet genoeg geheugen: ga naar http://www.arduino.cc/en/Guide/Troubleshooting#size voor tips over het verkleinen van uw voetafdruk.
Fout bij het compileren voor board Arduino Leonardo

[ Voor 1% gewijzigd door .oisyn op 04-12-2019 16:49 . Reden: Code tags toegevoegd. ]


Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Kan hoor: Compilers zijn slim. Als jij een variabele definieert die nooit gebruikt wordt, trapt de compiler hem er direct weer uit. Nu gebruikt hij hem wel, dus moet hij in de code komen te zitten. En daar is dus geen ruimte voor.

Anyway, als het niet in het dynamische geheugen past (RAM), moet je het dus in het flash opslaan, het verandert toch niet. Dat is bij Arduino iets meer werk als bij de gemiddelde ARM compiler (die een const automatisch in flash stopt), maar dan nog steeds goed te doen: https://www.arduino.cc/re...iables/utilities/progmem/

(Dit is dus die teletekst variabele die in flash geplaatst moet worden).

[ Voor 6% gewijzigd door Sissors op 04-12-2019 16:28 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De array als const definieren helpt niet, error blijft zelfde.

Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 23-09 14:00
Verwijderd schreef op woensdag 4 december 2019 @ 16:17:
Notatie is blijkbaar teletext[0[[n], maar nu krijg ik error dat variabelen 300% van ruimte gebruiken...
Heel raar, de schets gebruikt zonder de bool=... zin 49 bytes van het dynamisch geheugen, en met die zin 9265 bytes wat niet meer past. Dat terwijl het enkel vullen van reeds bestaande variabele is met iets uit andere variabele.
Je hebt teletext gedefinieerd als:
C++:
1
uint8_t teletext[][96] = {...}

Wat betekend dat je een tweedimensionale array hebt (eigenlijk een array in een array), laten we zeggen rijen en kolommen. De rijen worden bepaald tijdens het compileren, maar er zijn 96 kolommen per rij.

Vervolgens doe je dit:
C++:
1
2
3
4
5
uint8_t teletext[][96] = {
{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000},// space
{B00100000,B00100000,B00100000,B00100000,B00100000,B00000000,B00100000,B00000000,B00000000},// !
{B01010000,B01010000,B01010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000},// "
{B00110000,B01001000,B01000000,B11100000,B01000000,B01000000,B11111000,B00000000,B00000000},// £

In dat stukje code zijn er 4 rijen, met 9 ingevulde kolommen. Aangezien je zegt dat er 96 kolommen zijn, verzint de compiler de overige 87 (96-9) erbij. Ofwel: iedere rij gebruikt 10 keer meer geheugen dan nodig.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dus wat moet er dan anders?

Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Verwijderd schreef op woensdag 4 december 2019 @ 16:29:
De array als const definieren helpt niet, error blijft zelfde.
Daarom had ik ook de link voor Arduino erbij, hem als const definieren is niet voldoende voor Arduino...

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-10 16:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als ik zo vrij mag zijn, het lijkt op een ascii tabel met de eerste 32 karakters eraf (spatie is namelijk 32). De rest van de tabel zal dus wel 96 tekens lang zijn. En er zjin dus 9 bytes per karakter (oftewel het font is 8x9). Dan is dit waarschijnlijk wat je bedoelt:
C++:
1
uint8_t teletext[96][8] = {


Voor je bitRead() zul je eerst ook nog de juiste rij moeten selecteren. De pixel op (x, y) van character c lees je dus uit met bitRead(teletext[c][y], x)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik was er nog niet helemaal. Probleem is blijkbaar nog het volgende:
Als je een array in PROGMEM zet kun je m NIET met variabelen uitlezen, maar alleen met vaste celwaarden. Voor dat ik dat door had..... pffff.

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 03-10 23:11

DataGhost

iPL dev

Verwijderd schreef op woensdag 4 december 2019 @ 20:04:
Ik was er nog niet helemaal. Probleem is blijkbaar nog het volgende:
Als je een array in PROGMEM zet kun je m NIET met variabelen uitlezen, maar alleen met vaste celwaarden. Voor dat ik dat door had..... pffff.
DataGhost schreef op woensdag 4 december 2019 @ 16:24:
[...]

Als je hier hulp komt vragen moet je ook je foutmeldingen gewoon copy/pasten ipv in je eigen woorden vertellen, eventueel met bijbehorende context als regelnummers genoemd worden. Ook mag je de foutmelding direct plaatsen in plaats van alleen een "werkt niet". Voor ons is nu in ieder geval volstrekt onduidelijk wat je veranderd hebt aan je code en wat je probeert.
Ik zie persoonlijk niet in waarom je een array niet "met variabelen kan uitlezen" als 'ie in PROGMEM staat, dus je maakt waarschijnlijk een denkfout. Nofi, maar als beginner is het het beste om bij dit soort vragen gewoon de precieze foutmelding te posten en niet een eigen interpretatie ervan. Daarbij is het voor jou ook nuttig om je eigen interpretatie van de foutmelding erbij te vermelden, inclusief de pogingen die je hebt genomen om het probleem op te lossen en waarom dat niet werkte, enz. Dan kunnen wij zeggen of je gedachtegang klopt of niet, en je op de juiste weg helpen.

Acties:
  • 0 Henk 'm!

  • jeroen3
  • Registratie: Mei 2010
  • Laatst online: 13:19
@DataGhost Op de arduino (atmega) kun je een PROGMEM niet zomaar met variabelen uitlezen want er is een speciale instructie nodig om hem uit het programmageheugen (PROG-MEM) te halen.
Lang leve de Harvard architectuur!

En oja, vertel ook wat je wil bereiken. Zo voorkom je het xy-probleem.

[ Voor 19% gewijzigd door jeroen3 op 04-12-2019 20:39 ]


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 03-10 23:11

DataGhost

iPL dev

jeroen3 schreef op woensdag 4 december 2019 @ 20:38:
@DataGhost Op de arduino (atmega) kun je een PROGMEM niet zomaar met variabelen uitlezen want er is een speciale instructie nodig om hem uit het programmageheugen (PROG-MEM) te halen.
Lang leve de Harvard architectuur!

En oja, vertel ook wat je wil bereiken. Zo voorkom je het xy-probleem.
Ah, dat wist ik niet want daar heb ik zelf nog niet direct mee te maken gehad, alleen maar in software die al was geschreven waarbij ik alleen maar de data in het PROGMEM zelf hoefde aan te leveren :P Maar met de foutmelding was waarschijnlijk vrij gauw duidelijk geworden hoe en wat. Ik Googlede net even en zag de functie die daar normaal voor gebruikt wordt, die heb ik al veel vaker langs zien komen. Daarmee kan je dus alsnog "met een variabele" ophalen wat je wilt, je schrijft het alleen anders op :) Ik kwam trouwens uit op dezelfde pagina over PROGMEM die hier eerder al gelinkt was en had van TS eigenlijk verwacht dat 'ie de hele pagina gelezen zou hebben.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Er waren geen foutmeldingen. Het probleem was dat wat ik op het scherm kreeg volstrekt onlogisch was. Vandaar het giswerk.
Pagina: 1