Arduino -Klent med ram minne.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino -Klent med ram minne.

Inlägg av orvar-e »

Icecap skrev:orvar-e: jag är inte på någon hög häst - men jag kan lägga in positionsvärden i strängar och då formatera utskrifter utan problem och det verkar ju vara ett problem för dig.
En kan inte kunna allt, inte det som forumet är tillför, för folk som inte kan allt.
Glattnos
Inlägg: 2984
Blev medlem: 29 oktober 2009, 20:01:18

Re: Arduino -Klent med ram minne.

Inlägg av Glattnos »

Biblioteket jag länkade till är så enkelt att det varken använder Arduinos "wire"-bibliotek eller AVR:ens inbyggda TWI(I²C)-hårdvara. Det bara bitbangar(typ mjukvaru-I²C) I/O-pinnarna. Detta gör att man kan koppla ledningarna till vilka I/O-pinnar man vill och behöver inte ha inbyggd TWI(I²C)-hårdvara i sin AVR. Det går att köra på det flesta AVR-chip.

Det var alltså denna: https://bitbucket.org/tinusaur/ssd1306xled/overview
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino -Klent med ram minne.

Inlägg av Icecap »

orvar-e: Nu får du nog förklara vad du menar. Jag har läst om PROGMEM konstanter i forumet och sedan har jag - runt 1993 - gjort en LCD-rutin som jag genom åren har trimmat lite på när olika projekt har behövd det för att göra livet enklare för mig.

Och då är jag tydligen en messerschmitt...?

Ja, jag kan förstå att när man kör med Arduino (stereotyp) är det klippa-&-klistra som gäller, man behöver inte förstå vad man gör, detta har vi ju sett en hel del exempel på här i forumet. Men att det ska vara så fel att ange att det faktisk finns alternativ att det "inte är vad forumet är till för" är - i mina ögon - en lodrät lögn!!!

Jag har sett en hel del medlemmar som har börjat på noll och har skapad "besvärliga" program. Efter lite tips och råd och förklaringar har många "förbättrat" sig och insett vad de gör och skapad riktigt bra saker, just för att de har fått mer vetande via forumet.

Och ja, visst är det en del som använder Arduino som faktisk KAN programmera men det finns många exempel på annat. Självklart kan många av de exempel man ser på kod göra ont i mina ögon, just för att jag har en del erfarenhet med att programmera men jag försöker faktisk att hjälpa och ge råd bäst jag kan.

Går jag tillbaka till mina tidiga program känns det nästan otrevligt, jag har ändrat min stil ganska mycket under åren, just för att jag vill lära nytt och att göra "rätt". Men du verkar inte sugen på att gå den vägen sedan du anser att min lösning jag ger som exempel är att sitta på en hög häst. Och i så fall tycker jag synd om dig, för mig är det kul att lära nytt och att använda det så att saker och ting blir enklare.

Jag har använd oräkneliga timmar på att programmera och utveckla elektronik (och annat), runt 97% av den tid har mynnat ut i att jag har lärt mig något nytt - men ingen hårdvara, bara en erfarenhet om att den väg jag testade inte var bra. Senast använde jag ~1,5 år på att fixa hardware-interface till den RX210 µC vi använder - men det har betytt att jag kan skapa ett projekt från grunden på ung. 10 minuter, då har jag alla interface till serieporter, timers och annan hårdvara klar.

Men det är väl att vara på en hög häst att jobba hårt, läsa 1600+ sidor datablad och testa programbitar steg för steg...
Glattnos
Inlägg: 2984
Blev medlem: 29 oktober 2009, 20:01:18

Re: Arduino -Klent med ram minne.

Inlägg av Glattnos »

Icecap skrev:Alltså - har man konstanter (text, värden...) i en ATmega MÅSTE den ju - vid boot - kopiera dom från PROGMEM till RAM varför funktionen för detta redan finns i skiten.
Det här förstår jag inte riktigt. Kan någon förklara detta för mig? Varför måste konstanter kopieras till RAM vid boot?
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Arduino -Klent med ram minne.

Inlägg av Mr Andersson »

Du (processorn) kan inte använda saker som inte finns i RAM. Det måste inte kopieras just vid boot men det är vad som sker som standard om du inte talar om något annat för kompilatorn.
Det är en avvägning mellan att spara minne (kopiera och sen ta bort varje gång datan behövs) mot att spara exekveringstid (kopiera en gång och lämna i minnet).
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino -Klent med ram minne.

