Newsgroup: it.hobby.elettronica.digitale
Titolo: Settaggi pic 628

Salve sto impazzendo con la programmazione del pic in oggetto.
In pratica  ho scritto in C il programma, lo compilo e con un simulatore 
funziona perfettamente.
Quando invece programmo il PIC non funziona nulla.
Ho provato anche con un listato di prova semplice e funziona, quindi il 
mio errore en nel file C.
Credo che l'errore sia non definire l'allocazione di memoria del PIC e 
il banco ram 0/1.
Di seguito riporto il listato, se qualche anima pia mi potesse aiutare 
... Il mio obietivo è attivare un'uscita su B alla chiusura di A e 
verificare a seconda di quale A è chiusa quale B si può aprire.
main()
{
CMCON = 7;
PORTA = 0x00;     // azzera linee porta A
PORTB = 0x00;     // azzera linee porta B
TRISA = 0x0F;      // imposta linee porte A come ingressi
TRISB = 0x000;    // imposta linee porte B come uscite
while (RA3=1) {              // ciclo infinito
	RA0=0;
  		if(RA1=1) {
     			PORTB = 0b00000010;
  			}
		else{
			PORTB=0b00000000;
		}
		}
while (RA2=1) {
	RA1=0;
   		if(RA0=1){
			PORTB =0b00000001;
   		}
   		else{
	  			PORTB=0b00000000;
 
   			}
    	 	}
while (RA0=1){
	RA1=0;
	PORTB=0b00000001;
	if (RA3=1){
	RA0=0;
	break;
		}
	}
while (RA1=1){
	RA0=0;
	PORTB = 0b00000010;
	if (RA2=1){
	RA1=0;
	break;
		}
	}
}


    > while (RA2=1) {
        > RA1=0;
        > if(RA0=1){
                    > PORTB =0b00000001;
                    >    }
    >    else{
            >   PORTB=0b00000000;
            >    }/*end if*/
    >     }/*end while*/
            > while (RA0=1){
                        > RA1=0;/*<---perchè imponi un valore a un
ingresso???*/
                        > PORTB=0b00000001;
                        > if (RA3=1){
                                        > RA0=0;
                                        > break;
                                        > }/*end if*/
                           > }/*end while*/
                > while (RA1=1){
                                            > RA0=0;
                                            > PORTB = 0b00000010;
                                            > if (RA2=1){
                                                            > RA1=0;
                                                            > break;
                                                            > }/*end if*/
                                                         > }/*end while*/
                                                    > }/* end main*/

 }
Sinceramente non ho capito la logica con cui vorresti far funzionare il 
tuo programma. Mi chiedo se davvero funziona con il simulatore. Inoltre, 
  come hai collegato gli ingressi? Con dei pull-up esterni?
Hai usato la porta a come ingresso e la porta b come uscita, ma 
quest'ultima ha dei pull-up interni molto comodi proprio per collegarci 
direttamente dei pulsanti (magari con un 100 nF in parallelo come 
antirimbalzo).
Alcuni spunti: se vuoi replicare la porta A sulla B basta un PORTB = 
PORTA. Oppure se sai che è stato premuto l'ennesimo bit di PORTA e vuoi 
attivare il corrispondente sulla porta B puoi fare PORTB = 1 << n;
Ciao
Marco / iw2nzm

blisca ha scritto:

Impongo un valore all'ingresso RA0 e RA1 in funzione di due ingressi RA2 
e RA3 visto che mi funzionano da stopper.
Mi spiego controllo un motore che va avanti e indietro su un binario per 
il fine corsa ho messo due microswitch collegati agli ingressi RA2 e RA3 
in modo che mi bloccano il movimento e mi permettono solo di tornare 
indietro.
Spero di essere stato + chiaro

 while (RA3=1) {              // ciclo infinito
[...]
qui e anche in seguito, per fare un controllo usi questa sintassi.
In c la sintassi corretta è
 while (RA3= =1) {              // ciclo infinito
con 2 segni = verifichi l'uguaglianza.
un solo segno = fa una assegnazione. 

Roberto P. <roberto...@LEVAMIrobertopedrazzoli.it> wrote in message
f1btnv$31k$1...@tdi.cu.mi.it...

bravo ,era grosso così e mi era scappato


[...]
Altra possibile causa: potrebbe essere che con tutti quei cicli while, se 
hai abilitato il watchdog, ti si resetti il micro continuamente.
Studia meglio il problema e vedrai che con qualche 'if' in più puoi fare a 
meno di tutti quei cicli while, restituendo prima il controllo al ciclo 
principale del programma e mantenendo quindi la possibilità di fare 
eventualmente altre cose in modo parallelo.
Roberto P. 

 eventualmente altre cose in modo parallelo.
Concordo 

 watchdog.
??????
Personalmente non ho mai visto un compilatore C che faccia questo, e parlo
di compilatori "seri".
Cosa ne sa il compilatore:
- se il watchdog è abilitato (usato)
- quale è il periodo di overflow del watchdog e quindi ogni quanto serve
fare il refresh del watchdog
- quale è il valore del clock con cui gira il micro e quindi con che
velocità il micro esegue le istruzioni del programma
- quanto tempo è richiesto al micro per eseguire ogni singola funzione e ISR
del programma
- in quali punti del programma è indispensabile inserire il refresh del
watchdog per non avere un reset del micro
- ...
Ammesso che esista un compilatore C che fa quanto dici, scommetti che sono
capace di scrivere un programma per quel compiltaore con cui riesco a far
resettare il micro per watchdog e a "fregare" così questo tuo compilatore?
Puoi citarmi qualcuno di questi compilatori "seri" che fa quanto dici?
Vorrei dare un'occhiata ai relativi manuali.
Grazie

 watchdog.
Più che altro se davvero un compilatore si occupasse di ricaricare il 
wdt tanto vale spegnerlo direttamente! :)
Marco / iw2nzm

 ha scritto nel messaggio 
news:rHW_h.26787$uJ5.4...@twister2.libero.it...

Non sapevo questo, allora volendo usare il watchdog con il C diventa una 
cosa difficilissima? la mia esperenienza attuale si basa principalmente 
nell'uso del PicBasic Pro della Melabs, che so essere considerato una 
schifezza da tutti i programmatori seri che invece usano il C, come dicevo 
con il Pic Basic Pro si stabilisce il clock del micro ed il complatore si 
occupera' di inserire il richiamo per ricaricare il timer del watchdog, la 
cosa l'ho constatata di persona, andando a leggere il codice assembler che 
produce, e testando con prove hardware, inoltre se si vuole che il 
compilatore non debba generare nulla per ricaricare il timer del watchdog 
basta inserire l'istruzione DEFINE NO_CLRWDT 1.
Detto cio' siete sicuri che i compilatori in C non facciano la stessa cosa? 

 Detto cio' siete sicuri che i compilatori in C non facciano la stessa cosa? 
Il wdt è letteralmente il "cane da guardia" del tuo programma. E' un 
timer che ogni x tempo (che dipende dalle applicazioni, ma facciamo 
dell'ordine dei ms o delle decine di ms) va in overflow se non viene 
ricaricato. A seguito dell'overflow avviene il reset del microcontroller.
Ora, scopo del wdt è di impedire che il programma si possa bloccare (per 
errori di programmazione, situazioni non gestite o anche - credo - 
possibili interferenze esterne). Come? Il programmatore deve inserire 
nei punti giusti le istruzioni di ricarica del wdt. E' ovvio che se si 
farcisce il codice di restart_wdt() o peggio si delega al compilatore di 
inserirle qua e là per evitare che il wdt non causi mai il reset viene 
meno l'idea di fondo e rende inutile il suo utilizzo.
Usare il wdt timer, ovvero scegliere i punti in cui inserire le 
istruzioni di ricarica, non è una cosa poi così banale. Personalmente 
seguo questa strada: cerco di creare nel main un unico ciclo infinito e 
faccio in modo che il flusso del programma ci passi il più possibile. 
Perciò cerco di evitare chiamate a funzioni che richiedono loro stesse 
lunghi cicli. Fatto questo cerco di stimare il tempo massimo di 
permanenza fuori dal ciclo principale, ci aggiungo un 'tot' e imposto di 
conseguenza il tempo di overflow del wdt.
In pratica, nel 99% dei casi uso una sola istruzione di ricarica del 
watchdog e la inserisco nel ciclo del main.
Sicuramente ci saranno metodi migliori e gli amici del NG più esperti di 
me ti sapranno consigliare meglio. Spero solo di averti dato qualche spunto!
Ciao!
Marco / iw2nzm

 Marco / iw2nzm

 spunto!
Spero che anche altri possano dire la loro, comuque non togliendo nulla a 
quanto hai detto ti assicuro che gia' conoscevo la funzione ed il 
funzionamento del WDT. 

 
in un altra risposta ti ho detto cosa assolutamente NON fare per gestire 
il WD


 seguito dell'overflow avviene il reset del microcontroller.
Con quale istruzione ricarichi il watchdog in C? 

 Con quale istruzione ricarichi il watchdog in C? 
Uso il compilatore della CCS: restart_wdt();
Ciao,
Marco / iw2nzm

"Marcus" ha scritto

Varia in base al compilatore C che usi.
Cerca sul manuale del tuo compilatore.