Vai Indietro   PcTuner Forum > Sezione Hardware > Programmazione PIC
Arcade Registrazione Blogs Regolamento Feedback FAQ Lista Utenti Calendario Segna come Letti

Ultimi 5 blog pubblicati su PcTuner Blog
Data Titolo

Rispondi
 
Strumenti Discussione Modalità Visualizzazione
Vecchio 21-02-2006, 18.24.59   #1
Registered User
 

Iscritto da: 21-02-2006
Messaggi: 6
Feedback: (0)
fari luminosi

Da poco ho iniziato a studiare i pic, ho fatto qualche piccolo programmino, un amico mi a proposto questo........ semplice quesito che sinceramente, sono più di 15 dì che mi dedico ma senza risultati. Chiedendo in giro mi hanno detto di non usare nessun contatore ma di incrementare una costante........di fatto non funzione. C'è qualche esperto che può aiutarmi. Vorrei utilizzare 2 pic 16f84 (perchè disponibili). Vorrei saper cortesemente se è realizzabile tenendo conto delle specifiche sotto riportate. GRAZIE ANTICIPATAMENTE.

Il concetto è di riprodurre dei fari luminosi da installare su una carta nautica per simulare la situazione reale (ogni faro ha delle frequenze e dei colori diversi dall’altro per essere facilmente riconoscibile) tutti i fari funzionano in contemporanea, quindi non servono pulsanti di accensione e spegnimento differenziati ma un unico interruttore o meglio è sufficiente la spina inserita o meno.
Faro1
Singolo spegnimento su luce bianca, periodo (luce accesa + buio) 5 secondi

Faro 2
Singolo spegnimento su luce bianca, periodo (luce accesa + buio) 5 secondi

Faro 3
3 flash continui di luce bianca e spegnimento, periodo (3 flash + buio) 10 secondi

faro 4
singoli flash un settore di luce rossa, un settore di luce bianca e un settore di luce verde, il periodo (un flash + buio) è di 10 secondi

faro 5
2 flash, un settore di luce rossa e un settore di luce bianca, il periodo (2flash + buio) è di 6 secondi

faro 6
2 flash di luce rossa, il periodo (2flash + buio) è di 6 secondi

faro 7
singoli flash di luce bianca, il periodo (un flash + buio) è di 5 secondi

faro 8
6 flash + un flash lungo (2 secondi) di luce bianca , il periodo (6flash + flash lungo + buio) è di 15 secondi

faro 9
Flash continui di luce rossa

Faro 10
singoli flash di luce verde, il periodo (un flash + buio) è di 3 secondi

faro 11
singoli flash di luce verde, il periodo (un flash + buio) è di 3 secondi

faro 12
Flash continui di luce bianca

totale15 led di cui 3 verdi 4 rossi 8 bianchi
peppeMOZA Non in Linea   Rispondi Citando
Vecchio 21-02-2006, 18.46.49   #2
B&M Coasterman
 
L'avatar di  Matro
 

Iscritto da: 06-12-2003
Locazione: Padova
Messaggi: 8,294
Feedback: (0)
Benvenuto!

Per agevolarti il lavoro devi fare uno schema del genere (questo è quello che ho fatto io per la centralina del presepe) :



Poi scrivi il codice, "scandendo" lo schema da sinistra a destra, accendendo/spegnendo i fari e applicando i delay necessari sino ad arrivare alla fine. Poi il ciclo si ripete..
__________________
Matro Non in Linea   Rispondi Citando
Vecchio 21-02-2006, 19.07.13   #3
Registered User
 

Iscritto da: 21-02-2006
Messaggi: 6
Feedback: (0)
Fari Luminosi

Grazie Per L'aiuto
Il Diagramma Delle Varie Accensioni Sono Riuscito A Farlo, Il Mio Problema è Come Faccio A Far Lampeggiare Un Led Per Tre Lampeggi E Spegnerlo Per 7 Sec, Il Succesivo Lampeggia Per 2 Volte E Si Spegne Dopo 4 Sec Ecc....
peppeMOZA Non in Linea   Rispondi Citando
Vecchio 21-02-2006, 19.12.29   #4
Registered User
 

Iscritto da: 21-02-2006
Messaggi: 6
Feedback: (0)
Fari Luminosi

QUESTO PROG è UNA BASE DI PARTENZA SULLA QUALE FACCIO PROVE PER ARRIVARE AL PROG DEFINITIVO. VOGLIO UTILIZZARE DUE PIC PER FAR SVOLGERE LìINTERO CICLO SOPRA DESCRITTO

PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
ERRORLEVEL -302
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
LED1 EQU 0
LED2 EQU 1
LED3 EQU 2
LED4 EQU 3
LED5 EQU 4
LED6 EQU 5
LED7 EQU 6
LED8 EQU 7
ORG 0CH
Count RES 2
;Reset Vector
;Start point at CPU reset
ORG 00H
bsf STATUS,RP0
movlw 00011111B
movwf TRISA
movlw 00000000B
movwf TRISB
bcf STATUS,RP0
bsf PORTB,LED1
bsf PORTB,LED2
bsf PORTB,LED3
bsf PORTB,LED4
bsf PORTB,LED5
bsf PORTB,LED6
bsf PORTB,LED7
bsf PORTB,LED8
MainLoop
call Delay
btfsc PORTB,LED1
btfsc PORTB,LED2
btfsc PORTB,LED3
btfsc PORTB,LED4
btfsc PORTB,LED5
btfsc PORTB,LED6
btfsc PORTB,LED7
btfsc PORTB,LED8
goto SetToZero
bsf PORTB,LED1
bsf PORTB,LED2
bsf PORTB,LED3
bsf PORTB,LED4
bsf PORTB,LED5
bsf PORTB,LED6
bsf PORTB,LED7
bsf PORTB,LED8
goto MainLoop
SetToZero
bcf PORTB,LED1
bcf PORTB,LED2
bcf PORTB,LED3
bcf PORTB,LED4
bcf PORTB,LED5
bcf PORTB,LED6
bcf PORTB,LED7
bcf PORTB,LED8
goto MainLoop
;Subroutines
;Software delay
Delay
clrf Count
clrf Count+3
DelayLoop
decfsz Count,3
goto DelayLoop
decfsz Count+3,3
goto DelayLoop
return
END
peppeMOZA Non in Linea   Rispondi Citando
Vecchio 22-02-2006, 07.38.57   #5
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
Ciao Peppe, benvenuto su PcTuner

Nel tuo post precedente dici di aver fatto il diagramma temporale, ma di non capire come fare per ottenere i lampeggi. Ho notato che anche nel post iniziale hai omesso l'informazione dei timings di ciascun lampeggio.
Per realizzare quanto chiedi devi innanzitutto costruirti il diagramma temporale completo.
Cioè sulla base tempi non devi riportare l'evento "lampeggio" ma solo gli eventi "accensione" e "spegnimento".
Quindi se un led deve lampeggiare 3 volte (faccio un esempio) e poi rimanere spento per 5 secondi, devi diagrammare anche le durate dei tre lampeggi e delle "pause" fra una accensione e l'altra.
Quando avrai in parallelo tutti gli eventi potrai capire quale sia la distanza minima fra due eventi successivi, per esempio l'accensione del led 1 e lo spegnimento del led 5....
Tale intervallo minimo sarà la tua unità temporale.
A quel punto dovrai realizzare un ciclo di ritardo pari a tale intervallo e, dopo ogni ciclo di ritardo, andare a riproporre sulle porte lo stato attuale di accensione e spegnimento di ogni led.
Una maniera abbastanza semplice per realizzare tutto ciò, se l'unità temporale fosse sufficientemente piccola, è tarare il timer interrupt e, ogni volta che si verifica l'interrupt, andare a leggere in una read table i valori corrispondenti.
Altrimenti potresti creare un clock esterno della durata desiderata.
O, infine, creare una routine di ritardo software, come nell'esempio che hai postato.
Ovviamente la soluzione ad interrupt è da preferirsi qualora il tuo pic debba svolgere anche altre funzioni oltre quella di pilotaggio dei led.

Saluti
FluidGuitar
__________________