Inlägg av orvar-e »

Ja ja ja Icecap jag vet att du är en av de kunnigare här på forumet när det kommer till µC och elektronik jag har nog inte ifråga satt det.
Jag ser problemet jag har just nu ur mitt perspektiv dvs oled problem och minnesproblem, att då komma och prata om ditt finulliga LCD bibliotek och lösning, då LCD biblioteket som redan finns inte är något problem (för mig iaf). Men du kanske kan köra en oled display med LCD bibliotek visa gärna hur.
För mig är forumet till för att dela tankar, kunskap med andra personer med samma intressen. Hur det nu kan vara en lögn eller hur det kan finnas ett rätt eller fel i frågan lär jag väl snart få höra.

Jag har inget intresse att bli världsbäst på programmering, det finns viktigare saker i livet tycker jag nog (bara min åsikt). Finns det genvägar så tar jag den, måste jag lära mig mer för att få till nått så gör jag det, hur svårt kan det vara. Att påstå att jag inte vill lära mig mer, det är bara okunskap, och ett elakt påhopp. Men du känner inte mig så vad vet du, nu vet du!!
Jag ifråga sätter inte din kompetens och kunskap, den är ovärderlig på forumet.

Och var inte så jävla lätt krängt, det blir drygt och dessutom offtopic.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4694
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Arduino -Klent med ram minne.

Inlägg av Swech »

Vad är det för upplösning på OLEDen?
Kan det vara en buffer som käkar minne?

Swech
Glattnos
Inlägg: 2984
Blev medlem: 29 oktober 2009, 20:01:18

Re: Arduino -Klent med ram minne.

Inlägg av Glattnos »

Swech: Det är ganska säkert 128x64

Jag blev lite förvirrad av det här med att flash flyttas till SRAM :humm:
Jag hittade bra förklaring här och det var mycket som jag inte visste om det: https://www.avrfreaks.net/forum/tut-c-g ... ic&t=38003

Nått jag fortfarande inte riktigt förstår. Om man har en stor PROGMEM tabell med bitmap för t.ex en uppstarts-logga på en grafisk display(som bara visas när man startar). Kommer då hela tabellen att flyttas till SRAM? Om man bara använder delar av en bitmap-tabell för ASCII-tecken, kommer då bara de delarna att flyttas till SRAM eller kommer hela tabellen att flyttas?
Sen känns det som att det sägs som att processorn kan läsa direkt från flash när det står:
"Some compilers implicitly do this for you, but GCC needs to be explicitly told that the contents must live in program memory for the entire duration of the program's execution."
"pgm_read_byte. This macro takes a PROGMEM pointer as its argument, and returns the byte located at that pointer value." Kan den eller kan den inte läsa/använda det som finns i flash? :oops:
olof_n
Inlägg: 116
Blev medlem: 23 februari 2011, 21:36:46

Re: Arduino -Klent med ram minne.

Inlägg av olof_n »

Kände mig tvungen att googla lite och då ser man att ett flertal klagar på Adafruits biliotek och det höga minnesutnyttjandet.

Om det räcker med text finns följande bibliotek som tar upp 53 bytes RAM vid "Hello World".

https://github.com/greiman/SSD1306Ascii
Har inte kollat i detalj men bibloteket verkar stödja SPI, I2C och "bitbang SPI".
Användarvisningsbild
AndLi
Inlägg: 17134
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Arduino -Klent med ram minne.

Inlägg av AndLi »

Glattnos skrev:Swech: Det är ganska säkert 128x64
Nått jag fortfarande inte riktigt förstår. Om man har en stor PROGMEM tabell med bitmap för t.ex en uppstarts-logga på en grafisk display(som bara visas när man startar). Kommer då hela tabellen att flyttas till SRAM? Om man bara använder delar av en bitmap-tabell för ASCII-tecken, kommer då bara de delarna att flyttas till SRAM eller kommer hela tabellen att flyttas?
Sen känns det som att det sägs som att processorn kan läsa direkt från flash när det står:
"Some compilers implicitly do this for you, but GCC needs to be explicitly told that the contents must live in program memory for the entire duration of the program's execution."
"pgm_read_byte. This macro takes a PROGMEM pointer as its argument, and returns the byte located at that pointer value." Kan den eller kan den inte läsa/använda det som finns i flash? :oops:
Du kan använda pgm_read_byte för att läsa direkt från flash, men om din displaydrivare inte kan så kommer ju loggan behövas kopieras in i SRAM på nått sätt.

