Newsgroup: it.hobby.elettronica.digitale
Titolo: debug sotto ccs

Salve!
Proseguono gli esperimenti in C.
Ho scoperto che il compilatore CCS accetta per il debug anche ICD2, per 
fortuna avevo un clone di ICD2 acquistato diversi anni fa per programmare i 
pic sotto Mplab, comunque ho compilato e programmato il pic, ho voluto 
provare a fare il debug premendo single step vedo la freccia verde che si 
sposta fra main e la func1, questo per un solo ciclo poi la freccia verde si 
sposta su #use delay (clock=20000000) e li rimane anche pigiando diverse 
volte single step, e' normale?
Sapete se con CCS si puo' usare ICD2 come programmatore?
#include <16f877A.h>
#fuses hs,nolvp,nowdt
#use delay (clock=20000000)
#define green_led pin_a5
#define yellow_led pin_b4
#define red_led pin_b5
void func1();                       /*prototipo di funzione*/
void main ()  {
    while (true) {
    output_low (green_led), output_low (yellow_led),output_low (red_led);
    func1();
    output_high (green_led),output_high (yellow_led),output_high (red_led);
    func1();
    }
}
void func1(){                        /*funzione che crea un ritardo di 
0.5secondi*/
delay_ms (500);
} 

> Sapete se con CCS si puo' usare ICD2 come programmatore?
si;
guarda sul loro sito (
ccsinfo.com
), c'è anche un'utility stand-alone che ti 
permette di caricare un hex e sbattero nel pic;
il debbug funziona ma ha non è perfetto... c'è qualche bug come in 
qualsivoglia debugger che abbai mai provato
la tua è una sintassi che non uso, controlla che sia possibile dichiarare 
prima l'header della funzione (come hai fatto) e DOPO il main() mettere la 
funzione stessa;
cmq se compila... ok!!!
controlla (dopo che il debugger ha caricato il programma) cosa ti dice circa 
la frequenza di clock: deve essere come quella che tu hai messo alla 
direttiva #use delay;
fa eccezione il pll interno o l'oscillatore onchip ma non è il tuo caso
- quando incontri una delay non usare step-into ma il trace-over (f5 mi 
pare)
- prova anche a dargli RUN senza il single step insomma e vedi se il 
programma gira
- tieni corto il cavo tra icd e scheda
- che versione ccs hai?
-ice-

 - che versione ccs hai?
Ho provato anche questa cosa, non cambia nulla, se do run il programma gira 
ma non si puo' fare il debug come lo intendo io, cioe' vedere cosa cambia 
nei registri, nella ram ecc. comunque quando la freccia si ferma su #use 
delay (clock=20000000) dando ulteriori comandi di step-into vedo che nel 
registro ram cambiano dei valori quindi qualcosa VIVE :-).
il cavetto e' circa 10cm, la versione e' 4.084.
P.s. se dichiaro  una variabile ad esempio" int diego", quando vado a fare 
il debug volendo capire come sta cambiando quella variabile "diego" come 
posso farlo in modo umano? intendo dire che se metto la finestra RAM non 
trovo il nome che ho dato alla variabile ma devo cercare di capire quale sia 
l'indirizzo della varibile per poi leggerne i valori, e' questo il modo 
corretto?

 corretto?
no;
c'è la possibilita di usare le watch e cmq anche la possibilità di fare un 
log degli stati della variabile;
guardaci, vedrai che non è difficile!
poi se hai bisogno chiedi
-ice- 

 non è che per caso hai degli interrupt attivi?
Il programma e' esattamente quello che ho postato, non ho attivato almeno 
volontariamente nessun interrupt. 

 poi se hai bisogno chiedi
In verita' ho provato a monitorare una variabile ma non ci sono riuscito, 
potresti farmi un esempio?
ho modificato la funzione delprogramma precedente in questo modo:
void func1(){
static int number_one=1;
delay_ms (number_one);
number_one++;
}
volevo vedere come la varibile venisse incrementata e non distrutta visto 
l'uso di static alla chiusura della funzione. 

 }
così è ovvio che ti si pianta sulla #use delay... delay_xx è una funzione 
interna!!!
prova a fare un debug senza nessuna delay_ms ma solo con i led, vedrai che 
va
-ice- 

 va
Non si pianta per niente, perche' dovrebbe? il programma funziona benone 
solo che prima di mettere in mezzo cose piu' complesse vorrei  capire bene 
come funziona il debug sotto IDE di CCS quindi vorrei capire come monitorare 
una variabile 


Hai voglia di aspettare, qui fino a quando chiedi cose stupide e semplici 
troverai chi scrive, non appena si va al sodo si potra' avere come ora la 
risposta di nessuno oppure arriva il paladino COGLIONAZZI, sei stato 
sfortunato perche' anche lui non ha scritto nulla, forse perche' si occupa 
di Atmel. 

 di Atmel.
????????????? non capisco cosa vuoi dire, chi e' sto paladino? mica devono 
rispondermi forzatamente. 

"diego"  ha scritto nel messaggio:

Azz non conosci COGLIONAZZI, il padrone del newsgroup, quello che non sa un 
cazzo ma vorrebbe far credere di sapere. 

 risposta di nessuno oppure arriva il paladino COGLIONAZZI, sei stato
il tuo contributo quale sarebbe?
il fatto di monitorare la variabile è semplice... appena ho un attimo e 
attacco l'icd2 gli spiego passo-passo;
per la questione che rimane sempre sulla #use delay mi pare ovvio... come 
dicevo la delay è una funzione interna nel C della ccs per cui non ci puoi 
fare step-into
se si vuole vedere come cambia una variabile bisogna fare
x=0;
x+=3;
e si piazza una watch sulla x, punto!
-ice-


Ti ringrazio per le informazioni che mi dai, sto provando in questo modo 
senza avere i risultati voluti:
vado in debug, clicco su debug windows poi clicco su watches, poi premo su + 
a questo punto in expression metto la varibile che vorrei monitorare cioe' 
number_one premendo su edit_watch ho #ERROR12: Undefined identifier, se 
provo a specificare il tipo mettendo int ho ERROR #51 :A numeric expression 
must appear her 

 un cazzo ma vorrebbe far credere di sapere.
Non mi interessano le tue considerazoni vai ad infastidire qualcun altro, 
anzi cerca di non dar fastidio a nessuno 


Avevi ragione, togliendo il delay il porgramma gira sempre e non va piu' a 
piantarsi su #use delay (clock=20000000), anche se al dire il vero non si 
paintava, ovvero il programma continuava a girare ma non vedevo piu' sulla 
finestra del sorgente la freccina verde spostarsi sulle varie righe di 
programma.
Anche la questione variabile ora funziona.
Grazie delle informazioni. 

 paintava, ovvero il programma continuava a girare ma non vedevo piu' sulla
in settimana ho pochissimo tempo e dalla ditta non riesco a rispondere sul 
ng per cui sono stato super sintetico;
il discorso è che tu fai fare uno step al debugger che deve sfruttare le 
risorse di debug dentro al micro e quindi ci vuole tempo per trasmettere il 
comando e ricevere la risposta dal micro... non sei in real-time insomma;
quindi succede che, mentre tutto questo avviene, di cicli macchina ne 
passano diversi e il micro si basa su questi per assecondare la richiesta di 
"wait" di, esempio, 10 milli-secondi e tu ti ritrovi sempre su quella 
direttiva #use delay
facci caso: esistono anche la funzione delay_cycles() ed esiste la 
possibilità di fare resettare il watch-dog durante le dalay
se proprio vuoi entrare dentro una delay devi striverti tu una function 
my_delay_us(int wait_state) e inserire dentro di essa qualcosa tipo
#asm
nop
nop
nop
#endasm
il numero delle nop (= no operation) dipende da quanto vuoi aspettare e 
dalla frequenza a cui fai viaggiare il clock... e di fatti il compilatore 
per renderti disponibili le funzioni delay_ms(), delay_us() deve prima 
sapere a che frequenza vai... ed ecco la #use delay(clock=32768)!!!
40MHz significa 100ns ad istruzione
alla prossima!
-ice-