Ciao
Inizio anche io a rompere ^_^, vorrei chiarimenti sul funzionamento dei calcoli.
Ad esempio tentando di gestire il tempo verificando i valori posizionali del display
val_pos0 per i secondi
val_pos1 per le decine dei secondi
val_pos2 per i minuti
val_pos3 per le decine dei minuti
val_pos4 per le ore
val_pos5 per le decine delle ore
tutte le variabili suddette sono inizializzate a INT (per cercare di economizzare l'utilizzo di memoria)
mentre lngTempoRipresa è inizializzata a "unsigned long"
la seguente formula non funziona perché moltiplicando una variabile intera per un numero superiore a 32767 va in overflow
lngTempoRipresa = val_pos01000+val_pos110000 +
val_pos260000+val_pos3600000 +
val_pos43600000+val_pos536000000;
Per farla funzionare ho dovuto modificare i calcoli come segue:
percalcoli = val_pos0;
lngTempoRipresa = percalcoli1000;
percalcoli = val_pos1;
lngTempoRipresa = lngTempoRipresa + percalcoli10000;
percalcoli = val_pos2;
lngTempoRipresa = lngTempoRipresa + percalcoli60000;
percalcoli = val_pos3;
lngTempoRipresa = lngTempoRipresa + percalcoli600000;
percalcoli = val_pos4;
lngTempoRipresa = lngTempoRipresa + percalcoli3600000;
percalcoli = val_pos5;
lngTempoRipresa = lngTempoRipresa + percalcoli36000000;
percalcoli è una variabile provvisoria ed è inizializzata a "unsigned long"
Qualcuno ha qualche consiglio per ottimizzare questa funzione?

Puoi usare quello che in C viene detto cast, ovvero conversione da un tipo ad un altro.
Molto semplicemente puoi scrivere quelle costanti con al fondo un qualificatore di tipo L (long) oppure UL (unsigned long)
lngTempoRipresa=val_pos0*1000UL ....
In pratica in questo caso:
lngTempoRipresa = val_pos0*1000;
Per il compilatore stai chiedendo:
unsigned long = int * int
A differenza di altri linguaggi tipo Basic che fa da solo il casting, ovvero capire che potrebbe essere utile considerare qui int * int come unsigned long, il C fa esattamente quello che scrivi. Prima moltiplica int X int ed essendo 2 operandi int, il risultato è un int. Solo dopo assegna quel valore int a una "unsigned long".
Scrivendo anche solo
lngTempoRipresa = val_pos0*1000UL;
oppure
lngTempoRipresa = (unsigned long)val_pos0*1000UL;
Allora hai una moltiplicazione fra un int e un unsigned long e quindi l'operazione da un risultato unsigned long.
Perfetto! funziona benissimo anche così però ho ancora una domanda,
con questa formula (che funziona perfettamente), il compilatore mi da come dimensione del file binario = 13072
lngTempoRitorno = val_pos01000UL+val_pos110000UL+
val_pos260000UL+val_pos3600000UL+
val_pos43600000Ul+val_pos536000000UL;
mentre con questa (che mi sembra più complicata, il compilatore mi da come dimensione del file binario = 12162, una bella differenza 
lngTempoCalcoloParziale = val_pos0;
lngTempoRitorno = lngTempoCalcoloParziale1000;
lngTempoCalcoloParziale = val_pos1;
lngTempoRitorno = lngTempoRitorno + lngTempoCalcoloParziale10000;
lngTempoCalcoloParziale = val_pos2;
lngTempoRitorno = lngTempoRitorno + lngTempoCalcoloParziale60000;
lngTempoCalcoloParziale = val_pos3;
lngTempoRitorno = lngTempoRitorno + lngTempoCalcoloParziale600000;
lngTempoCalcoloParziale = val_pos4;
lngTempoRitorno = lngTempoRitorno + lngTempoCalcoloParziale3600000;
lngTempoCalcoloParziale = val_pos5;
lngTempoRitorno = lngTempoRitorno + lngTempoCalcoloParziale36000000;
Si sicuro? 
Se si, è curioso. Sinceramente non mi viene in mente su due piedi una spiegazione. 
Questo mi sembrava di averlo capito
Quello che trovo strano è che nella prima formula, anche considerando tutti i valori come unsigned long
(le 6 val_posn definite "int" e quella lngTempoRitorno definita "unsigned long") dovessero occupare 7*32 bit = 214 bit
Mentre nella seconda formula uso ancore tutte e 6 le variabili definite "int" anche altre 2 definite "unsigned long" più tutte le righe di comando , lo spazio occupato sarebbe risultato pressoché identico, mentre ci sono ben 900 bit di differenza 
Comunque grazie di tutto, ho imparato qualche cosa di nuovo
e se trovi anche una risposta del perché di questa differenza .....
Sei stato gentilissimo