Flashet går att läsa, men du kan inte bara sätta en pekare som du kan göra till RAM. (Vilket du kan på div andra µC som har minnesmappat flash)
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4694
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Arduino -Klent med ram minne.

Inlägg av Swech »

128*64 / 8 -> 1k ram för en skärmbuffer
Blir mer komplicerat att köra utan buffer, kan vara anledning till minnesbrist

Swech
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino -Klent med ram minne.

Inlägg av sodjan »

Självklart kan man läsa från flash, även i en AVR. Däremot så kan ju inte
flash hanteras som vanliga register eller RAM, det behövs en eller flera
små rutiner (inget konstigt) som kopierar valda delar från flash till RAM
*då det behövs*. Detta RAM behöver bara allokeras under tiden som det
behövs, t.ex. medan en text skrivs till displayen, sedan kan det återlämnas
igen. Så om du har som exempel 20 olika texter med olika längd där den
längsta är 15 tecken, så behöver du en buffert på 15 tecken för för att
"läsa in" raden innan den skrivs till displayen.

Det är ju inget onormalt att man har massor av ledtexter och meddelanden
för displayer lagrade i flash utan att själva lagringen tar något av RAM.

Någonstans måste dina texter läsas från flash. Antingen är själva subrutinen
för displayhanteringen tillräckligt smart så att den kan ta en adress i flash
som en parameter (och då kan den ju läsa ett tecken i taget och skriva till
displayen och behöver inte en buffert för hela textsträngen), eller så tar
den bara en pekare till RAM, och då måste hela strängen läsas in i förväg.
(Sen så kan ju en stor/lång textsträng delas upp i flera delar och skrivas
som separata strängar, vilket sparar på RAM minne...)

Sen så kan man ha vanliga variabler som är definierade som "const" och
som har ett givet startvärde. Dessa värden måste ju så klart finnas lagrade
någonstans och det är i en speciell del av programmet i flash som skapar
dessa konstanter i RAM vid uppstart av programmet. Men det är ju en lite
annorlunda sak, normalt är det olika parametrar och konstanter som behövs
löpande under körningen av programmet. Texter till displayer och liknande
kan ju hämtas från flash då de behövs.

En fall som ligger i emellan är "halv-konstanta" konstanter, d.v.s sådant som
kan ändras vid runtime t.ex. via funktioner i menyerna. Dessa ligger normalt
i EEPROM delen, men för övrigt fungerar de ungefär som konstanter i flash,
man läser in dom vid programstart och gör inget annat förutom då de ändras.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino -Klent med ram minne.

Inlägg av sodjan »

> "pgm_read_byte. This macro takes a PROGMEM pointer as its argument, and returns the byte located at that pointer value."
> Kan den eller kan den inte läsa/använda det som finns i flash?

Ja, nu så är ju "program memory" precis samma sak som "flash",
så frågan besvarar ju sig själv...

Du skickar med en pekare av typen "PROGMEM" (som alltså pekar på en
viss adress i flash) och du får tillbaka det som ligger i flash just där.
Sen (efter att värdet finns i ett register) så kan du så klart använda
det till precis vad du vill, det finns ingen koppling till flash längre...

Normalt finns det symboliska metoder för att ange var saker ligger
i flash så man behöver aldrig hantera numeriska adresser eller så.
Man namnger alltså texterna och använder namnet som referens då
man sätter pekarens värde.
Glattnos
Inlägg: 2984
Blev medlem: 29 oktober 2009, 20:01:18

Re: Arduino -Klent med ram minne.

Inlägg av Glattnos »

Tack Sodjan :)

Jag trodde att jag blivit senil eller nått när det började pratas om att flash läses över till ram, annars går det inte att använda. Jag började fundera på vad i hela friden jag gjorde för 10 år sedan när ni här på forumet hjälpte mig att börja programmera. Då var det AVR-assembler och jag använde instruktionen LPM för att hämta text som var lagrat i flash.
Klart att jag blev förvirrad :oops: Men att vissa bibliotek och rutiner på nätet inte gör det är inte samma sak som att det inte går :)

Sen är det väl just så det görs i rutinen jag länkade till förut. Det är inte hela koden men detta sätt att skriva det på tar väl upp väldigt lite RAM eftersom pgm_read_byte, i detta fall, använder just AVR-assemblers LPM-instruktion(LoadProgramMemory)? Detta läser väl inte in hela ASCII-bitmap tabellen i SRAM?
Hela finns här: https://bitbucket.org/tinusaur/ssd1306x ... at=default

