Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC 12f629

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] PIC 12f629

Messaggioda Foto Utentewsocrates » 28 mag 2010, 9:56

ciao a tutti. sono nuovo di questo forum e faccio i complimenti a tutti coloro che contribuiscono per renderlo così interessante!
volevo un aiuto, se possibile, per ultimare/correggere un programmino per il PIC 12f629. premetto che o iniziato da poco ad utilizzare i microcontrollori e quindi mi mancano le basi idonee. tanto per capirci per realizzare alcuni progetti sono partito da programmi trovati in rete e modificati secondo le mie esigenze e un po' per lo studio, un po' (molti!) per tentativi sono arrivato alla soluzione. ma ora sono veramente incapace di andare avanti! vi spiego cio' che vorrei fare:
utilizzando il 12f629, vorrei utilizzare tre pin per collegare 3 pulsanti e i restati 3 pin come uscite collegate rispettivamente ai pulsanti. i due pin non citati sono + e -. alla pressione del pulsante un led collegato al pin deve accendersi/lampeggiare e con la seconda pressione spegnersi. il programma seguente è riferito ad un solo pulsante e ad un solo led. per il momento alla pressione del pulsante si accende ma non si spegne piu'!
Codice: Seleziona tutto
   INCLUDE   <P12F629.INC>
   errorlevel   -302
   __CONFIG   _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
CONTA   EQU   20H         

   org   0
   goto   inizio
   org   4

Interrupts
   decf   CONTA,F      
   bcf   INTCON,T0IF   
   retfie            

inizio
   bsf   STATUS,RP0      
   movlw    b'11100000'   
   movwf    TRISIO       
   movwf   WPU                        
   movlw   B'00000111'   
   movwf   OPTION_REG   
   bcf   STATUS,RP0
   bsf   INTCON,T0IE   
   bsf   INTCON,GIE   
   clrf    GPIO       
   movlw    07h       
   movwf    CMCON       

sw1
   
   btfss   GPIO,5
   goto   antirimbalzo
   goto   sw1

antirimbalzo
   
   btfss   GPIO,5
   goto   antirimbalzo
   goto   lamp
   
lamp
      
   bsf   GPIO,2
   call   ritardo
   bcf   GPIO,2
   call   ritardo
   bsf   GPIO,2
   call   ritardo
   bcf   GPIO,2
   call   ritardo
   call   ritardo
   call   ritardo
   goto   lamp
   
   
ritardo
   movlw   03h      
   movwf   CONTA   
      
loop
   movf   CONTA,0      
   btfss   STATUS,2   
   goto   loop
   return

   end


AIUTO!!!!!

---------------------------------

Edit Paolino: usa i tag [code][/code] per includere il codice, come ho fatto io.
Avatar utente
Foto Utentewsocrates
0 2
 
Messaggi: 9
Iscritto il: 28 mag 2010, 9:18

0
voti

[2] Re: PIC 12f629

Messaggioda Foto UtentePaolino » 28 mag 2010, 10:25

wsocrates ha scritto:ciao a tutti. sono nuovo di questo forum e faccio i complimenti a tutti coloro che contribuiscono per renderlo così interessante!

Benvenuto, wsocrates!
wsocrates ha scritto:vi spiego cio' che vorrei fare:utilizzando il 12f629, vorrei utilizzare tre pin per collegare 3 pulsanti e i restati 3 pin come uscite collegate rispettivamente ai pulsanti.

Presumo sia un refuso e volessi dire LED, giusto?

Qualche consiglio. Il tuo codice presenta alcuni errori non di sintassi ma di logica di funzionamento. Per provare a correggerli, ti consiglio di provare a stendere un flow-chart che riporti il ciclo che il programma deve eseguire. In questo modo vedrai che le cose ti si chiariscono un po'.
Il tuo programma non potrà mai spegnere il LED che lampeggia a causa di questa parte di codice:
Codice: Seleziona tutto
lamp
     
   bsf   GPIO,2
   call   ritardo
   bcf   GPIO,2
   call   ritardo
   bsf   GPIO,2
   call   ritardo
   bcf   GPIO,2
   call   ritardo
   call   ritardo
   call   ritardo
   goto   lamp


Il programma continua a ciclare qui all'interno e non ne uscirà più. Qui infatti manca la gestione dell'evento "pulsante premuto per arrestare il lampeggio". Una soluzione pulita prevede l'uso degli interrupt, cosa che mi sembra sia fattibile con l'Interrupt On Change (IOC) dei PIC. Dai un'occhiata al datasheet, nel paragrafo che parla di Interrupt On Change e cerca di capire di cosa si tratta.

Allega anche uno schema che mostri dove hai connesso i pulsanti e dove i LED.

Ciao.

Paolo.

Edit: ho spostato questo thread nella sezione Nozioni Generali dei PICMicro.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[3] Re: PIC 12f629

Messaggioda Foto Utentewsocrates » 29 mag 2010, 11:22

ecco qui lo schema con i collegamenti...
Allegati
12f629.PNG
12f629.PNG (20.73 KiB) Osservato 3395 volte
Avatar utente
Foto Utentewsocrates
0 2
 
Messaggi: 9
Iscritto il: 28 mag 2010, 9:18

0
voti

[4] Re: PIC 12f629

Messaggioda Foto Utentewsocrates » 29 mag 2010, 17:20

per ora sono giunto a questo:
Codice: Seleziona tutto
INCLUDE <P12F629.INC>
;errorlevel -302
__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
CONTA EQU 20H

dx EQU 21H ; Switch per pulsante premuto

org 0
goto inizio
org 4

Interrupts
decf CONTA,F
bcf INTCON,T0IF
retfie

inizio
bsf STATUS,RP0
movlw b'11100000'
movwf TRISIO
movwf WPU
movlw B'00000111'
movwf OPTION_REG
bcf STATUS,RP0
bsf INTCON,T0IE
bsf INTCON,GIE
clrf GPIO
movlw 07h
movwf CMCON

sw1

btfss GPIO,5
goto antirimbalzo
goto sw1


antirimbalzo

btfss GPIO,5
goto antirimbalzo
goto lamp

lamp

clrf dx ; Azzera lo switch
bsf GPIO,2
call ritardo
bcf GPIO,2
call ritardo
bsf GPIO,2
call ritardo
bcf GPIO,2
call ritardo
call ritardo
call ritardo
movf dx,0 ; testa lo switch
btfss STATUS,2 ; é zero?
goto sw1
bsf GPIO,2
call ritardo
bcf GPIO,2
call ritardo
bsf GPIO,2
call ritardo
bcf GPIO,2
call ritardo
call ritardo
call ritardo
movf dx,0 ; testa lo switch
btfss STATUS,2 ; é zero?
goto sw1
goto lamp


ritardo
movlw 03h
movwf CONTA

loop
movf CONTA,0
btfss STATUS,2
goto loop

btfsc GPIO,5
goto fineloop
; Se il bottone è premuto accendo lo switch
movlw 1
movwf dx

fineloop
return

end


Edit Paolino: usa i tag [code][/code] per racchiudere il codice!

con questo programma si accende e si spegne come dovrebbe. vorrei ripetere l'operazione anche con i restanti due pulsanti. ho provato svariate volte variando/aggiungendo GPIO4/GPIO0 e GPIO3/GPIO1 ma niente da fare.... il PIC esegue solo cio' che riguarda GPIO5/GPIO2...
Avatar utente
Foto Utentewsocrates
0 2
 
Messaggi: 9
Iscritto il: 28 mag 2010, 9:18

0
voti

[5] Re: PIC 12f629

Messaggioda Foto UtentePaolino » 1 giu 2010, 8:56

Oggi provo a dare un'occhiata al tuo codice.
Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[6] Re: PIC 12f629

Messaggioda Foto Utentedavidde » 1 giu 2010, 9:10

Credo ti convenga anche aggiungere una resistenza da 560ohm in serie ai led...
Avatar utente
Foto Utentedavidde
13,3k 4 9 12
G.Master EY
G.Master EY
 
Messaggi: 4026
Iscritto il: 2 ago 2007, 11:40
Località: Bologna

0
voti

[7] Re: PIC 12f629

Messaggioda Foto Utentewsocrates » 2 giu 2010, 22:50

Questo è il programma che sono riuscito a fare:

Codice: Seleziona tutto
INCLUDE   <P12F629.INC>
   ;errorlevel   -302
   __CONFIG _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
CONTA   EQU   20H         

; Switch per pulsante premuto
dx EQU 21H
sx EQU 22H   
   org   0
   goto   inizio
   org   4

Interrupts
   decf   CONTA,F      
   bcf   INTCON,T0IF   
   retfie            

inizio
   bsf   STATUS,RP0      
   movlw    b'11110000'   
   movwf    TRISIO       
   movwf   WPU                        
   movlw   B'00000111'   
   movwf   OPTION_REG   
   bcf   STATUS,RP0
   bsf   INTCON,T0IE   
   bsf   INTCON,GIE   
   clrf    GPIO       
   movlw    07h       
   movwf    CMCON       

sw1
   
   btfss   GPIO,5
   goto   antirimbalzo1
   goto   sw2



antirimbalzo1
   
   btfss   GPIO,5
   goto   antirimbalzo1
   goto   lamp1


sw2
   
   btfss   GPIO,4
   goto   antirimbalzo2
   goto   sw1




antirimbalzo2
   
   btfss   GPIO,4
   goto   antirimbalzo2
   goto   lamp2




   
lamp1
      
   clrf    dx ; Azzera lo switch
   bsf   GPIO,0
   bsf   GPIO,2
   call   ritardo1
   movf    dx,0 ; testa lo switch
   btfss   STATUS,2  ; é zero?
   goto    sw1
   bcf   GPIO,0
   bcf   GPIO,2
   call   ritardo1
   movf    dx,0 ; testa lo switch
   btfss   STATUS,2  ; é zero?
   goto    sw1
   bsf   GPIO,0
   bsf   GPIO,2
   call   ritardo1
   movf    dx,0 ; testa lo switch
   btfss   STATUS,2  ; é zero?
   goto    sw1
   bcf   GPIO,0
   bcf   GPIO,2
   call   ritardo1
   call   ritardo1
   call   ritardo1
   movf    dx,0 ; testa lo switch
   btfss   STATUS,2  ; é zero?
   goto    sw1
   bsf   GPIO,0
   bsf   GPIO,2
   call   ritardo1
   movf    dx,0 ; testa lo switch
   btfss   STATUS,2  ; é zero?
   goto    sw1
   bcf   GPIO,0
   bcf   GPIO,2
   call   ritardo1
   movf    dx,0 ; testa lo switch
   btfss   STATUS,2  ; é zero?
   goto    sw1
   bsf   GPIO,0
   bsf   GPIO,2
   call   ritardo1
   movf    dx,0 ; testa lo switch
   btfss   STATUS,2  ; é zero?
   goto    sw1
   bcf   GPIO,0
   bcf   GPIO,2
   call   ritardo1
   call   ritardo1
   call   ritardo1
   movf    dx,0 ; testa lo switch
   btfss   STATUS,2  ; é zero?
   goto    sw1
     goto    lamp1

lamp2
      
   clrf    sx ; Azzera lo switch
   bsf   GPIO,1
   bsf   GPIO,2
   call   ritardo2
   movf    sx,0 ; testa lo switch
     btfss   STATUS,2  ; é zero?
     goto    sw1
   bcf   GPIO,1
   bcf   GPIO,2
   call   ritardo2
   movf    sx,0 ; testa lo switch
     btfss   STATUS,2  ; é zero?
     goto    sw1
   bsf   GPIO,1
   bsf   GPIO,2
   call   ritardo2
   movf    sx,0 ; testa lo switch
     btfss   STATUS,2  ; é zero?
     goto    sw1
   bcf   GPIO,1
   bcf   GPIO,2
   call   ritardo2
   call   ritardo2
   call   ritardo2
   movf    sx,0 ; testa lo switch
     btfss   STATUS,2  ; é zero?
     goto    sw1
   bsf   GPIO,1
   bsf   GPIO,2
   call   ritardo2
   movf    sx,0 ; testa lo switch
     btfss   STATUS,2  ; é zero?
     goto    sw1
   bcf   GPIO,1
   bcf   GPIO,2
   call   ritardo2
   movf    sx,0 ; testa lo switch
     btfss   STATUS,2  ; é zero?
     goto    sw1
   bsf   GPIO,1
   bsf   GPIO,2
   call   ritardo2
   movf    sx,0 ; testa lo switch
     btfss   STATUS,2  ; é zero?
     goto    sw1
   bcf   GPIO,1
   bcf   GPIO,2
   call   ritardo2
   call   ritardo2
   call   ritardo2
   movf    sx,0 ; testa lo switch
     btfss   STATUS,2  ; é zero?
     goto    sw1
     goto    lamp2


   
ritardo1
   movlw   03h      
   movwf   CONTA   
      
loop1
     movf    CONTA,0
     btfss    STATUS,2
     goto    loop1

     btfsc    GPIO,5
     goto    fineloop1
                ; Se il bottone è premuto accendo lo switch
     movlw    1
     movwf    dx
fineloop1
  return

   
ritardo2
   movlw   03h      
   movwf   CONTA

loop2
     movf    CONTA,0
     btfss    STATUS,2
     goto    loop2

     btfsc    GPIO,4
     goto    fineloop2
                 ; Se il bottone è premuto accendo lo switch
     movlw    1
     movwf    sx

fineloop2
  return

   end



è funzionante ma ho un problema...è possibile rendere meno sensibili le 2 porte dove dovrò collegare i pulsanti? (è sufficiente toccarle con le dita per iniziare il lampeggio)
Grazie a tutti...
Avatar utente
Foto Utentewsocrates
0 2
 
Messaggi: 9
Iscritto il: 28 mag 2010, 9:18

0
voti

[8] Re: PIC 12f629

Messaggioda Foto Utentewsocrates » 3 giu 2010, 1:02

ho rivisto il progetto, non sono piu' 3 pulsanti ma solo 2. in quanto il terzo collegato su mclr mi dava problemi.... ho risolto il problema per quanto riguarda la sensibilità dei pulsanti. ho sostituito le 2 resistenze di pull-up (credo si chiamino cosi'....!) con 2 piu' piccole. ora è quasi perfetto, l'ho anche costruito su una millefori. l'unico difetto sta che non sempre si spegne il lampeggio alla seconda pressione del tasto. non è preciso. che cosa posso fare?
Avatar utente
Foto Utentewsocrates
0 2
 
Messaggi: 9
Iscritto il: 28 mag 2010, 9:18

0
voti

[9] Re: PIC 12f629

Messaggioda Foto UtentePaolino » 3 giu 2010, 9:47

Ciao wsocrates.
Secondo me il problema sta nell'antirimbalzo. Personalmente avrei strutturato il programma in modo diverso, facendo ampio uso degli interrupt, tanto l'interrupt-on-change quanto su overflow dei timer. Un timer lo avrei usato per l'antirimbalzo e l'altro per il lampeggio dei LED.
Hai provato a dare un'occhiata a questo articolo che parla di antirimbalzo?

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[10] Re: PIC 12f629

Messaggioda Foto Utentewsocrates » 4 giu 2010, 9:26

ciao, riesci a postare una bozza del programma tanto per farmi un'idea? cosi' a parole non è che ci capisco poi molto...! grazie...
Avatar utente
Foto Utentewsocrates
0 2
 
Messaggi: 9
Iscritto il: 28 mag 2010, 9:18

Prossimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti