Niubbo PIC16F84 problema input

Ciau a tutti,

ho iniziato oggi a smanettare un po' con ludipipo, pic16f84 e schede di prototipazione rapida. Sono riuscito a programmare il pic affinche' mi accenda il led collegato ad una RB qualsivoglia. Poi ho deciso di aggiungere al circuito un pulsante che finche' e' premuto, tiene il led spento. Quando invece lo rilascio, mi accende il led. E qui sono sorti dei grossi problemi: come collego il pulsante?

Ho programmato il pic in modo tale che TRISA=15 e TRISB=0, cosi' tutte le RA sono ingressi e tutte le RB sono uscite. Ho settato PORTB=0b00000010, cosi' RB1 e' acceso di default. Poi ho messo un bel ciclo infinito all'interno del quale ho messo la condizione if(PORTA==1) PORTB=0b00000000; else PORTB=0b00000010; e credo di non aver fatto errori. Ho programmato il pic ed infatti il led e' acceso. ho preso un filo, l'ho collegato alla linea +5V e per simulare il pulsante, l'altra estremita' la mettevo a contatto del pin RA0, ma non succedeva niente. Se invece collego un filo alla RA0 e l'altra estremita' la tengo in mano, il led si spegne. Perche'?

La mia domanda e': che tipo di segnale serve in ingresso alla RA0 per far funzionare il tutto? Come collego il pulsante?

Grazie in anticipo a tutti quelli che avranno qualche minuto da dedicarmi! :-)

CIAU!!!

Reply to
Aklark
Loading thread data ...

La porta A ha 5 pin di I/O (su RA4 devi mettere un pull-up) Quindi TRISA=31

Colleghi RB1 a GND con una resistenza da 1K e il pulsante lo metti tra RB1 e VCC In genere non è consiglato collegare un un filo volante ad un pin... il filo si comporta come un'antenna e quindi può succedere un po' di tutto. I pin di ingresso non utilizzati è meglio connettreli a gnd o vcc, ma non lasciarli flottanti

Il tuo programma funziona, ma tieni presente 2 cose:

- se nel loop introduci alte azioni, la frequenza con cui viene controllato il pin diminuisce e quindi se premi il pulsante per poco tempo potresti non vedere spegnersi il led

- quando chiudi un contatto meccanico si genera un treno di impulsi quindo dopo la pressione tu il led lo vedi spento anche se per qualche istante si accende e spegne velocissimamente

Come passo successiovo prova ad utilizzare l'interrupt esterno (int0, su pin B0) o l'interrupt-on-change (pin b7..b4)

Ciao!

Reply to
Ice

Scusa l'ignoranza, ma cos'e' un pull-up? Guardando in rete ho scoperto che si tratta semplicemente di una resistenza, immagino che dovro' collegare l'altra estremita' a +5V, ma quanto deve valere la resistenza? E a cosa serve in pratica?

Ho risolto collegando il pulsante in serie ad una resistenza di 470; nel nodo formato dalla serie prendo il segnale e lo mando a RA0. Il cip e' programmato correttamente, poiche' accende e spegne il led, ma dal momento in cui premo al momento in cui spegne il led, passa una frazione di secondo (circa mezzo secondo). Idem quando rilascio il pulsante. Come mai? Dipende forse dal valore del "Quarzo" (si chiama cosi'?) e dei relativi condensatori? (Ho letto solo ora sotto ed ho visto che mi hai gia' risposto... e' il loop di cui parlavi, vero?)

Ho notato :-)

Ah, ok! li sparo tutti a GROUND :-) Grazie del consiglio!

Come evitare questo treno di impulsi?

Ok, ho visto che la RB0 serve per gli interrupt esterni, piu' avanti imparero' ad usarli. Per oggi (primo giorno di smanetting) mi ritengo soddisfatto del punto in cui sono arrivato (o meglio, del punto in cui mi avete accompagnato) :-)

Grazie!

CIAU!!!

Reply to
Aklark

Sì, intendevo una resistenza di pull-up. Serve perchè quel pin è di tipo open-drain... il fatto che sia open-drain c'è scritto sul datasheet. La resistenza dipende da quanta corrente richiede il carico che ci colleghi. Ovviamente non disponi di tutta la corrente che vuoi... mi pare che al max il pic possa dare 25mA per pin (cmq sul datasheet lo dice). Quindi per accendere un led va bene una R da 470 ohm o anche qualcosa in +

I pin di INGRESSO che non usi li colleghi a gnd... ok Attenzione però a non impostarli per errore come output via software altrimenti rischi di compromettere il pic! Secondo me la cosa + semplice è impostere come out i pin non utilizzati e lasciarli liberi

Nel loop puoi fare tutte le operazioni che vuoi ma queste richiedono tempo e quindi il pin dove è collegato il pulsante viene controllato meno frequentemente. Chiaramente aumentando la frequenza di lavoro del pic aumentano le prestazioni. Ma ogni pic ha un limite. Il 16f84a esiste in versione -04 (max 4MHz) e -20 (max -20MHz) Guarda la sigla stampigliata sul chip e ricordati che non è opportuno spingersi più in là. I due condensatori servono per fare oscillare il quarzo... i valori di solito vanno da 15pf a 47pf Ad ogni modo con quarzo fino a 4mhz l'impostazione deve essere XT, con quarzi maggiori HS

Per evitare il treno di impulsi esistono tanti sistemi. Un anti-rimbalzo esterno oppure via sw. Via sw il modo più semplice è (appena rilevata la pressione) spegnere il led ed introdurre un'attesa (delay) di circa 100 di ms, in modo che il treno di impulsi si esaurisca. Altri sistemi + eleganti prevedono l'uso del timer0, in modo che il pic possa continuare il suo lavoro mentre "aspetta" che il treno di iimpulsi si esaurisca

Ciao!

Reply to
Ice

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.