Tu non sai niente, Jon Snow!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 22-02-2006, 13.27.07   #6
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
Dal listato che ho visto direi che l'approccio è sbagliato.
I delay dimenticateli, il sistema proposto da Matro è ferraginoso e per niente flessibile; se devi cambiare un tempo ti va put... tutto.
A mio parere per queste cose qui (comunque in ogni mio progetto c'è sempre qualcosa di temporizzato) la miglior cosa da fare è avere, quello che io chiamo, tick di sistema. E' una particella di tempo di durata umana da usarsi per gestire dei temporizzatori a scadenza ed anche per altri usi. Generalmente uso 50ms per avere la possibilità di temporizzare fino ad una dozzina di secondi. Nel tuo caso dovendo arrivare fino a 15s potresti utilizzare 66ms. Una breve imprecisione temporale non sarà certo un problema.
Il tick di sistema lo puoi gestire sia con che senza interrupt a tua scelta.
Naturalmente per ogni evento devi avere un temporizzatore.
Divide et impera.
Comincia a far funzionare un'evento (il più semplice) per poi passare ai successivi.
Codice:
// Esempio di codice in C.
  if(--tmr_faroN==0){  // Quando passa per lo zero esegue.
    // Il tempo del faroN è scaduto faccio la sua gestione.
    tmr_faroN=TMR_FARON;  // Ricarico il temporizzatore.
    LEDFARON=1;  // Attivo l'uscita per il flash.
    // Eventuale breve delay. 
    LEDFARON=0;  // Disattivo l'uscita.
  }
__________________
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau.
Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein
Camillo Non in Linea   Rispondi Citando
Vecchio 22-02-2006, 13.34.53   #7
Super Moderator
 
L'avatar di  FluidGuitar
 

Iscritto da: 04-01-2001
Locazione: Torino
Messaggi: 4,023
Feedback: (0)
Quote:
Originariamente inviato da Camillo
Dal listato che ho visto direi che l'approccio è sbagliato.
I delay dimenticateli, il sistema proposto da Matro è ferraginoso e per niente flessibile; se devi cambiare un tempo ti va put... tutto.
A mio parere per queste cose qui (comunque in ogni mio progetto c'è sempre qualcosa di temporizzato) la miglior cosa da fare è avere, quello che io chiamo, tick di sistema. E' una particella di tempo di durata umana da usarsi per gestire dei temporizzatori a scadenza ed anche per altri usi. Generalmente uso 50ms per avere la possibilità di temporizzare fino ad una dozzina di secondi. Nel tuo caso dovendo arrivare fino a 15s potresti utilizzare 66ms. Una breve imprecisione temporale non sarà certo un problema.
Il tick di sistema lo puoi gestire sia con che senza interrupt a tua scelta.
Naturalmente per ogni evento devi avere un temporizzatore.
Divide et impera.
Comincia a far funzionare un'evento (il più semplice) per poi passare ai successivi.
Codice:
// Esempio di codice in C.
  if(--tmr_faroN==0){  // Quando passa per lo zero esegue.
    // Il tempo del faroN è scaduto faccio la sua gestione.
    tmr_faroN=TMR_FARON;  // Ricarico il temporizzatore.
    LEDFARON=1;  // Attivo l'uscita per il flash.
    // Eventuale breve delay. 
    LEDFARON=0;  // Disattivo l'uscita.
  }
E' una buona idea, ma non ho capito come fai a gestire in maniera contemporanea e asincrona tutti i led.
__________________

Tu non sai niente, Jon Snow!
FluidGuitar Non in Linea   Rispondi Citando
Vecchio 22-02-2006, 14.59.50   #8
Registered User
 
L'avatar di  Camillo
 

Iscritto da: 31-01-2006
Locazione: Genova
Messaggi: 967
Feedback: (0)
Quote:
Originariamente inviato da FluidGuitar
E' una buona idea, ma non ho capito come fai a gestire in maniera contemporanea e asincrona tutti i led.
In un progetto simile la contemporaneità dell'accensione dei LED non è determinante, millisecondo più millisecondo meno...
Se invece dovessi gestire la cosa contemporaneamente potrei fare così:
Non accenderei e spegnerei all'interno del passaggio per lo 0 del timer ma userei dei BIT corrispondenti ai LED per indicare l'uscita che deve cambiare di stato. Attento; non accendersi o spegnersi ma cambiare di stato, questo permette di lavorare con i LED messi all'alimentazione che si vuole, indifferentemente.
Codice:
#define LED5 5  // Bit dove è collegato il LED.
#define BITLED5 bsf xorved,LED5  // Macroistruzione per sostituzione se si lavorasse in asm.
  if(--tmr_faro5==0){  // Quando passa per lo zero esegue.
    // Il tempo del faro5 è scaduto faccio la sua gestione.
    tmr_faroN=TMR_FARO5;  // Ricarico il temporizzatore.
    xorved.LED5=1;  // Set del flag.
   }
/// Esauriti i vari temporizzatori si fa:
  // In xorved i BIT che sono H vengono invertiti.
  PORTLED ^= xorved;  // Accende e spegne fino ad 8 LED contemporaneamente.
  xorved=0;  // Azzera i BIT così non disturbano al giro dopo.
/// Naturalmente la cosa qui è semplificata al massimo perchè va gestito il flash e non in tutti ecc.
__________________
Camillo
Il VeroProgrammatore può contare fino a 1024 con le dita delle mani. Grazie a .mau.
Le donne e i gatti fanno quello che vogliono, gli uomini e i cani dovrebbero rilassarsi e abituarsi all'idea. R.A.Heinlein
Camillo Non in Linea   Rispondi Citando
Vecchio 23-02-2006, 19.30.36   #9
Registered User
 

Iscritto da: 21-02-2006
Messaggi: 6
Feedback: (0)
Fari Luminosi

GRAZIE CAMILLO PER I TUOI CONSIGLI

SMANETTANDO HO PROVATO HA SCRIVERE IL PROGRAMMA CON IL PICBASIC SEMBRA MOLTO PIù SEMPLICE. QUESTA è IL LISTATO PER LA GESTIONE DI UNA PARTE.
QUALCUNO POTREBBE DARMI QUALCHE SUGGERIMENTO.

Codice:
' programma leduno.bas
' accende e spegne un singolo led sulla porta B
 Device 16F628A		' scelta del PIC
 XTAL 4			' quarzo da 4 MHz
 TRISB=%00000000		' porta B tutti pin di uscita
 PORTB=0			' azzeramento porta B
 
 'dichiarazione delle variabili usate come contatore
 Dim c1 As Byte	
 Dim c2 As Byte	
 Dim c3 As Byte	

 'azzeramento iniziale contatori
c1=0
c2=0
c3=0

 ripeti:			' etichetta, inizio del programma
   
   If c1=0 Then
      PORTB.7=1
      PORTB.6=1
   EndIf
   
   If c1=1 Then
      PORTB.7=0
      PORTB.6=0
   EndIf   

   If c1=2 Then
      PORTB.7=1
      PORTB.6=1
   EndIf

   If c1=3 Then
      PORTB.7=0
      PORTB.6=0
   EndIf  
   
   c1=c1+1
   
   If c1=44 Then
      c1=0
   EndIf

   If c2=0 Then
     PORTB.5=1
     PORTB.4=1
     PORTB.3=1
     PORTB.2=1
   EndIf

   If c2=1 Then
     PORTB.5=0
     PORTB.4=0
     PORTB.3=0
     PORTB.2=0
   EndIf
   
   If c2=2 Then  
     PORTB.2=1
   EndIf 

   If c2=3 Then
     PORTB.2=0  
   EndIf  

   If c2=4 Then  
     PORTB.2=1
   EndIf 

   If c2=5 Then
     PORTB.2=0     
   EndIf     
   
   c2=c2+1  

   If c2=78 Then
      c2=0
   EndIf     
     
     
   DelayMS 125              





 GoTo ripeti		' si salta all’etichetta iniziale
[EDIT]
Ti ho editato il post per migliorarne la leggibilità , ti invito a fare lo stesso nei prossimi post.

Ultima Modifica di FluidGuitar : 25-02-2006 20.51.11.
peppeMOZA Non in Linea   Rispondi Citando
Vecchio 04-03-2006, 12.31.14   #10
Registered User
 

Iscritto da: 21-02-2006
Messaggi: 6
Feedback: (0)
GRAZIE FluidGuitar.

HO RISOLTO TUTTI I PROBLEMI DI PROGRAMMAZIONE E DI SETTAGGIO TEMPI
POSTERò SUCCESIVAMENTE IL LAVORO COMPLETO..
ADESSO HO UN ALTRO PROBLEMA NON RIESCO A PROGRAMMARE IL
PIC 16F84A VERGINE MENTRE NON HO NESSUN PROBLEMA CON 16F84 QUALCUNO PUò AIUTARMI!!!!
peppeMOZA Non in Linea   Rispondi Citando
Vecchio 04-03-2006, 15.33.00   #11
Guaranteed Entropy Mod
 
L'avatar di  GByTe
 

Iscritto da: 30-10-2003
Locazione: Milano
Messaggi: 20,570
Feedback: (3)
pssssss, scrivere in maiuscolo equivale a urlare, vuoi farci diventare sordi???
__________________
~ ~
~ Memento Audere Semper. ~ Ingegneria Italiana anni '80
~ La moderazione è una cosa fatale. Nulla ha più successo dell'eccesso. [Oscar Wilde]
~ È la realtà, spesso, ad essere inesatta. [Douglas Adams]
GByTe Non in Linea   Rispondi Citando
Vecchio 04-03-2006, 15.35.47   #12
B&M Coasterman
 
L'avatar di  Matro
 

Iscritto da: 06-12-2003
Locazione: Padova
Messaggi: 8,294
Feedback: (0)
Quote:
Originariamente inviato da peppeMOZA
NON RIESCO A PROGRAMMARE IL
PIC 16F84A VERGINE MENTRE NON HO NESSUN PROBLEMA CON 16F84
Do you speak italian?
__________________
Matro Non in Linea   Rispondi Citando
Rispondi Per le vostre immagini su questo forum potete usare PcTunerUp!
Iscriviti gratuitamente alla nostra newsletter.


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori)
 
Strumenti Discussione
Modalità Visualizzazione

Regole di scrittura
non Puoi inserire messaggi
non Puoi rispondere ai messaggi
non Puoi inviare allegati
non Puoi modificare i tuoi messaggi

codice vB è Attivo
Smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Disattivato
Pingbacks are Disattivato
Refbacks are Disattivato
Vai al Forum


Tutti gli Orari sono GMT +1. Attualmente sono le 08.49.12.


Powered by vBulletin Versione 3.6.12
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0