PIC e multitasking: come ovviare...

Sezione dedicata all'elettronica in generale.
Rispondi
davideciarm
Junior
Junior
Messaggi: 103
Iscritto il: mercoledì 4 febbraio 2009, 12:50
Località: Caserta

PIC e multitasking: come ovviare...

Messaggio da davideciarm » mercoledì 4 febbraio 2009, 12:57

Salve a tutti...
ho un progetto da fare con il 16F877A.
in pratica devo accendere led (e poi dovrò anche spegnerli) in sequenza, con l'effetto FADE. il problema, è che sia la velocità  dello scorrimento (non è questo il problema), che la velocità  del fade (ecco il problema!) vengono regolati dall'esterno tramite due trimmer (su RA1 la velocità  di scorrimento, RA2 velocità  per il FADE). (i led li collego su portb, quindi: led0=RB0)
faccio un esempio di programma (io uso mplab con hi-tech cpp) pensato:
start:
leggo valore RA1 (per vedere la velocità  dello scorrimento)
leggo valore RA2 (per vedere in quanto tempo deve accendersi il LED)
accendo Led0 nel tempo letto su RA2
aspetto tempo letto su RA1
accendo Led1 nel tempo letto su RA2
aspetto tempo letto su RA1
accendo Led2 nel tempo letto su RA2
aspetto tempo letto su RA1
.... fino a 19
aspetta tot tempo con i led tutti accesi....
iniziano a spegnersi tutti i led in sequenza...

però così facendo fa in modo che deve aspettare prima che si accende completamente il led, e poi può passare al passo successivo. io invece vorrei inviare il segnale per accendere il led (che può impiegare 0uS o anche 10000!) e poi passare al passo successivo.
come potrei fare...sto cercando e cercando su internet...ma non ho trovato molto! mi servirebbe una specie di multitasking... non so, magari va con gli interrupt? però...ho 19 led da comandare!

Vi prego aiutatemi!!! Grazie mille a tutti!!! A presto...

Avatar utente
niki77
Member
Member
Messaggi: 527
Iscritto il: martedì 27 marzo 2007, 13:42
Località: Tolentino(MC)

Re: PIC e multitasking: come ovviare...

Messaggio da niki77 » mercoledì 4 febbraio 2009, 14:04

Creati una base dei tempi tramite un interrupt generato da tmr0.
In ogni ciclo di interrupt leggi il valore dei trimmer e lo scrivi in 2 variabili definite a livello di applicazione.
Nel ciclo loop di main fai quello che hai sempre fatto.
Deve funzionare . :wink:
Salut.
Meglio non dire una cosa che dirne una sbagliata!

davideciarm
Junior
Junior
Messaggi: 103
Iscritto il: mercoledì 4 febbraio 2009, 12:50
Località: Caserta

Re: PIC e multitasking: come ovviare...

Messaggio da davideciarm » mercoledì 4 febbraio 2009, 14:17

ehm...non c'ho capito molto :oops:
avresti per caso qualche esempio da propormi?
ma...come hai detto, pensi che può funzionare? perchè...se per esempio ho il trimmer della velocità  di scorrimento veloce, è quello per il fade lento, succede che mentre si sta accendendo il primo, il programma già  sta al quinto led...quindi deve continuare a far accendere i vari led precendi, che non so quanti essi siano (dipende dalle 2 regolazioni).... è questo il mio dubbio :cry:

Avatar utente
fiser
Senior
Senior
Messaggi: 1570
Iscritto il: giovedì 27 dicembre 2007, 21:58
Località: ROMA
Contatta:

Re: PIC e multitasking: come ovviare...

Messaggio da fiser » mercoledì 4 febbraio 2009, 14:32

per il fade potresti usare l'uscita pwm.
ne hai due e sono indipendenti dal programma.... devi solo dargli un numero e puoi fare altre cose nel frattempo.
_______________________
un dottore in chissà cosa ha scritto:
sicuro e distruttivo malfunzionamento

davideciarm
Junior
Junior
Messaggi: 103
Iscritto il: mercoledì 4 febbraio 2009, 12:50
Località: Caserta

Re: PIC e multitasking: come ovviare...

Messaggio da davideciarm » mercoledì 4 febbraio 2009, 14:49

appunto...ne ho 2...avrei bisogno di 19 pwm :oops: :wink: ecco perchè non le uso proprio...

Avatar utente
Franco99
God
God
Messaggi: 4910
Iscritto il: sabato 13 dicembre 2008, 13:32
Località: Lugano, Svizzera

Re: PIC e multitasking: come ovviare...

