Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ingresso di conteggio con PIC16F84

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Ingresso di conteggio con PIC16F84

Messaggioda Foto Utentemaxtronic » 19 giu 2013, 13:09

Salve a tutti , sto realizzando un circuitino che utilizzando tre porte di ingresso del PIC .
in due porte in particolare devo contare gli inpulsi.
su queste due porte chi prima arriva a 6 deve creare un altro evento ed azzerare il tutto .
fatto tutto sembrerebbe che funzioni ma , a volte accade che il tutto si fermi a 4 oppure 5 .
credo di aver fatto qualche errore sul codice ..lo posto qui sperando di venirene a capo
grazie infinite

main:
dim k as byte
dim j as byte
trisa=%00000
trisb=%11111111
porta=0
portb=1

inizio:


porta=0
portb=1
delay_ms(100)

if portb.1=0 then
porta.3=1
gosub sigla
goto primo
end if
goto inizio
primo:
delay_ms(100)
if portb.2=0 then
gosub uno
j=j+1
end if
delay_ms(100)
if portb.3=0 then
gosub due
k=k+1
end if
if k = 6 then
goto fine
end if
if j = 6 then
goto fine
end if
goto primo

sigla:
delay_ms(3000)
porta.0=1
delay_ms(150)
porta.0=0
return
uno:
delay_ms(100)
porta.1=1
delay_ms(150)
porta.1=0
return
due:
delay_ms(100)
porta.1=1
delay_ms(150)
porta.1=0
return

fine:
delay_ms(8000)
porta.2=1
delay_ms(150)
porta.2=0
delay_ms(30000)
porta.3=0
k=0
j=0
goto inizio

end.
Avatar utente
Foto Utentemaxtronic
0 4
 
Messaggi: 22
Iscritto il: 30 gen 2013, 0:43

0
voti

[2] Re: CONTEGGIO INGRESSO CON 16F84

Messaggioda Foto UtenteDryden » 19 giu 2013, 15:56

Quando ci regaleranno la sfera di cristallo potremo aiutarti.

l'unica cosa che IO ho capito, è che utilizzi mikrobasic.

Per il resto non si capisce niente.

Specifica il compilatore e la versione, sistema il codice e commentalo in modo che sia leggibile e spiega meglio cosa devi fare altrimenti,fidati, non ti aiuterà mai nessuno perché nessuno ti capisce....
Avatar utente
Foto UtenteDryden
20 4
New entry
New entry
 
Messaggi: 97
Iscritto il: 1 gen 2011, 14:37
Località: Bolzano

0
voti

[3] Re: Ingresso di conteggio con PIC16F84

Messaggioda Foto Utentemaxtronic » 21 giu 2013, 16:37

Salve a tutti , qui sotto troverete il codice con le descrizioni .
Mi scuso per essere stato poco chiaro :-( .
il tutto adesso sembra funzionare bene ...
mi chiedevo se fosse possibile implementare un interrupt nel caso in cui rb0 cambiasse di livello
per azzerare le porte di uscita Ra0 , Ra1 ed Ra2 nell'esecuzione del programma .
grazie anticipate
Potrei tranquillamemte cambiare il circuito invertendo le porte a con b .

Codice: Seleziona tutto
program suoni
main:
   dim k as byte ' definisco le variabili
   dim j as byte
   trisa=%00000     ' setto le porte a come out
   trisb=%11111111   ' porte b come in

   inizio:
    k=0    ' azzero le variabili
    j=0

   porta=0   ' azzero le porte di uscita
   portb=1   ' metto alte le porte di ingresso perché lavorano in gnd

   if portb.1=0 then  ' se la porta rb1 diventa alta
   porta.3=1          ' accendo il circuito musicale
   gosub sigla        ' richiamo una sigla iniziale
       goto primo
       end if
    goto inizio
    primo:
    delay_ms(100)     ' anti rimbalzo
   if portb.2=0 then    ' se rb2 diventa alta
       gosub uno        ' richiamo unn'altra musica
       j=j+1            'aumento il contatore di uno
      end if
     delay_ms(100)
   if portb.3=0 then     'uguale per la porta rb3 come sopra
       gosub uno
       k=k+1
      end if
     if k = 6  then         ' se premuto rb2  6 volte va alla sigla finale
       goto fine
        end if
        if j = 6  then      ' se premuto rb3  6 volte va alla sigla finale
           goto fine
           end if
    goto primo
 
  sigla:
     delay_ms(3000)
     porta.0=1         ' impulso al modulo vocale
      delay_ms(42000)
      porta.0=0
      return
  uno:
    delay_ms(100)
    porta.1=1           ' impulso al modulo vocale
    delay_ms(8000)
    porta.1=0
    return

 
  fine:
   delay_ms(8000)
   porta.2=1
   delay_ms(30000)        ' impulso al modulo vocale
   porta.2=0
   delay_ms(2000)
   porta.3=0

   goto main           ' torna all'inizio

  end.
 
 
Avatar utente
Foto Utentemaxtronic
0 4
 
Messaggi: 22
Iscritto il: 30 gen 2013, 0:43

1
voti

[4] Re: Ingresso di conteggio con PIC16F84

Messaggioda Foto Utenterusty » 21 giu 2013, 17:38

maxtronic ha scritto:mi chiedevo se fosse possibile implementare un interrupt nel caso in cui rb0 cambiasse di livello per azzerare le porte di uscita Ra0 , Ra1 ed Ra2 nell'esecuzione del programma


Si', devi decidere se generare l'interrupt nei fronti di salita (0->5V) o di discesa (5->0V) tramite il bit INTEDG nell'OPTION register.
Abiliti gli interrupt globalmente settando GIE e abiliti l'interrupt sulla porta RB0 settando RBIE nel registro INTCON.
Il bit INTF sempre all'interno del registro INTCON ti dira' se è stato generato o meno l'interrupt su RB0, verificandone il suo stato.
Non hai detto che compilatore usi, comunque dovresti predisporre la routine di gestione dell'interrupt in 0x0004 (org, qualcosa), di modo che quando l'interrupt è generato (nel tuo caso è la variazione di RB0) fai quello che devi fare, poi azzeri manualmente il flag INTF di INTCON, e dai un reti (return from interrupt).

Se non dici che compilatore usi non posso dirti di piu'.

Per fare le cose a regola d'arte, in realta', la routine dovrebbe:
1) Disabilitare momentaneamente gli interrupt generali (di modo da evitare di essere interrotti all'interno di un'interruzione... molto cattiva)
2) Salvare il contenuto dei registri STATUS e accumulatore
3) Verificare chi ha sollevato l'interrupt (se in timer0, l'adc, rb0, ecc...)
4) Gestire i vari interrrupt in base a quello che è stato chiamato
5) Ricaricare il contenuto dei registri
6) Azzerare il flag di interrupt che abbiamo servito (non sempre, a volte viene fatto in automatico in certi microcontrollori)
7) Riabilitare gli interrupt generali
8) reti, return from interrupt.

Ti consiglio di leggere qui, a pagina 9 e 10:
http://ww1.microchip.com/downloads/en/d ... 35007b.pdf
Avatar utente
Foto Utenterusty
4.075 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

0
voti

[5] Re: Ingresso di conteggio con PIC16F84

Messaggioda Foto Utentemaxtronic » 21 giu 2013, 22:18

uso il mikrobasic versione 2.0.0.4
Avatar utente
Foto Utentemaxtronic
0 4
 
Messaggi: 22
Iscritto il: 30 gen 2013, 0:43

1
voti

[6] Re: Ingresso di conteggio con PIC16F84

Messaggioda Foto Utenterusty » 21 giu 2013, 23:52

Leggendo qui a pagina 117 mi pare di capire che dovresti scrivere la funzione di gestione dell'interrupt cosi':

Codice: Seleziona tutto
sub procedure interrupt
    INTCON.GIE = 0    'disabilito gli interrupt generali
    if TestBit(INTCON, INTF) = 1 then
        '
        ' istruzioni da eseguire
        '
    end if
    INTCON.INTF=0      'riazzero il flag di interrupt
    INTCON.GIE = 1     'riabilito gli interrupt generali
end sub


Avendo attivato all'inizio del programma i bit nei registri appositi:

Codice: Seleziona tutto
OPTION.INTEDG = 1       'genera interrupt nei fronti di salita
INTCON.GIE = 1          'abilita gli interrupt generali
INTCON.RBIE = 1         'abilita l'interrupt esterno su RB0 


Fammi sapere se ci sei riuscito O_/
Avatar utente
Foto Utenterusty
4.075 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

0
voti

[7] Re: Ingresso di conteggio con PIC16F84

Messaggioda Foto Utentemaxtronic » 22 giu 2013, 12:01

Niente , non avvuene nessuna interruzione del programma . poi il compilatore sul comando OPTION da un errore e dice " identifier 'OPTION' was not declared "
ma sicuro che se il chip mentre esegue un conteggio dicirca 30 secondi possa anche controllare un interrupt per fermare il tutto ?
Avatar utente
Foto Utentemaxtronic
0 4
 
Messaggi: 22
Iscritto il: 30 gen 2013, 0:43

0
voti

[8] Re: Ingresso di conteggio con PIC16F84

Messaggioda Foto Utenterusty » 22 giu 2013, 14:04

maxtronic ha scritto:Niente , non avvuene nessuna interruzione del programma . poi il compilatore sul comando OPTION da un errore e dice " identifier 'OPTION' was not declared "


Dovresti farmi vedere il sorgente, inoltre l'interruzione come la fai? Schema fidocad.

maxtronic ha scritto:ma sicuro che se il chip mentre esegue un conteggio dicirca 30 secondi possa anche controllare un interrupt per fermare il tutto ?


Non so, dipende da come lo trovi... se quel giorno è un po' giu' di morale potrebbe anche non farcela :!:

Mi sa che sto parlando a vuoto: non ti leggi i manuali, devo andare a leggerli io per te, non dici come fai l'interruzione, non sai nemmeno come funziona un interrupt, non ti muovi nemmeno a cercare una soluzione; io ti ho aiutato e ti aiuto, ma pure te datti una mossa.

maxtronic ha scritto:ma sicuro che se il chip mentre esegue ... possa anche controllare un interrupt per fermare il tutto ?


Se non sai cos'è un interrupt è difficile che riesca ad utilizzarlo, e quello che ti ho detto nei post precedenti è perfettamente inutile, come parlare in gaelico ad un giapponese.
Avatar utente
Foto Utenterusty
4.075 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

0
voti

[9] Re: Ingresso di conteggio con PIC16F84

Messaggioda Foto Utentemaxtronic » 22 giu 2013, 14:14

Sicuramente sei più bravo di me . È mi dispiace se ho dato fastidio . Saluti
Avatar utente
Foto Utentemaxtronic
0 4
 
Messaggi: 22
Iscritto il: 30 gen 2013, 0:43

0
voti

[10] Re: Ingresso di conteggio con PIC16F84

Messaggioda Foto Utenterusty » 22 giu 2013, 14:17

È dispiace piu' a me che non hai voglia di aiutarmi a risolverti i problemi. O_/

Se, invece di dire stupidaggini del tipo "sei piu' bravo di me" (ma de che!?), posti il codice e mi dici come stai facendo l'interruzione, magari potresti pure sforzarti di capire come funzionano, se è troppo difficile o ci vuole troppo tempo lasciamo perdere.
Avatar utente
Foto Utenterusty
4.075 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti