kucaio Inserito: 21 ottobre 2010 Segnala Inserito: 21 ottobre 2010 (modificato) Salve a tutti ho un problema a me incomprensibile per cui richiamo le vs conoscenze.Intanto invio due informazioni sul progetto e su come è stato costituito:Software MLab IDE ver.8.53Tools di programmazione : HI-TECH C lite v9.71aDebugger/ programmer: Pickit 2 ICSPMCU: PIC16F877AHardware STACKMemory usage: 8112 su 8192 void main(void) { TRISA=0b00001111; //255;//TRISA=0b00001111; TRISB=0; TRISC=0b10000000; TRISD=0; TRISE=0b00000111;//0;//TRISE=0b00000111; //setting_analogiche di ingresso OPTION = 0b00000111; CCP1CON =0b00001100; // PR2 = 255; // //T2CON=0b00000100; T2CON = 0b11111110; // CCPR1L = 0; // CCPR1H = 0; // //setting(); // effettua il settaggio delle porte e la configurazione dei registri del microcontrollore INTCON = 0x0; LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; // prima istruzione // __delay_ms(35); // wait 35mSec after power applied, lcd_write(0b00111100);//init_value; // secondo istruzione DelayMs(50); // wait 50mSec after power applied, lcd_write(0b00001111); // terza istruzione DelayMs(50); // wait 50mSec after power applied, lcd_write(0b00000001); // quarta istruzione DelayMs(2); // wait 2mSec after power applied, lcd_write(0b00000001); //lcd_write(0x28); // Set interface length // __delay_ms(1); lcd_write(0xF); // Display On, Cursor On, Cursor Blink DelayMs(1); lcd_clear(); // Clear screen DelayMs(1); lcd_write(0x6); // Set entry Mode // lcd_init(); // effettuta l'inizializzazione del display LCD // lcd_clear(); // pulisce lo schermo del display LCD lcd_blinkOFF(); lcd_pos_puts(0x0,"Benvenuti"); lcd_pos_puts(0x45,"--.-"); init_RTC(); // inizializza il real clock timer della dallas DS1302 ciclo_main(); } //********************************************************************* INIZIO CICLO MAIN **************************************************************************************** void ciclo_main(void) { while(1) { if (primo_avvio == 0) { funzione_temp_primo_avvio(); } //pulsante up if (pulsante_premuto(P_UP)) { pagina_uno = 0; pagina_temp_min_max(); } //pulsante down if (pulsante_premuto(P_DW)) // se pulsante è premuto (quando è premuto, porta il pin allo stato logico alto) { pagina_uno = 0; imposta_giorni(); } //pulsante right if (pulsante_premuto(P_RIGHT)) // se pulsante è premuto (quando è premuto, porta il pin allo stato logico alto) { pagina_uno = 0; pagina_setting_min(); } //pulsante left if (pulsante_premuto(P_LEFT)) // se pulsante è premuto (quando è premuto, porta il pin allo stato logico alto) { pagina_uno = 0; pagina_data_estesa(); } // effettua un count down per generere un evento ciclico , la stessa operazione si potrebbe realizzare un un interrupt su TMR0 if (pippo>4000) { analogicaAN0(); // funzione di conversione del valore analogico di ingresso per la lettura della temperatura scrivi_orario(); // funzione di scittura dell'orario sulla pagina principale del display LCD funzione_temperatura(); attiva_uscite(); if (comando == 10) { scrivi_rs232(); comando = 0; } pippo = 3000; } else { pippo = pippo++; } } } Quando utilizzo il debugger in simulazione MLABSIM non ho nessun problema, quando invece testo il programma con il PicKIT2 con l'ICSP il program counter impazzisce e mi salta di palo in frasca e quanto chiamo una funzione qualsiasi lo stack non va a 1 ma rimane a 0.Ho controllato il WDT è disabilitato e l'interrupt sono disabilitati, forse durante il ICSP vengono richiamate delle risorse per cui avendo usato il 99,6% della memoria del programma questo ha dei problemi in fase di esecuzione.mi potete dare delle dritte se avete bisogno di ulteriori informazioni fatemi sapere.Saluti. Modificato: 21 ottobre 2010 da kucaio
kappa47 Inserita: 26 ottobre 2010 Segnala Inserita: 26 ottobre 2010 Non conosco il PicKit, ma sicuramente utilizza delle risorse del micro, generalmente gli ultimi 16 byte della memoria dati, per cui non credo che il problema sia questo.Probabilmente l'Hi-Tech si costruisce uno stack software, ma 80 byte di stack (memoria che ti rimane) mi sembrano sufficienti per il numero di “call” che esegui.Prova a eliminare, meglio commentare, alcune routine per alleggerire il sistema e se funziona, le aggiungi una alla volta, provando di nuovo tutte le volte che aggiungi una funzione.Se è un problema di risorse lo scopri subito...Una precisazione: non serve fare un “ciclo_main” se al suo interno fai un “while (1)”.Metti il codice direttamente nel main, così risparmi una “call”.Facci sapere.
kucaio Inserita: 28 ottobre 2010 Autore Segnala Inserita: 28 ottobre 2010 Ciao,grazie della risposta, stavo giusto provando a commentare delle routine ed il problema effettivamente mi si sposta.il numero di call che eseguo è parecchio tant'e' che quando compilo il compilatore mi invia un bel po' di warning, potrebbe essere la causa dei miei mali? inoltre mi invia un messaggio di:" possible hardware stack overflow detected, estimated stack depth: 15".In merito al ciclo_main ho chiamato la routine all'esterno della main pochè viene richiamata da altre routine.Se posso ti posto il codice cosi' magari riesci a darmi una mano nel minor tempo grazie mille. (1273) Omniscient Code Generation not available in Lite mode (warning) HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.71a Copyright (C) 2010 Microchip Technology Inc. Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 93. recursive function call to "_main" Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 108. recursive function call to "_ciclo_main" Warning [1089] X:\8_A_Progetti prova in C\Inizio\impostazione.c; 32. recursive function call to "_imposta_giorni" Warning [1089] X:\8_A_Progetti prova in C\Inizio\impostazione.c; 155. recursive function call to "_impostazione_giorni" Warning [1089] X:\8_A_Progetti prova in C\Inizio\impostazione.c; 181. recursive function call to "_incrementa_posizione" Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 414. recursive function call to "_pagina_setting_min" Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 454. recursive function call to "_pagina_setting_ore" Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 491. recursive function call to "_pagina_setting_mese" Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 533. recursive function call to "_pagina_setting_anno" Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 568. recursive function call to "_pagina_setting_giorno" Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 607. recursive function call to "_pagina_setting_data" Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 664. recursive function call to "_attiva_uscite" Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 692. recursive function call to "_attiva_temporizzazione" Warning [1089] X:\8_A_Progetti prova in C\Inizio\main.c; 641. recursive function call to "_salvataggio" Warning [1089] X:\8_A_Progetti prova in C\Inizio\impostazione.c; 198. recursive function call to "_decrementa_posizione" Warning [1393] X:\8_A_Progetti prova in C\Inizio\main.c; 95. possible hardware stack overflow detected, estimated stack depth: 15 Memory Summary: Program space used 1DF2h ( 7666) of 2000h words ( 93.6%) Data space used 68h ( 104) of 170h bytes ( 28.3%) EEPROM space used 0h ( 0) of 100h bytes ( 0.0%) Configuration bits used 1h ( 1) of 1h word (100.0%) ID Location space used 0h ( 0) of 4h bytes ( 0.0%) Running this compiler in PRO mode, with Omniscient Code Generation enabled, produces code which is typically 40% smaller than in Lite mode. The HI-TECH C PRO compiler output for this code could be 2975 words smaller. See http://microchip.htsoft.com/portal/pic_pro for more information.
kappa47 Inserita: 29 ottobre 2010 Segnala Inserita: 29 ottobre 2010 (modificato) Il tuo errore e' nelle "recursive function". I motivi possono essere diversi.Il piu' probabile e' che, ad esempio, la funzione A chiama la funzione B e lafunzione B chiama la funzione A. In questo modo bisogna stare attenti al sistemacon cui si "esce" dal possibile loop che si innesta.Se vuoi usare questo metodo con sicurezza, devi fare funzioni "reentrand" (passaggio variabili nello stack) ma il "consumo" di risorse (memoria) aumenta parecchio in base al numero di "richiami" che si eseguono, cosa che tu devi evitare.La cosa piu' semplice e' quella di evitare la recursivita'.Devi cercare di "spezzare" le funzioni A e B in questo modo: la parte che ti interessa della funzione A che richiami nella funzione B deve diventare una funzione autonoma (al limite duplicandola sia per la funzione A, sia per lafunzione B ).Spero di non averti confuso le idee...Ciao. Modificato: 29 ottobre 2010 da Fulvio Persano
kappa47 Inserita: 29 ottobre 2010 Segnala Inserita: 29 ottobre 2010 Ho, inavvertitamente, introdotto un carattere per cui al posto della faccina bisogna leggere "funzione B".
Fulvio Persano Inserita: 29 ottobre 2010 Segnala Inserita: 29 ottobre 2010 Ciao.kappa47+29/10/2010, 10:59--> (kappa47 @ 29/10/2010, 10:59)Succede quando dopo la faccina si mette la parentesi (come nel tuo caso). Per ovviare a questo inconveniente, basta mettere uno "spazio" ed il gioco è fatto.Ora è corretto.
kucaio Inserita: 29 ottobre 2010 Autore Segnala Inserita: 29 ottobre 2010 Grazie mille kappa47 sei stato chiarissimo tant è che sono riuscito ad eliminare le recursività. L'unica domanda è: le recursività potrebbero causare quanto a me accade?inolltre dato che ci sono ne approfitto mi rimangono alcuni warning quando compilo hai mica un'idea di quali possano essere le cause?:grazie ancora. Warning [339] X:\8_A_Progetti prova in C\Inizio\impostazione.h; 9.29 initializer in extern declaration Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.71a\bin\picc.exe" --pass1 "X:\8_A_Progetti prova in C\Inizio\main.c" -q --chip=16F877A -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" Warning [339] X:\8_A_Progetti prova in C\Inizio\impostazione.h; 9.29 initializer in extern declaration Warning [358] X:\8_A_Progetti prova in C\Inizio\main.c; 845.13 illegal conversion of pointer to integer Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.71a\bin\picc.exe" --pass1 "X:\8_A_Progetti prova in C\Inizio\set_reset.c" -q --chip=16F877A -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" Warning [111] X:\8_A_Progetti prova in C\Inizio\set_reset.c; 13.39 redefining preprocessor macro "bitsetsingle" (X:\8_A_Progetti prova in C\Inizio\set_reset.h: 8) Warning [111] X:\8_A_Progetti prova in C\Inizio\set_reset.c; 14.40 redefining preprocessor macro "bitcrlsingle" (X:\8_A_Progetti prova in C\Inizio\set_reset.h: 9) Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.71a\bin\picc.exe" --pass1 "X:\8_A_Progetti prova in C\Inizio\settaggio.c" -q --chip=16F877A -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" Executing: "C:\Program Files (x86)\HI-TECH Software\PICC\9.71a\bin\picc.exe" -oLCD.cof -mLCD.map --summary=default,-psect,-class,+mem,-hex --output=default,-inhx032 eprom.p1 RTC.p1 delay.p1 lcd.p1 impostazione.p1 main.p1 set_reset.p1 settaggio.p1 --chip=16F877A -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" (1273) Omniscient Code Generation not available in Lite mode (warning) HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.71a Copyright (C) 2010 Microchip Technology Inc. Warning [1393] X:\8_A_Progetti prova in C\Inizio\main.c; 95. possible hardware stack overflow detected, estimated stack depth: 15 Memory Summary: Program space used 1EACh ( 7852) of 2000h words ( 95.8%) Data space used 67h ( 103) of 170h bytes ( 28.0%) EEPROM space used 0h ( 0) of 100h bytes ( 0.0%) Configuration bits used 1h ( 1) of 1h word (100.0%) ID Location space used 0h ( 0) of 4h bytes ( 0.0%) Running this compiler in PRO mode, with Omniscient Code Generation enabled, produces code which is typically 40% smaller than in Lite mode. The HI-TECH C PRO compiler output for this code could be 3015 words smaller. See http://microchip.htsoft.com/portal/pic_pro for more information.
kappa47 Inserita: 30 ottobre 2010 Segnala Inserita: 30 ottobre 2010 I problemi di stack sono imprevedibili e molto rognosi da trovare; se aggiungi che il compilatore C non fa nessun controllo o quasi (il bello e il brutto del C...) le cose si complicano. Hanno fatto C++ e C# per ovviare a questi problemi. Veniamo ai warning:1) initializer in extern declaration: fai un assegnamento ad una variabile esterna che non hai dichiarato nel modulo in cui la utilizzi.2) illegal conversion of pointer to integer: piu' che un warning, per me e' un errore (dipende dal contesto in cui tu usi l'integer)Quando si fanno conversioni, ad esempio da intero a byte, si perdono delle informazioni (lo stesso accade da byte ad intero se hanno segno)Un puntatore (dipende dal compilatore) puo' occupare piu' di 2 byte (anche se sembra strano dato che l'indirizzamento del codice e' sicuramente inferiore ai 64k: pensa ad eventuale banchi di memoria...) 3) redefining preprocessor macro "bitsetsingle": probabilmente fai piu' di una "include" dello stesso file "*.h"Vorrei ricordarti che queste sono indicazioni di massima; per avere le corrette informazioni, il manuale del compilatore e' la scelta migliore.
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora