memorizzare le coordinate dei punti di un touchscreen in un array

12 Anni 4 Mesi fa #1 da licius1991
Ciao a tutti. Dovrei fare un progetto molto semplice su una easypic5 con microcontrollore PIC16F87 e schermo touchscreen WDG0151-TMI-V#N00.

Si tratta di tracciare delle linee sul touchscreen e di far apparire sullo schermo una scritta che indichi attraverso quali quadranti passa (mediante il calcolo del coefficiente angolare della retta).

avevo pensato di mettere le coordinate dei punti in 2 array (uno per le x e una per le y) ma non funziona. Il compilatore (MikroC pro) compila senza errori e mi da uno usage della RAM del 56% ma sullo schermo riesco solo a prendere tracciare 2 punti.
Non è che c'è un limite alla dimensione degli array? se metto array da 20 elementi funziona ma se metto array da 30 elementi non funziona. si blocca. posto la parte di codice interessata

#define DIM 20
unsigned int i, x_coord, y_coord, dot_x[DIM], dot_y[DIM];

while (i<DIM) {

if (TP_Press_Detect()) {
if(TP_Get_Coordinates(&x_coord, &y_coord)==0) {

dot_x=x_coord;
dot_y=y_coord;
i++;
Glcd_Dot(x_coord, y_coord, 1);
Delay_ms(100);
continue;

}
}

}

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • licius1991
  • New Member
  • New Member
Di più
12 Anni 4 Mesi fa #2 da Spazzoli
Non conosco quel micro, quindi magari sparo una cavolata bella grossa....non potrebbe essere che finisci la memoria RAM a disposizione?

anto.spax
youtube robot gallery:
www.youtube.com/user/antospax?feature=mhum

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Spazzoli
  • Avatar di Spazzoli
  • Senior Member
  • Senior Member
Di più
12 Anni 4 Mesi fa #3 da licius1991
no perchè il compilatore mi dice che ho ancora almeno il 50% di RAM e di ROM.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • licius1991
  • New Member
  • New Member
Di più
12 Anni 4 Mesi fa #4 da Mauro Laurenti
Ciao,

@licius

io non conosco il compilatore in questione ma...

i PIC16 hanno un'architettura a banchi e la memoria RAM non e' lineare, ovvero e' distribuita sui vari banchi. Sebbene tu faccia uso solo del 56% se il compilatore non posiziona correttamente le tue variabili rischi di passare da un banco di memoria ad un altro il che puo' creare l'errore "anomalo che vedi".

Un array da 30 elementi di int non e' piccolo.
Un int occupa generalmente due byte per cui hai un minimo di 60 byte.
Considerando che hai 4 banchi e un totale di 368 byte (circa 90 byte per banco), la probabilita' che il tuo array vada da un banco ad un altro e il compilatore non lo gestisca e' piuttosto elevata.

Normalmente per gestire questi casi i compilatori mettono a disposizione di metodi alternativi rispetto a quelli "standard".

@Spazzoli
Normalmente il compilatore si accorge se richiedi piu' RAM del necessario. In maniera piu' o meno diretta hai un errore di compilatore. Nel caso di licius il compilatore non reclama, per cui il problema e' subdolo!


Saluti,

Mauro
Ringraziano per il messaggio: Spazzoli

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
12 Anni 4 Mesi fa #5 da licius1991
Grazie mille Mauro per il tuo aiuto. Cerchero di usare meno punti. Vorrei porre allora un'altro paio di domande:

Per il progetto di elettronica devo fare riconoscere al micro controllore per quale ottante passa una retta tracciata a caso su touchpanel. La mia soluzione per il momento prevede di campionare ogni x millisecondi il pixel premuto, registrarlo in un array di 20 elementi e in un secondo momento calcolare i coefficienti angolari di coppie contigue di punti campionati, farne la media e quindi in base a queste considerazioni dire dove passa la retta. Per il momento sono riuscito a farlo per solo due punti campionati ma non dovrebbe essere difficile estendere a 20 punti il calcolo.

Hai in mente soluzioni più eleganti di questa?
Quando faccio i rapporti per determinare i coefficienti angolari non so perché ma il micro mi fa rapporti troncati all'intero più piccolo. Non mi restituisce un risultato double neanche se gli forzo il risultato mettendo "(float)" difronte all'operazione come in un programma C normale. Questo mi ha costretto a fare un giro Dell'oca per aggirare il risultato. Da un punto di vista pratico non e' un problema perché alla fine mi serve definire solo se il coefficiente angolare della retta passante per due punti e' maggiore o minore di +\- 1 ecc. Pero avere a disposizione cifre decimali mi permetterebbe di avere una stima della media dei coefficienti angolari piu' accurata nel caso in cui la linea sia borderanno line tra due ottanti.
Hai idea di come ottenere un risultato double?

Grazie mille in anticipo

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • licius1991
  • New Member
  • New Member
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login