Pratade projekt eller lite musik

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Borde det inte bli effektivare lagring med att lägga in allophoner och sedan använda sig av dem för att spela upp?

I vilket programminne hamnar variabler på en pic?
Om jag tex säger att variabeln text="En hel del text"
Är det RAM-minnet det hamnar i då? Kan man lagra variabler i programminnet i stället i så fall? Där finns det gott om plats över som det är nu. :-)
Användarvisningsbild
Icecap
Inlägg: 26637
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Nu får du skilja mellan variabler och konstanter.

Variabler kan ändras (därav namnet så att säga) och måste därför sparas i ett ändringsbart minne = RAM.

Konstanter kan fint sparas i programminnet, de ska ju bara läsas och får aldrig ändras heller.

Att man sedan av rent slarv kallar alla data man jobbar med i programmering för 'variabler' är en annan sak, man borde egentligen använda 'variabler' och 'konstanter' om man var petnoga.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Okey konstanter menar jag eftersom det är det allophonerna är. Hur gör man detta? Är det bara att köra:

static const char * text = "bla bla bla bla"; ?

eller definierar man att det ska hamna i programminnet på något speciellt sätt? Vad gör const ovan förresten? Såg det bara i något exempel för att spara en sträng.
Användarvisningsbild
Icecap
Inlägg: 26637
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

'static'???? varför det????
'Static' används om en rutin vill "behålla/skydda" variabler som deklareras i rutinen och markera att de inte får användas av andra.

const char text[] = "Min teststring"; // definierar textsträngen
const char * text = "Min teststring"; // definierar en pekare till textsträngen
Vilken du ska använda är nära nog likgiltigt, de gör ung. samma.

'const' är just uttryck för att det är oändringsbar konstant, jmf. 'constant' = konstant......

Vilket minne det sparas i beror på kompiler, processor osv men om du kör MikroC kommer 'const' deklarerade värden att sparas i programminnet. Det gör de i övrigt alltid men en del kompilers är så idiotiska att de kopierar konstanter till RAM, iblant för att kunna komma åt dom snabbt nog men då bör man byta processor tycker jag.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jag är inte riktigt med här...

Allophones är ett symboliskt återgivande av de olika ljud som
bygger upp ett visst språk, det är *inte* ljuden i sig !

Jag förstår inte vad i PIC'en som ska generera själva ljudet ?

Det är ju just det som de olika "sound-chippen" gör, man kör över
en serie med allophones som "text", och chippet kör motsvarande
ljud från sitt ljud-minne.

Så när man talar om "allophoner", så måste man vara tydlig i
om man menar den symboliska representationen eller faktiskt
själva ljudet.

> Vilket minne det sparas i beror på kompiler, ...

Vissa C-kompilatorer (t.ex Microchips C18 för PIC18 serien)
använder "const rom...." för att tydligt ange lagring i prog-minnet.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Om const är för att det är en konstant så tycker jag att denna funktion är konstigt skriven:

Kod: Markera allt

void lcd_puts(const char * s)
{
	LCD_RS = 1;	// write characters
	while(*s)
		lcd_write(*s++);
}
Variabeln som stoppas in i funktionen borde väll inte vara konstant i alla fall. Koden är tagen ur sample som medföljer Hi-tech pic C.

Jag hade hur som helst missat det där med utrymmet. allophonerna, alltså de olika ljudstavelserna skulle ta 64k och få plats på en 24LC512.
Tänkte inte på att 512 syftade på 512kB och inte 512B vilket skulle kunna få plats på picens interna EEPROM.

Icecap: kan du förklara det där med static lite mer så att man förstår. Jag hängde inte med alls.
Användarvisningsbild
Icecap
Inlägg: 26637
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Förklaringen till fråga 1:
s är en pekare på en 'const char', alltså en sträng som är konstant. Det kan vara att det finns många olika strängar i ROMen och de ska LCD'as ut. Konstanten är alltså dom som man pekar på men pekaren är ju olika för olika texter. Lite som "riktiga" adressor: på min postlåda står det ett namn och det kommer nog att stå där ett bra tag, på grannens likaså fast olika namn. Vi har även olika husnumre men vi är fastboende likaväl.

Så om du vill skicka brev till mig ska du använda _min_ adress, vill du skicka till grannen tar du en _annan_ adress, men namnen på postlådorna är konstanta likaväl.

'static'..... nåväl, here goes:

Kod: Markera allt

int MinLillaRutin(int EnSortsData)
  {
 static int KomHit1; // Jag vet att startkoden nollar hela RAM-minnet och därmed 
denna
  int KomHit2;
  KomHit1++;
  KomHit2++;
  if(KomHit1 > 100)
    {
    Send2LCD("Nu räcker det!!!");
    return(-1);
    }
  else
    {
    ... // räkna en hel del o göra grejor
    }
  return(KomHit);
  }
Variablen 'KomHit1' kommer att vara spärrad för andra rutiner, den finns enbart för 'int MinLillaRutin(int Data)' medan 'KomHit2' bara är fredat under tiden denna rutin körs. Den _kan_ men behöver inte återanvändas av andra rutiner, det beror på kompilern, ledigt minne osv.

'KomHit1' kommer alltså att stega upp 1 steg för varje gång man kallar denna lilla rutin, det gör 'KomHit2' också men dens minneslokation kan men måste inte användas av någon annan rutin och därmed är den osäker.

Med 'static' gör man helt enkelt så att minneslokationen reserveras den rutin som variablen deklareras i, deklareras den som 'const' "försvinnar" 'static'-funktionern då den är alldeles likgiltig.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Som om jag gör en for-loop i en funktion så kan jag göra variabeln som räknas till static för att hålla den kvar i funktionen och inte bli påverkad av annan funktion.

Jag har förresten problem med for-looparna att man inte kan köra samma loop flera gånger.,

Kod: Markera allt

1:

for (i==1;i<=10;i++)
{
   printf("hej");
}

goto 1;
Denna kod gör att den skriver ut hej 10 ggr och sedan loopar den bara över for satsen för att i verkar vara 10 från början.[/code]
Användarvisningsbild
Icecap
Inlägg: 26637
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Det är ju klart!
for(i==1;i<=10;i++) ska egentligen vara:
for(i=1;i<=10;i++)

Har du problem med skillnaden mellan '=' och '=='?
'=' ger en variabel ett visst värde,
'==' jämför 2 värden.

Men du har inte heller fattat 'static'.
'static' använder man för att "reservera" en variabel när rutinen _inte_ körs. grejen är att du kan köra en rutin och den kanske räknar ut värden som ska användas igen vid nästa genomkörning. Dessa värden gör man då 'static' eller deklarerar dom globalt, global deklarering "freder" dom så länge hela programmet kör och det blir ju det samma förutom 1 sak: om man råkar återanvända namnet till något annat kan det bli knas med globala värden, vill man att variablerna bara ska synas i en rutin och att deras värden ska hållas kvar ska man deklarera dom som 'static'.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Miss av mig. Klart jag har koll på det annars.. Tack för påpekandet.
Användarvisningsbild
Icecap
Inlägg: 26637
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

OK, då är det ju lugnt.
evert2
Inlägg: 2182
Blev medlem: 18 april 2004, 22:47:56
Ort: Jönköping

Inlägg av evert2 »

I examensarbetet jag deltog i använde vi denna krets i en handsfree till bil:

http://www.elfa.se/elfa-bin/dyndok.pl?l ... 003027.htm

Fungerade bra..om ni vill ha lite mer lagringskapacitet så borde ju ISD2575P vara intressant, kapsel DIL28 Elfa art nr 73-106-67. Kostar bara 61.40 + moms
Skriv svar