BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   pic con memoria insufficiente (https://www.baronerosso.it/forum/circuiti-elettronici/165697-pic-con-memoria-insufficiente.html)

frank 08 marzo 10 14:37

Anzi, meglio ancora e più efficiente:

Codice:

// MAXPAGLIONI e' il numero massimo di paglioni
int mask, i;
if (PORTA)
        for (mask=1, i=1; i < MAXPAGLIONI+1; mask = mask << 1, i++)
                if (PORTA & mask) break;
// al termine del ciclo, i contiene il numero del paglione colpito


illez 08 marzo 10 14:37

Citazione:

Originalmente inviato da lol21 (Messaggio 1964986)
per il case 6 infatti mettevo un if
il fatto che non siano potenze di 2 in realtà è perchè per alquni tasti uso un solo bit acceso per altri anche 2
ad esempio
case 1 (0b00000001)
case 2 (0b00000010)
case 4 (0b00000100)
...
case 3 (0b00000011) da quì non sono più potenze di 2

uso questo modo per non usare pin eccessivi.

grazie dell'aiuto, appena ho un po di tempo butto giù il codice completo

ciao
lol21

I tasti quanti sono? Li hai messi in matrice?

illez 08 marzo 10 14:40

Citazione:

Originalmente inviato da frank (Messaggio 1965103)
Anzi, meglio ancora e più efficiente:

Codice:

// MAXPAGLIONI e' il numero massimo di paglioni
int mask, i;
if (PORTA)
        for (mask=1, i=1; i < MAXPAGLIONI+1; mask = mask << 1, i++)
            if (PORTA & mask) break;
// al termine del ciclo, i contiene il numero del paglione colpito


Ci sono le eccezioni in alcuni casi (vedi 3, 5 etc)
i < MAXPAGLIONI+1; è inefficiente. Fai una somma ad ogni ciclo.
piuttosto:
i <= MAXPAGLIONI;

frank 08 marzo 10 14:46

Citazione:

Originalmente inviato da illez (Messaggio 1965113)
Ci sono le eccezioni in alcuni casi (vedi 3, 5 etc)
i < MAXPAGLIONI+1; è inefficiente. Fai una somma ad ogni ciclo.
piuttosto:
i <= MAXPAGLIONI;

Ancora meglio, grazie.
Per le eccezioni, come scrivevo non ho capito se è ammessa la possibilità di più bit accesi oppure no.

illez 08 marzo 10 14:48

Citazione:

Originalmente inviato da frank (Messaggio 1965130)
Ancora meglio, grazie.
Per le eccezioni, come scrivevo non ho capito se è ammessa la possibilità di più bit accesi oppure no.

Si, guardati il codice nella prima pagina. C'è diversi casi.
Alla fine un case non è così inefficiente come potrebbe sembrare.

Purché venga scritto UNA volta e non 4 come ho visto :fiu:

lol21 08 marzo 10 19:20

alura...
nelle gare di tiro con l'arco funziona così: si hanno x paglioni. su ogni paglione ci sono 4 arcieri con un bersaglio l'uno. ogni paglione è contrassegnato da un numero che visti dalla linea di tiro va aumentando da sinistra a destra.
ogni bersaglio è contrassegnato dalla lettera A o B o C o D. a ogni arciere viene dato un cartellino da attaccare alla faretra con scritto il numero del paglione seguito dalla lettera del bersaglio dove tira
ogni gara noi diamo degli score che sono dei fogli tabella doppia entrata dove vengono segnate le 3 freccie tirate ad ogni volee.
per comodità nelle classifiche viene usato un web-based sistem chiamato ianseo (scaricabile gratuitamente) che propone le classifiche da proiettare.

ora il problema: ogni 10 volee vi è una pausa, in questa pausa gli addetti alla gara (noi) prendiamo tutti gli score e li scriviamo manualmente nel programma.

ora la possibile soluzione:
dei terminali (uno per paglione) che abbiano pochi tasti: 1-2-3-4-5-6-7-8-9-10-M(0)-A-B-C-D-canc
quando accendiamo i palmari con dentro il pic, noi addetti ai lavori scegliamo il paglione a cui viene associato il palmare (da quì il primo switch) e clicchiamo A per confermare (uscire dal primo ciclo while PORTA != 17)
poi inizia la gara, a ogni volee arrivano gli arcieri e uno incaricato scrive in questo modo:
clicca A e gli viene proposto sull'LCD: "Bersaglio: "n° paglione seguito da A e sotto inserisce il valore delle freccie, sbaglia a inserire il valore, schiaccia il pulsante canc (6) e reinserisce il valore
poi preme B e fa le stesse cose, poi C e poi D
quando tornano a tirare laddetto alla console schiaccia un pulsante sull'interfaccia in visual basic che invia il segnale 1 e legge i dati sul paglione 1, poi invia 2 e riceve i dati del paglione 2, ecc.. (while Soft_UART_Read(&error) != paglione)

detto così è complicato, ma non credo che a livelli di programmazione con librerie già messe a disposizione del programma non ci fossero molti intoppi

comunque grazie fin'ora

ciao
lol21

frank 08 marzo 10 19:41

Citazione:

Originalmente inviato da lol21 (Messaggio 1965718)
quando accendiamo i palmari con dentro il pic, noi addetti ai lavori scegliamo il paglione a cui viene associato il palmare (da quì il primo switch) e clicchiamo A per confermare (uscire dal primo ciclo while PORTA != 17)
poi inizia la gara, a ogni volee arrivano gli arcieri e uno incaricato scrive in questo modo:
clicca A e gli viene proposto sull'LCD: "Bersaglio: "n° paglione seguito da A e sotto inserisce il valore delle freccie, sbaglia a inserire il valore, schiaccia il pulsante canc (6) e reinserisce il valore
poi preme B e fa le stesse cose, poi C e poi D
quando tornano a tirare laddetto alla console schiaccia un pulsante sull'interfaccia in visual basic che invia il segnale 1 e legge i dati sul paglione 1, poi invia 2 e riceve i dati del paglione 2, ecc..

Non si capisce molto. Ciascun tasto è collegato a una linea di input del PIC?

lol21 08 marzo 10 19:50

si, sono tutti collegati a una porta a del pic, i pin però non sono sufficienti e siccome devo utilizzare le porte b per l'LCD e le USART allora ho deciso che alcuni pulsanti sono collegati a 2 pin, in questo modo quando il bottone viene premuto il pic riceve 2 bit della porta a accesa e a seconda di quali bit sono accesi sceglie il valore

frank 08 marzo 10 21:17

Citazione:

Originalmente inviato da lol21 (Messaggio 1965789)
si, sono tutti collegati a una porta a del pic, i pin però non sono sufficienti e siccome devo utilizzare le porte b per l'LCD e le USART allora ho deciso che alcuni pulsanti sono collegati a 2 pin, in questo modo quando il bottone viene premuto il pic riceve 2 bit della porta a accesa e a seconda di quali bit sono accesi sceglie il valore

Mmmh e lavorare a matrice come qualcuno suggeriva?

lol21 08 marzo 10 23:03

alla fine ho risolto con l'array.
mi consolo sul fatto che avevo ragione: le variabili le registra sulla RAM :D
tanto che se gli dicevo
Codice:

int val[128];
mi dava insufficienza di RAM allora mi sono fatto furbo e ho fatto così:
Codice:

int *val;
    void init_var() {
          val[1] = 1;
          val[2] =2;
          val[4] = 3;
          val[8] = 4;
          val[16] = 5;
          val[32] = 6;
          val[64] = 7;
          val[128] = 8;
          val[3] = 9;
          val[5] = 10;
          val[9] = 0;
          val[6] = 0;
    }

:P
ho finito il codice e sono rimasto in 2024 kb :D
ora sono felice ma il lavoro non è finito, mi manca l'interfaccia in VB che invia i dati a PHP. e poi devo finire la scheda, spero tutto vada bene.

Grazie a tutti dell'aiuto, mi avete aperto nuovi orizzonti :)

ciao
lol21


Tutti gli orari sono GMT +2. Adesso sono le 07:54.

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