pic con memoria insufficiente - BaroneRosso.it - Forum Modellismo

Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 05 marzo 10, 15:30   #1 (permalink)  Top
User
 
L'avatar di lol21
 
Data registr.: 16-11-2008
Residenza: Riva del Garda - TN
Messaggi: 429
pic con memoria insufficiente

salve a tutti
sono un nuovo appassionato di elettronica e mi hanno chiesto di fare una scheda con dei pulsanti e un LCD alfanumerico per un aggiornamento di dati in calssifica per il tiro con l'arco (possibilità di classifica quasi in tempo reale in poche parole).

l'interfaccia è molto comoda, al momento del recupero delle frecce si inseriscono i dati e durante il tiro un operatore usa un interfaccia per pc che manda un segnale sulla seriale e riceve di ritorno i dati dal paglione che ha "chiamato".

scriverlo così è difficile

ora il grande problema, la programmazione del pic la sto facendo in c (comidità perchè sviluppo anche per windows e il c è praticamente universale) e il grande problema è che non riesco a ridurre troppo il codice e al momento della compilazione mi dice che non c'è abbastanza ROM. in poche parole non c'è abbastanza memoria nel pic giusto? (il pic lo scelgo all'inizio del programma). le librerie che uso sono messe a disposizione dal programma.
il pic da me utilizzato è il pic 16F628
al momento del codice non ancora finito (lo compilo man manno per evitare di dover fare grandi correzioni alla fine di tutto il programma) attualmente il file .hex generato è di 11KB.
è probabile sia troppo grande per il pic?
è possibile chhe altrimenti l'errore sia dato a causa del programma (sono in versione demo e c'è scritto che l'output è limitato a 2000 parole di compilazione

in caso il problema sia dato dalla mmemoria non sufficiente devo ricorrere alle EEPROM? se sì come si usano? non le ho mai usate. e già coi pin sono al limite, ovvero li ho già occupati tutti.

grazie in anticipo, spero di essermi spiegato.

Lol21
lol21 non è collegato   Rispondi citando
Vecchio 06 marzo 10, 23:30   #2 (permalink)  Top
User
 
L'avatar di marcosinatti
 
Data registr.: 10-06-2007
Residenza: Sansepolcro (Ar)
Messaggi: 1.948
La eeprom non la puoi usare come memoria di programma.
Il tuo problema è probabilmente dovuto al limite del compilatore, guarda bene se ti scrive sotto che è la demo quando compili.
Penso che parli di MikroC, giusto? Se è come Mikrobasic, ti da anche le statistiche che offrono info sull'occupazine della memoria.
marcosinatti non è collegato   Rispondi citando
Vecchio 07 marzo 10, 01:09   #3 (permalink)  Top
User
 
L'avatar di illez
 
Data registr.: 06-08-2007
Residenza: Empoli
Messaggi: 1.813
A me risulta che il 16f628a disponga di 2048 word di memoria programma.

Decisamente molto meno di quello che risulta essere il tuo programma compilato, da quanto scrivi...

La prima impressione, ma parlo senza conoscere i dettagli, è che il tuo programma sia poco ottimizzato e includa libreria già pronte delle quali forse puoi fare a meno.
Certo, con questo pic non puoi permetterti molto; considera pic con più memoria. Ad esempio, il 18F2455 con 24K.
__________________
.......
illez non è collegato   Rispondi citando
Vecchio 07 marzo 10, 10:11   #4 (permalink)  Top
User
 
L'avatar di lol21
 
Data registr.: 16-11-2008
Residenza: Riva del Garda - TN
Messaggi: 429
uhm..
effettivamente il codice che sto scrivendo non è poi corto, contate che devo fare un sacco di giri di pulsanti, se volete posso allegare il codice.
come righe di codice sono arrivato a 193 ma non ho finito perchè devo fare ancora 2 cicli di switch.
il compilatore è mikroc pro e le librerie sono quelle incluse, tengo le indispensabili ovvero per le stringhe, per i lavori sull'lcd, le librerie per il controllo dell'lcd appunto e le software_UART per il controllo dell'uart.
il datasheet del pic dichiara 2048 parole.

non potrebbe esserci un modo per limitare i cicli di switch?
nel senso, ora io ogni volta scrivo:
Codice:
switch(PORTA){
case 1:
freccia[nf] = 1;
break;
case 2:
freccia[nf] = 2;
break;
case 4:
freccia[nf] = 3;
break;
case ecc...
}
non ci sarebbe il modo di ridurre questi codici, io altrimenti devo fare 11 case ogni volta, il che va appesantire il codice di molto.

grazie comunque fin'ora
lol21

p.s.:
le statistiche di mikroc indicano che ho 2048 parole di programmazione in totale appunto, e ho fin'ora usato 2006 parole.
probabilmente più avanti cambierò pic, ma per ora ho questo per il primo prototipo (ne devo fare ben 11).
lol21 non è collegato   Rispondi citando
Vecchio 07 marzo 10, 11:11   #5 (permalink)  Top
User
 
L'avatar di illez
 
Data registr.: 06-08-2007
Residenza: Empoli
Messaggi: 1.813
Citazione:
Originalmente inviato da lol21 Visualizza messaggio
uhm..
effettivamente il codice che sto scrivendo non è poi corto, contate che devo fare un sacco di giri di pulsanti, se volete posso allegare il codice.
come righe di codice sono arrivato a 193 ma non ho finito perchè devo fare ancora 2 cicli di switch.
il compilatore è mikroc pro e le librerie sono quelle incluse, tengo le indispensabili ovvero per le stringhe, per i lavori sull'lcd, le librerie per il controllo dell'lcd appunto e le software_UART per il controllo dell'uart.
il datasheet del pic dichiara 2048 parole.

non potrebbe esserci un modo per limitare i cicli di switch?
nel senso, ora io ogni volta scrivo:
Codice:
switch(PORTA){
case 1:
freccia[nf] = 1;
break;
case 2:
freccia[nf] = 2;
break;
case 4:
freccia[nf] = 3;
break;
case ecc...
}
non ci sarebbe il modo di ridurre questi codici, io altrimenti devo fare 11 case ogni volta, il che va appesantire il codice di molto.

grazie comunque fin'ora
lol21

p.s.:
le statistiche di mikroc indicano che ho 2048 parole di programmazione in totale appunto, e ho fin'ora usato 2006 parole.
probabilmente più avanti cambierò pic, ma per ora ho questo per il primo prototipo (ne devo fare ben 11).
a vederlo così:
Codice:
switch(PORTA){
case 1:
freccia[nf] = 1;
break;
case 2:
freccia[nf] = 2;
break;
case 4:
freccia[nf] = 3;
break;
case ecc...
}
direi che è equivalente alla riga (a parte il caso 4):
Codice:
freccia[nf] = PORTA;
Magari trovi una formula matematica equivalente allo switch, riflettici un po'
__________________
.......
illez non è collegato   Rispondi citando
Vecchio 07 marzo 10, 11:36   #6 (permalink)  Top
User
 
L'avatar di lol21
 
Data registr.: 16-11-2008
Residenza: Riva del Garda - TN
Messaggi: 429
uhm... ci sto riflettendo, per ora posso dirti che non posso fare come fai tu perchè in realtà (come avrai sicuramente capito) i numeri lì rappresentati sono le traduzioni in decimale dei numeri binari.

potrei però fare una cosa un po complicata con un array giusto? in caso dovrei dichiarare un int con 128 elementi?
ma se io richiamo PORTA il valore mi ritorna in decimali o binario?
non ci ho mai provato, certo risparmierei un sacco di righe

ciao
lol21
lol21 non è collegato   Rispondi citando
Vecchio 07 marzo 10, 11:43   #7 (permalink)  Top
User
 
L'avatar di illez
 
Data registr.: 06-08-2007
Residenza: Empoli
Messaggi: 1.813
Citazione:
Originalmente inviato da lol21 Visualizza messaggio
uhm... ci sto riflettendo, per ora posso dirti che non posso fare come fai tu perchè in realtà (come avrai sicuramente capito) i numeri lì rappresentati sono le traduzioni in decimale dei numeri binari.

potrei però fare una cosa un po complicata con un array giusto? in caso dovrei dichiarare un int con 128 elementi?
ma se io richiamo PORTA il valore mi ritorna in decimali o binario?
non ci ho mai provato, certo risparmierei un sacco di righe

ciao
lol21
10 è sempre 10 a prescindere dalla sua rappresentazione
Non capisco il tuo discorso... che differenza fa se leggi una porta in binario o vedi quel numero come decimale, esadecimale, ottale etc???

al limite prova a buttare qui un pezzo di codice e lo vediamo insieme
__________________
.......
illez non è collegato   Rispondi citando
Vecchio 07 marzo 10, 11:58   #8 (permalink)  Top
User
 
L'avatar di lol21
 
Data registr.: 16-11-2008
Residenza: Riva del Garda - TN
Messaggi: 429
ad esempio al posto degli switch scrivere così;
Codice:
int val[128];
val[1] = 1;
val[2] = 2;
val[4] = 3;
...
freccia[nf] = val[PORTA];
non so se hai capito, io uso il valore di PORTA per richiamare l'il valore dell'array che sarebbe corrispondente al numero che userei.
se PORTA risulta 0b00000001 ovvero 1 allora il valore della freccia è 1.
se PORTA risulta 0b00000100 ovvero 4 allora il valore della freccia è 3.

spero di essere stato chiaro, io lo switch lo richiamo in totale 5 volte dunque un sistema così effettivamente sarebbe decisamente più comodo.

ciao
lol21
lol21 non è collegato   Rispondi citando
Vecchio 07 marzo 10, 12:05   #9 (permalink)  Top
User
 
L'avatar di illez
 
Data registr.: 06-08-2007
Residenza: Empoli
Messaggi: 1.813
Citazione:
Originalmente inviato da lol21 Visualizza messaggio
ad esempio al posto degli switch scrivere così;
Codice:
int val[128];
val[1] = 1;
val[2] = 2;
val[4] = 3;
...
freccia[nf] = val[PORTA];
non so se hai capito, io uso il valore di PORTA per richiamare l'il valore dell'array che sarebbe corrispondente al numero che userei.
se PORTA risulta 0b00000001 ovvero 1 allora il valore della freccia è 1.
se PORTA risulta 0b00000100 ovvero 4 allora il valore della freccia è 3.

spero di essere stato chiaro, io lo switch lo richiamo in totale 5 volte dunque un sistema così effettivamente sarebbe decisamente più comodo.

ciao
lol21
Il valore della freccia corrisponde alla posizione del bit acceso?
Se la chiami 5 volte, l'hai messa in una funzione a parte verooo???
__________________
.......
illez non è collegato   Rispondi citando
Vecchio 07 marzo 10, 12:13   #10 (permalink)  Top
User
 
L'avatar di lol21
 
Data registr.: 16-11-2008
Residenza: Riva del Garda - TN
Messaggi: 429
i cicli di switch sono in un while e alla fine incremento il numero della freccia da inserire. uso un while e non un for perchè così vi è la possibilità di cancellare la freccia (infatti in caso di pressione del tasto canc si diminuisce di uno il numero della freccia da modificare e resetta il valore della freccia.
visto che non riesco a spiegare bene allego i codici

virtus.c
Codice:
#include <header.h>
#define d 129
// Lcd pinout settings
sbit LCD_RS at RB7_bit;
sbit LCD_EN at RB6_bit;
sbit LCD_D7 at RB5_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB7_bit;
sbit LCD_EN_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB0_bit;

void main() {
     TRISA = 0b11111111 ;   // PORTE A come entrate
     //int ini;
     Soft_UART_Init(&PORTB, 1, 2, 9600, 0);      // apertura porta COM RS-232

     /* inizio a usare l'LCD */
     Lcd_init();
     Lcd_Cmd(_LCD_TURN_ON);
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Out(1, 1, "Paglione A conferma");
     /* LCD settato, ora inizia la funzione per cui si sceglie il paglione */
     while(PORTA != 17) {            // finche non si preme il tasto A
     switch(PORTA) {
      case 1:
      paglione = 1;
      break;
      case 2:
      paglione = 2;
      break;
      case 4:
      paglione = 3;
      break;
      case 8:
      paglione = 4;
      break;
      case 16:
      paglione = 5;
      break;
      case 32:
      paglione = 6;
      break;
      case 64:
      paglione = 7;
      break;
      case 128:
      paglione = 8;
      break;
      case 3:
      paglione = 9;
      break;
      case 5:
      paglione = 10;
      break;
      }
     Lcd_Out(1, 1, paglione);       // stampo a video il paglione usato
     Delay_ms(200);
     }
     while(1) {
     while(Soft_UART_Read(&error) != paglione) {
     switch(PORTA) {
     case 17:
     while(frea == 3) {
     switch(PORTA) {
      case 1:
      arcierea[frea] = 1;
      break;
      case 2:
      arcierea[frea] = 2;
      break;
      case 4:
      arcierea[frea] = 3;
      break;
      case 8:
      arcierea[frea] = 4;
      break;
      case 16:
      arcierea[frea] = 5;
      break;
      case 32:
      arcierea[frea] = 6;
      break;
      case 64:
      arcierea[frea] = 7;
      break;
      case 128:
      arcierea[frea] = 8;
      break;
      case 3:
      arcierea[frea] = 9;
      break;
      case 5:
      arcierea[frea] = 10;
      break;
      case 9:
      arcierea[frea] = 0;
      break;
      case 6:
      arcierea[frea] = 0;
      frea = frea-1;
      break;
      }
      for(i=0; i=10; i++) result = strcat(result, lcdresult[i]);
      result = strcat(result, paglione);
      result = strcat(result, 'A');
      result = strcat(result, ' ');
      result = strcat(result, ' ');
      result = strcat(result, volee);
      Lcd_Out(1, 1, result);
      result = 0;
      result = strcat(result, arcierea[0]);
      result = strcat(result, ' ');
      result = strcat(result, arcierea[1]);
      result = strcat(result, ' ');
      result = strcat(result, arcierea[2]);
      result = strcat(result, ' ');
      result = strcat(result, (arcierea[0]+arcierea[1]+arcierea[2]));
      Lcd_Out(2, 1, result);
      }
      volee++;
     break;
     case 33:
     while(freb == 3) {
     switch(PORTA) {
      case 1:
      arciereb[freb] = 1;
      break;
      case 2:
      arciereb[freb] = 2;
      break;
      case  4:
      arciereb[freb] = 3;
      break;
      case 8:
      arciereb[freb] = 4;
      break;
      case 16:
      arciereb[freb] = 5;
      break;
      case 32:
      arciereb[freb] = 6;
      break;
      case 64:
      arciereb[freb] = 7;
      break;
      case 128:
      arciereb[freb] = 8;
      break;
      case 3:
      arciereb[freb] = 9;
      break;
      case 5:
      arciereb[freb] = 10;
      break;
      case 9:
      arciereb[freb] = 0;
      break;
      case 6:
      arciereb[freb] = 0;
      freb = freb-1;
      break;
      }
      for(i=0; i=10; i++) result = strcat(result, lcdresult[i]);
      result = strcat(result, paglione);
      result = strcat(result, 'A');
      result = strcat(result, ' ');
      result = strcat(result, ' ');
      result = strcat(result, volee);
      Lcd_Out(1, 1, result);
      result = 0;
      result = strcat(result, arciereb[0]);
      result = strcat(result, ' ');
      result = strcat(result, arciereb[1]);
      result = strcat(result, ' ');
      result = strcat(result, arciereb[2]);
      result = strcat(result, ' ');
      result = strcat(result, (arciereb[0]+arciereb[1]+arciereb[2]));
      Lcd_Out(2, 1, result);
     }
     volee++;
     break;
     /* case 65: */
     }
     } // fine switch
     }
}
header.h
Codice:
     int arcierea[2];
     int arciereb[2];
     int arcierec[2];
     int arciered[2];
     int paglione;
     int volee = 1;
     int frea = 1;
     int freb = 1;
     int frec = 1;
     int fred = 1;
     char *lcdresult[10] = {'B', 'e', 'r', 's', 'a', 'g', 'l', 'i', 'o', ' '};
     char *result;
     char *error;
     int i;
immagino si capisca di più così che da come spiego io

ciao
lol21
lol21 non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
alimentatore insufficiente??? molale81 Batterie e Caricabatterie 2 09 aprile 09 23:35



Tutti gli orari sono GMT +2. Adesso sono le 09:20.


Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002