Kod: Markera allt

#include <avr/pgmspace.h>
#include <stdlib.h>
#include <avr/io.h>

/* Standard ASCII 6x8 font */
const uint8_t ssd1306xled_font6x8 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sp
  0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, // !
  0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // "
  0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14, // #
  0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12, // $
  0x00, 0x62, 0x64, 0x08, 0x13, 0x23, // %
  0x00, 0x36, 0x49, 0x55, 0x22, 0x50, // &
  0x00, 0x00, 0x05, 0x03, 0x00, 0x00, // '
  0x00, 0x00, 0x1c, 0x22, 0x41, 0x00, // (
  0x00, 0x00, 0x41, 0x22, 0x1c, 0x00, // )
  0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, // *
  0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // +
  0x00, 0x00, 0x00, 0xA0, 0x60, 0x00, // ,
  0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // -
  0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // .
  0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // /
  0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // 0
  0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // 1
  0x00, 0x42, 0x61, 0x51, 0x49, 0x46, // 2
  0x00, 0x21, 0x41, 0x45, 0x4B, 0x31, // 3
  0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // 4
  0x00, 0x27, 0x45, 0x45, 0x45, 0x39, // 5
  0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // 6
  0x00, 0x01, 0x71, 0x09, 0x05, 0x03, // 7
  0x00, 0x36, 0x49, 0x49, 0x49, 0x36, // 8
  0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // 9
  0x00, 0x00, 0x36, 0x36, 0x00, 0x00, // :
  0x00, 0x00, 0x56, 0x36, 0x00, 0x00, // ;
  0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // <
  0x00, 0x14, 0x14, 0x14, 0x14, 0x14, // =
  0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // >
  0x00, 0x02, 0x01, 0x51, 0x09, 0x06, // ?
  0x00, 0x32, 0x49, 0x59, 0x51, 0x3E, // @
  0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // A
  0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // B
  0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // C
  0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, // D
  0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // E
  0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // F
  0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // G
  0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // H
  0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // I
  0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, // J
  0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // K
  0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // L
  0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, // M
  0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, // N
  0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // O
  0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // P
  0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // Q
  0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, // R
  0x00, 0x46, 0x49, 0x49, 0x49, 0x31, // S
  0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // T
  0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // U
  0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // V
  0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, // W
  0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // X
  0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // Y
  0x00, 0x61, 0x51, 0x49, 0x45, 0x43, // Z
  0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // [
  0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55, // 55
  0x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // ]
  0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // ^
  0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // _
  0x00, 0x00, 0x01, 0x02, 0x04, 0x00, // '
  0x00, 0x20, 0x54, 0x54, 0x54, 0x78, // a
  0x00, 0x7F, 0x48, 0x44, 0x44, 0x38, // b
  0x00, 0x38, 0x44, 0x44, 0x44, 0x20, // c
  0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, // d
  0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // e
  0x00, 0x08, 0x7E, 0x09, 0x01, 0x02, // f
  0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // g
  0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, // h
  0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, // i
  0x00, 0x40, 0x80, 0x84, 0x7D, 0x00, // j
  0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // k
  0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, // l
  0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, // m
  0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, // n
  0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // o
  0x00, 0xFC, 0x24, 0x24, 0x24, 0x18, // p
  0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, // q
  0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, // r
  0x00, 0x48, 0x54, 0x54, 0x54, 0x20, // s
  0x00, 0x04, 0x3F, 0x44, 0x40, 0x20, // t
  0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, // u
  0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, // v
  0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, // w
  0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // x
  0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // y
  0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, // z
  0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // horiz lines
};

void ssd1306_char_font6x8(char ch) {
	uint8_t c = ch - 32;
	ssd1306_send_data_start();
	for (uint8_t i = 0; i < 6; i++)
	{
		ssd1306_send_byte(pgm_read_byte(&ssd1306xled_font6x8[c * 6 + i]));
	}
	ssd1306_send_data_stop();
}
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino -Klent med ram minne.

Inlägg av sodjan »

> Detta läser väl inte in hela ASCII-bitmap tabellen i SRAM?

Njae, den hanterar ett byte i taget, det finns bara ett tecken i RAM i taget.
Eller egentligen bara en kolumn av de 6 kolumner som ingår i ett tecken.
Så inte ens ett helt ASCII-tecken finns i minnet samtidigt... :-)

Och det finns det ju ingen anledning till heller...
Skriv svar