Messaggio da Franco99 » mercoledì 4 febbraio 2009, 15:13

Aggiungi un pulsante chiamato SET.

Per regolare il primo LED premi e mantieni premuto il pulsante SET
per più di 5 secondi. (Usa un loop per la temporizzazione di 5 secondi).
Immediatamente dopo che hai premuto il pulsante SET, fai lampeggiare
il LED così si capisce quale LED stai regolando. Ora, se tieni premuto
il pulsante SET per più di 5 secondi la velocità  di fade viene impostata
come da trimmer e una variabile globale che tiene il conteggio di quale
LED è stato regolato viene incrementata di uno. (Variabile LedNr).
Se invece rilasci il pulsante prima dello scadere dei 5 secondi, solo
la variabile LedNr viene incrementata. Ora se premi nuovamente il pulsante
SET, basandoti sulla variabile LedNr, fai lampeggiare il prossimo LED e ripeti
il tutto come sopra. Questa soluzione ti permette di selezionare velocemente
quale LED vuoi regolare senza utilizzare i timer o interrupt del microcontrollore.
Il pulsante SET lo devi controllare in più punti del main loop oppure devi
collegare il pulsante ad un pin con interrupt.

Saluti,

Franco

EDIT: modificato 3 volte il testo.

Avatar utente
niki77
Member
Member
Messaggi: 527
Iscritto il: martedì 27 marzo 2007, 13:42
Località: Tolentino(MC)

Re: PIC e multitasking: come ovviare...

Messaggio da niki77 » mercoledì 4 febbraio 2009, 18:06

davideciarm ha scritto:appunto...ne ho 2...avrei bisogno di 19 pwm :oops: :wink: ecco perchè non le uso proprio...
Non hai bisogno di 19 pwm!!!
O perlomeno se il fade è lo stesso per tutti, se invece ho capito male e ogni led ha il suo fade... ci va ragionato un pò.
Ma da come hai spiegato tu:
davideciarm ha scritto: vengono regolati dall'esterno tramite due trimmer (su RA1 la velocità  di scorrimento, RA2 velocità  per il FADE).
Pare che il fade debba essere lo stesso per tutti i led regolandolo con un solo trimmer.
Il fade deve solo essere fade-out o anche fade-in?

P.S. è lecito sapere l'applicazione di detta schematica.
Salut.
Meglio non dire una cosa che dirne una sbagliata!

davideciarm
Junior
Junior
Messaggi: 103
Iscritto il: mercoledì 4 febbraio 2009, 12:50
Località: Caserta

Re: PIC e multitasking: come ovviare...

Messaggio da davideciarm » mercoledì 4 febbraio 2009, 18:57

certamente! :D Dovrei fare un circuito per l'illuminazione dei gradini di una nuova casa...e vorrei farla particolare :)
Il tempo di fade è uguale per tutti i gradini, ma le uscite non faranno il fade tutte insieme...eh si, vorrei fare sia il fadein che fadeout! 8)
grazie per l'aiuto!

davideciarm
Junior
Junior
Messaggi: 103
Iscritto il: mercoledì 4 febbraio 2009, 12:50
Località: Caserta

Re: PIC e multitasking: come ovviare...

Messaggio da davideciarm » venerdì 6 febbraio 2009, 11:33

ecco...allego il file del mio progetto...ancora non è multitasking...ma vedrò di farlo quanto prima! Se ci sono errori ditelo eh...l'ho provato solo su simulatore... (e non so come provare gli ingressi analogici! :?: )! Grazie mille per i consigli!
Non hai i permessi necessari per visualizzare i file e le foto allegati in questo messaggio. Per visualizzare tali file devi registrarti ed effettuare il Login

Avatar utente
niki77
Member
Member
Messaggi: 527
Iscritto il: martedì 27 marzo 2007, 13:42
Località: Tolentino(MC)

Re: PIC e multitasking: come ovviare...

Messaggio da niki77 » venerdì 6 febbraio 2009, 15:50

Penso proprio che il tuo progetto 'Multitasking' non lo vedremo mai, inquanto non supportato dai microprocessori della famiglia che stai usando.

Salut.
Meglio non dire una cosa che dirne una sbagliata!

davideciarm
Junior
Junior
Messaggi: 103
Iscritto il: mercoledì 4 febbraio 2009, 12:50
Località: Caserta

Re: PIC e multitasking: come ovviare...

Messaggio da davideciarm » venerdì 6 febbraio 2009, 16:03

vabbè...almeno proverò a simulare qualcosa di multitasking...tramite qualche interrupt...ci devo pensare un pochino :wink:
ma...per caso esistono pic che sono multitask?

