vettori e ram nei pic

Salve, sto scrivendo un programma in C con MikroC da eseguire poi in un PIC16F877A Ho la necessità di avere una tabella di dati in esadecimale da leggere in sequenza (ma anche con un paio di salti) per comporre un messaggio, e pensavo di usare due vettori distinti tipo questo PRG[]={0x01,0x02,0x03,..,0xff}; ma il compilatore mi dà un errore di mancanza di memoria ram nel pic. c'è un modo per memorizzare questi valori in rom anziché in ram? tanto devo solo leggerli, non modificarli. grazie

Reply to
Telespalla Bob
Loading thread data ...

"Telespalla Bob" ha scritto nel messaggio news:50a0ac38$0$13280$ snipped-for-privacy@reader2.news.tin.it...

non conosco quel compilatore ma penso che tu possa farlo col C18 si potrebbe usare rom char PRG[16]={0x01,0x02,0x03,..,0xff};

mi chiedo però perchè non hai postato it.hobby.elettronica.digitale,visto che è più attinente e ..c'è molto posto e poi come mai usi proprio quel micro?Se non è per questioni di reperibilità spiccia penso che nella serie 18 ce ne siano di più potenti e versatili,e con molta + RAM senza sforare le 2 euro,magari mi sbaglio

Reply to
blisca

Il 12/11/2012 9:14, blisca ha scritto:

grazie per la rapida risposta. ho provato a scrivere rom e ROM davanti alla dichiarazione del vettore ma mi dà errore...

Il mio vettore comunque è molto più lungo (!!), 16 bytes erano solo un esempio e nella dichiarazione non scrivo la lunghezza (lascio [] e funziona)

uso il 16F877 perché la schedina monta quello :-)

Grazie, ciao.

Reply to
Telespalla Bob

Il 12/11/2012 9:19, Telespalla Bob ha scritto:

mi rispondo da solo, non è rom ma const la parola da scrivere per spostare tutto in rom

Grazie!

ciao.

Reply to
Telespalla Bob

Ciao,

come ti hanno detto conviene sempre utilizzare oggetti della serie PIC18: consumano meno, costano meno e sono più potenti, in particolare se devi fare qualche moltiplicazione/divisione.

Utilizzo quel compilatore perchè ho una licenza gratuita (sono un beta tester) e quindi lo conosco benino :)

Se tu scrivi:

unsigned char pippo = 5;

Tu chiedi al compilatore di allocare in ram una variabile col nome pippo e assegnargli 5. Quindi lui si memorizzerà da qualche parte un "cinque". Se non la modifichi mai, l'ottimizzatore può pensare di mettere la tua variabile in rom e risparmiare un paio di indirizzamenti a runtime, ma è piuttosto pericoloso perchè se ci accedi con i puntatori succedono disastri (a volte si deve abbassare il livello di ottimizzazione, ma è indice di codice scritto male). Spero tu stia utilizzando la versione PRO di MikroC, dove hanno risolto un sacco di bug segnalati sulla versione standard (senza correggere quest'ultima).

Se invece tu scrivi:

const unsigned char pippo = 5;

Lui scriverà in rom. E se nel software (con tutto il rispetto!!) ci sono cagate sui puntatori te ne accorgi in fase di compilazione.

Quindi devi scrivere:

const unsigned char PRG[]={0x01,0x02,0x03,..,0xff};

Per memorizzare il vettore in ROM.

Attento: nei PIC16 non tutta la rom nè tutta la ram è contigua, quindi non potrai allocare vettori più grandi di un tot di elementi. Il problema si sente molto meno sui PIC18, dove ho allocato anche vettori di 100 floating point senza problemi (credo che il limite sia solo la dimensione della memoria).

Ciao CG

Reply to
CG Audio Laboratories

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.