|
|
#1 |
|
Registered User
|
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 |
|
|
|
|
|
#2 |
|
B&M Coasterman
|
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.. |
|
|
|
|
|
#3 |
|
Registered User
|
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.... |
|
|
|
|
|
#4 |
|
Registered User
|
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 |
|
|
|
|
|
#5 |
|
Super Moderator
|
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! |
|
|
|
|
|
#6 |
|
Registered User
|
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 |
|
|
|
|
|
#7 | |
|
Super Moderator
|
Quote:
![]() ![]() ![]() Tu non sai niente, Jon Snow! |
|
|
|
|
|
|
#8 | |
|
Registered User
|
Quote:
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 |
|
|
|
|
|
|
#9 |
|
Registered User
|
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
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. |
|
|
|
|
|
#10 |
|
Registered User
|
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!!!! |
|
|
|
|
|
#11 |
|
Guaranteed Entropy Mod
|
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] |
|
|
|
|
|
#12 | |
|
B&M Coasterman
|
Quote:
![]() |
|
|
|
|
![]() |
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 | |
|
|