Avatar utente
niki77
Member
Member
Messaggi: 527
Iscritto il: martedì 27 marzo 2007, 13:42
Località: Tolentino(MC)

Re: PIC e multitasking: come ovviare...

Messaggio da niki77 » venerdì 6 febbraio 2009, 16:42

Parlare di multitasking per un processore è sbagliato, multitasking è una particolarita di S.O.
Il microprocssore di suo non può fare niente di tutto ciò,per questo ti ho detto che non si può fare.

Però ci sono dei S.O. per pic che supportano il multitasking:
link

Se accontenti della versione free e ti bastano le prestazioni puoi provarlo.
Mi sembra che sia supportato anche dal 16f877

Salut.
Meglio non dire una cosa che dirne una sbagliata!

m.rossi
Junior
Junior
Messaggi: 55
Iscritto il: mercoledì 4 febbraio 2009, 23:44
Località: parma

Re: PIC e multitasking: come ovviare...

Messaggio da m.rossi » venerdì 6 febbraio 2009, 22:19

Io non so se ho capito bene il problema, e non ho nemmeno tempo di analizzare a fondo il tuo sw perchè come ovvio ognuno di noi lo riscriverebbe nel suo "stile" e in più io di C non è che ne sappia molto, comunque tempo fa avevo analizzato qualcosa di analogo assieme a dei ragazzi che avevano esigenza di fare parecchie linee pwm lente col pic per pilotare delle luci in dissolvenza.
Praticamente avevamo ipotizzato un interrupt con uno dei timer che dà  la tempistica di base, es. 1ms o 100us, e nella routine di interrupt incrementa (o decrementa) un contatore char fino a un certo valore, es. da 0 a 15, o 100, o 255, dipendentemente dalla risoluzione che vuoi nel pwm (preferisco valori 2^n-1 perchè con le maschere fai operazioni più veloci).
La frequenza del pwm è definita dal tempo base (non può essere troppo veloce altrimenti il pic fa solo interrupt) e il valore massimo di questo contatore.
Poi devi definire una variabile (può essere un array) per ogni linea pwm, chiamiamola pwm[x], e semplicemente come nel pwm piloti la linea x scrivendo un valore da 0 al valore massimo di contatore.
Nell'interrupt devi mettere tutte le uscite a 1 quando il contatore vale 0 (sempre se pwm[x] non vale 0 altrimenti hai uno spike), e subito dopo fai tutti gli x controlli if pwm[x]=contatore {PINx=0} per mettere a 0 la linea quando il contatore raggiunge quel valore. Non viene un interrupt molto veloce ma forse per delle luci potrebbe andare.
Non ti passo il codice perchè non ce l'ho (non ci sono arrivato in fondo, erano studenti) e perchè adesso sto giocando (nei pochissimi ritagli di tempo, famiglia permettendo, sono papà ...) con l'Atmel, e HiTech non me lo ricordo.
Spero di aver capito il problema, altrimenti chiedo venia a niki77 per violazione della sua firma :mrgreen: .

Avatar utente
niki77
Member
Member
Messaggi: 527
Iscritto il: martedì 27 marzo 2007, 13:42
Località: Tolentino(MC)

Re: PIC e multitasking: come ovviare...

Messaggio da niki77 » sabato 7 febbraio 2009, 0:26

no m.rossi,non ti sei sbagliato affatto,infatti con un modulo matematico e un paio di base dei tempi molto alte si può risolvere il problema senza pwm e altre amenità  varie. Chissà  se il diretto interessato è in grado di realizzarlo da solo... potrebbe stupirci questo fine settimana!
Meglio non dire una cosa che dirne una sbagliata!

m.rossi
Junior
Junior
Messaggi: 55
Iscritto il: mercoledì 4 febbraio 2009, 23:44
Località: parma

Re: PIC e multitasking: come ovviare...

Messaggio da m.rossi » sabato 7 febbraio 2009, 10:23

niki77 ha scritto: Chissà  se il diretto interessato è in grado di realizzarlo da solo...
vista la compessità  del sorgente che ha già  scritto, con puntatori e maschere, direi proprio di sì, i ragazzi con cui ne ho parlato ne sapevano mooooooooolto meno, quindi non ho idea se la cosa funzioni o diventi troppo lenta per la sua applicazione. Adesso darò un'occhiata al C anch'io, è una vita che voglio farlo, per adesso il PIC l'ho usato anni fa in assembler per l'allarme di casa mia, ed era un bel casino. Però funziona ancora.
ciao

Rispondi

Torna a “Elettronica”