|
|
|
||||||||
| Arcade | Registrazione | Blogs | Regolamento | Feedback | FAQ | Lista Utenti | Calendario | Segna come Letti |
| Ultimi 5 blog pubblicati su PcTuner Blog | ||||||
|
||||||
![]() |
|
|
Strumenti Discussione | Modalità Visualizzazione |
|
|
#1 |
|
Registered User
|
AIUTO programma centralina
Salve a tutti
io avrei bisogno di un'urgentissimo aiuto per la programmazione di un PIC16F84A contenuto all'interno di una centralina da me progettata e costruita (quasi) vorrei che fosse programmata in C in modo da poterci capire qualcosa nel caso dovessi modificare il listato... problemi vari: 1) a scuola ci hanno insegnato poco o nulla (e comunque non ci ho mai capito molto di mio) 2)manca poco tempo 3)quel poco che sapevo, ora non me lo ricordo più ho un programmatore che ho usato più volte il propic2clone perciò intendo usare quello gradirei usare MPLAB per la programmazione e poi ICprog per caricarlo sul pic qualcosina l'ho scritto a livello di inizializzazioni ma è probabile che siano tutte str****te questa benedetta centralina "RAIN BOX" servirebbe appunto per gestire gli effetti del temporale all'interno del presepe, in pratica l'unica cosa che deve fare il PIC è gestire l'accensione e i ritardi dei RELE vi allego gli schemi e un tentativo di inizio di programma questa RAIN BOX in soldoni dovrebbe: tenere un RELE su ON (sulla quale è attaccata un autoradio) non appena l'altra centralina accende il rele corrispondente deve partire il ciclo della rain box: -STOP autoradio -LUCI ON (attiva una scheda per luci psichedeliche) -PLAY rumori fulmini (ovvero attiva il contatto play di un vecchio lettore CD-ROM) -POMPA ON (attiva la pompa che fa piovere) delay(15 sec) -LUCI OFF -STOP lettore cd delay (15 sec) -POMPA OFF appena il contatto della prima centralina torna a 0 -autoradio ON ho predisposto un dipswirch da 4 per poter selezionare diverse combinazioni di tempo (perchè non so come verrà il risultato finale e montare e smontare il PIC per riprogrammarlo non è una gran soluzione) spero di non aver omesso nulla e spero vivamente che qualcuno mi possa aiutare... ![]() GRAZIE |
|
|
|
|
|
#2 |
|
Io cavalco da solo
|
Ok, lo so. Non è compito mio ma mi viene da dire:
Buongiorno eh, non si bussa alla casa tua? ( dal film Troy doppiato in abruzzese da Marco Papa ) ![]() Cmq benvenuto nel forum.... A proposito del circuito, non è complicato, è giusto un timer che avvia una sequenza pilotata da un segnale in ingresso. A questo punto però (secondo me) non dovendo effettuare compiti alla velocità della luce ti conviene usare un quarzo da 16 KHz (si trovano da 16384Hz) perché tirare fuori un ritardo di 15 secondi da un oscillatore da 8 MHz diventi scemo a forza di fare loops. Puoi sostituirlo? ciao Augusto P.S. ma il tuo compilatore C accetta il punto e virgola come indicatore di commento? |
|
|
|
|
|
#3 |
|
Registered User
|
immaginavo che mi avreste risposto così...cercavo la pagina delle presentazioni ma non l'ho trovata...cmq non è per maleducazione...
buongiorno a tutti! ![]() si esatto il circuito è semplice e anche a dirsi sono tutti timer da programmare mail max che ho fatto a scuola è accendere un led in mille modi diversi ma solo quello... in effetti io ho usato la solita configurazione dei due condensatori da 22p e il quarzo da 8MHz per la forza dell'abitudine...si può sosituire penso di sì perchè non l'ho ancora ne stampata ne montata se si può sempilcemente lasciare tutto com'è e sostituire il quarzo ok altrimenti no.. ![]() come detto nel messaggio prima io non sono un programmatore quindi è probabile che copiando il template di scuola abbia scazzato qualcosa comunque ritengo che la risposta alla tua domanda sia NO!.. può anche essere che aprendo il listato con notepad o altro ti si sia sgranata l'indentazione per cui si sono spostati i punti e virgola P.S. uso MPLAB come ho già detto, compilatore HI-TECH...(quello per il C insomma, Lite ovviamente) |
|
|
|
|
|
#4 |
|
Io cavalco da solo
|
Era per sghignazzare un po', non volevo essere scortese
![]() Non mi pare comunque che ci sia una pagina di presentazioni, era giusto per la velocità dell'entrata.. Comunque, visto che un timer per tempi lunghi con 16F84 l'ho già fatto per il terrario di mia figlia posso vedere se trovo un attimo libero, comunque lo scrivo per un oscillatore a 16.384 KHz, ok? Attento al circuito stampato, questi quarzi sono molto più piccoli di quelli standard (sono quelli fatti a "tubetto"), ma in compenso hanno i terminali lunghi e flessibili per cui probabilmente ci va lo stesso. Se non lo trovi smonta qualche vecchia scheda madre, li ci sono di sicuro per l'RTC Dammi un po' di tempo e vediamo se riusciamo a far piovere sul presepe ciao Augusto |
|
|
|
|
|
#5 |
|
Registered User
|
Non vedo controindicazioni, se non il consumo, nell'utilizzare un quarzo ad alta frequenza anche per tempi lunghi.
__________________Comunque il quarzino più facile da trovare è quello da 32KHz degli orologi.
Camillo
Internet ti fa vedere tutto ma non ti fa toccare niente. (Camillo Ferrari) |
|
|
|
|
|
#6 | |
|
Io cavalco da solo
|
Quote:
Probabilmente l'unico neurone che mi è rimasto aveva il prescaler 1:2 inserito ![]() Ho buttato giù qualcosa, a te il debugging, il codice è semplice e commentato (spero) piuttosto bene. Per Camillo: lo so, anche a 20 MHz va bene, solo che devo mettere 2 o 3 contatori in cascata, invece così risparmio sia istruzioni che consumo... In ogni caso a 4 interrupt al secondo posso eseguire più di 2000 istruzioni tra un irq e l'altro e per quello che deve fare questa scheda.... Ciao Augusto |
|
|
|
|
|
|
#7 |
|
Registered User
|
[the rider] non mi apre gli zip...ritenta...
c'è qualcosa che non va con sto quarzo su hobby cnc mi dicono che basta uno da 4MHz e che da 8 e 16 è troppo... qui l'opposto...di chi mi fido? ![]() alla fine mi sa che lo lascio da 8 ah già mi dite come cacchio si calcola sto prescaler che non trovo più i miei appunti di sistemi? (mi sa che li ho bruciati dopo la maturità...scherzo non li trovo più) |
|
|
|
|
|
#8 |
|
Io cavalco da solo
|
Ci riprovo, ma gli altri li apro senza problemi...
Per il quarzo, fino a 20 MHz vanno bene tutti, solo che poi devi adattare il programma per quella frequenza, il prescaler divide al massimo per 256. Questo programma è scritto per un quarzo da 32 khz. Ah dimenticavo, non ho messo la config word nel sorgente, (in C non ricordo mai come si imposta) comunque è 0x3FF0 o puoi provare 0x3FF1 Se per caso ancora non apri lo zip posto anche il sorgente in C (senza il .hex) ciao Augusto |
|
|
|
|
|
#9 | |
|
frullapic
|
Quote:
![]() quindi più semplice da gestire in termini di software per le tue temporizzazioni. Ciao ciao Zef |
|
|
|
|
|
|
#11 |
|
Io cavalco da solo
|
Ok per lo zip, ma il ".C" lo vedi?
La differenza tra i due programmi è che uno opera in sequenza (rainbox.c) mentre il mio opera per stati (pioggiap.c). Per una applicazione così semplice sono equivalenti quindi vai tranquillo. Ah, dimenticavo, se il pioggiap.c lo vedi con le righe una attaccata all'altra piuttosto che una sotto l'altra aprilo con wordpad invece che con notepad e poi risalvalo.... (Io OOooodio winzozz.....) ciao Augusto P.S. mi sa che il prof non ha utilizzato i dip switch ![]() |
|
|
|
|
|
#12 |
|
Registered User
|
ah no ma il prof mi ha scritto solo la routine e mi ha precisato che il MCLR è hardware cosa che non avevo considerato...
no ma infatti i dipswitch non li ho messi perchè non so se il delay va bene usato così e quindi... non vorrei che quando lo compilo vengono fuori migliaia di errori che non so dove mettere le mani.. ma quindi quello che ho scritto io ha anche un senso logico? incredibile |
|
|
|
|
|
#13 |
|
Registered User
|
ok il programma ora lo vedo bastava aprirlo con java editor..
allora credo che ci siano alcune correzioni da fare...ovvero la'utoradio io la collego su uno dei tre contatti del relè in modo che funzioni come normalmente chiuso...quindi all'inizio del cilco bisogna disattivarla portando il relè a 1 e ariattivarla alla fine ponendolo a 0 mm ok quindi se lo compilo dovrebe andare? mi sa che l'unica chance di capire se va è provarlo....però ho l'impressione che ci siano delle inesattezze sul nome delle porte... quindi scrivo qui l'assegnazione delle porte: pin1 RA2 DIP2 opzione tempo pin2 RA3 DIP3 opzione tempo pin3 RA4/T0CK1 DIP4 opzione tempo pin4 MCLR RESET tasto di reset pin5 VSS (GND) GND pin6 RB0/INT PLAY CD1 play/forward pin7 RB1 STOP CD1 stop/eject pin8 RB2 RADIO autoradio pin9 RB3 RELE4 non collegato pin10 RB4 RELE5 POMPA pin11 RB5 RELE6 LUCI LAMPI pin12 RB6 RELE7 non collegato pin13 RB7 LED HeartBeat pin14 VDD (+5V) (+5V) pin15 OSC2 CLKOUT pin16 OSC1 CLKIN pin17 RA0 START segnale di start da centralina pin18 RA1 DIP1 opzione tempo poi...tutta questa parte: { stato |= FASEA_ON; /* fase a, stop suoni start tuoni, pompa, luci */ PORTA |= STOPSOUND_ON; /* attivo lo stop alla musica */ PORTA |= STARTTUONI_ON; /* attivo lo start ai tuoni */ PORTB |= LUCI_ON; /* via ai lampi */ PORTB |= POMPA_ON; /* via alla pioggia */ time1 = preload_t1; /* inizializzo il primo timer */ time2 = preload_t2; /* idem per il timer 2 */ } else if(stato & FASEA_ON) /* fase A attiva, passo alla B */ { stato &= FASEA_OFF; stato |= FASEB_ON; PORTA &= STOPSOUND_OFF; /* rilascio il pulsante di stop alla musica */ PORTA &= STARTTUONI_OFF; /* rilascio il pulsante di start tuoni */ quando dice attivo lo stop alla musica ti riferisci all'autoradio immagino... starttuoni è il lettore cd giusto? quindi il tasto corrispondente al play va spinto e rilasciato per diciamo un po più di mezzo secondo direi... idem per lo stop va spinto e rilasciato... naturalmente può essere che abbia frainteso io... fatemi sapere... |
|
|
|
|
|
#14 | |
|
Io cavalco da solo
|
c'è qualcosa che non va....
![]() L'assegnazione dei pin i/o per te è così: Quote:
![]() per quello che riguarda il cd effettivamente nella fase "A" attivo lo start del player (STARTTUONI_ON) e nella fase "B" 0,25 secondi dopo, lo rilascio (STARTTUONI_OFF) idem per lo stop nelle fasi "D" ed "E" Per ultimo, dallo schema risulta che anche la colonna sonora ha uno start ed uno stop separati, per cui mi sono regolato nello stesso modo se invece hai un solo rele per dare o togliere alimentazione le cose vanno un po' modificate ciao Augusto |
|
|
|
|
|
|
#15 |
|
Registered User
|
scusami ho fatto una boiata io ti ho postato gli schemi vecchi!ti ho allegato gli schemi giusti... comunque ho sistemato un po' la mia versione del programma che devo ancora finire... a questo punto mi servono consulenze e delucidazioni perchè io i programmi li ho sempre scritti così quindi succede che se prendo il tuo già fatto non ci capisco nulla... diciamo che se alla fine non ne vengo fuori uso il tuo..sempre che la scheda funzioni la devo ancora testare... mi servirebbe sapere bene come si imposta e come si richiama la funzione delay.. il mio prof mi ha spedito questo: void delay20sec(void){ unsigned char cont; cont = 200; do{ DelayMs(100); }while(--cont); } a questo punto io avevo in mente di fare così creare delle routine tipo questa sopra ma cambiando i tempi dei ritardi, creare degli if per i DIPSWITCH e fare un copia e incolla del programma coi ritardi cambiati però non mi è chiaro DelayMs è un comando specifico oppure io posso fare ad esempio così... void delay5sec(void){ unsigned char cont; cont = 50; do{ Delay5(100); }while(--cont); } e poi quando ne ho bisogno richiamo una volta Delay5(100), Delay10...Delay15..ecc... in pratica non so come si usa... inoltre il prof mi ha detto di impostare OPTIONS e INTCON intcon serve per gli interrupt e se non sbaglio sviluppando così come ho fatto io il programma non servono quindi INTCON =0b00000000 ; mentre OPTIONS ora è settato così: OPTION =0b10000111 ; // HARDWARE del PIC // |||||+++------bit0,1,2 prescaler erTMR0parte da2,perWDTda1 // ||||+---------bit3 PSA Prescaler source 0=TMR0 1=WDT // |||+----------bit4 T0SE TMR0 source edge 0=fronte salita RA4 // ||+-----------bit5 T0CS timer input sel. 0=clock 1=RA4 // |+------------bit6 INTDEDG int.edge 1=fronte salita 0=fonte // +-------------bit7 RPBUport B pull up 0=enable c'è qualcosa da cambiare? ora delay a parte se si può impostare come ho detto i dipswitch manca solo il led di heartbeat credo... |
|
|
|
|
|
#16 |
|
Registered User
|
in realtà nel progetto di partenza avevo previsto di usare un lettore CD per la colonna sonora e uno per i rumori solo che c'era un problemino e cioè che il lettore della colonna sonora doveva avere un autoreverse..per fare ciò avevo immaginato di creare un contatore con un numero prefissato di tracce...ma poi per ridurre drasticamente i lavori in termini di tempo l'ho sosituito con l'autoradio che l'autoreverse ce l'ha di suo e così basta attivare e disattivare..sicuramente il risultato è più brutto ma non veramente più tempo...
comunque ho montato la scheda per ora sembra che non sia esploso nulla...attendo che il programma sia pronto e intanto preparo i collegamenti per il lettore e le altre robe... GRAZIE CIAO |
|
|
|
|
|
#17 | |||
|
Io cavalco da solo
|
Quote:
Quote:
Tra parentesi, su PIC di fascia bassa come questo ho iniziato ad usare l'assembler un paio di mesi fa e ti assicuro che indietro non torno. Quote:
Un'ultima considerazione: il tuo programma è sequenziale, per cui si aspetta di procedere con tutte le operazioni previste una dopo l'altra, ma se a metà del ciclo "START" va a 0 rimane tutto come fotografato in quel momento invece dovresti riportare le cose in condizioni attesa (pompa off, musica on ecc....) Ultima ultima, ma poi che quarzo hai montato? ciao Augusto Ultima Modifica di the rider : 18-12-2008 13.02.05. |
|||
|
|
|
|
|
#18 |
|
Registered User
|
si dopo mi ha spiegato il prof che DelayMs() è un comando..quindi ok
lo so che tutti i robottari e gli autodidatti usano assembler..però io avendo "imparato" si fa per dire a usare il C a scuola uso quello...se mi metto a cambiare ancora non vado da nessuna parte anche perchè all'università noi usiamo java che è + simile al C (anzi praticamente identico) alla fine ho montato il quarzo da 4MHz spero vada bene (penso di si ma nel caso si fa presto a cambiare) a scanso di equivoci ti allego il file in C che ho scritto io dove sono contenute tutte le definizione dei pin (aprilo con notepad e leva "a capo automatico" si dovrebbe leggere bene) come vedrai l'autoradio è su RB2 in effetti alla questione dell'interruzione improvvisa del programma non avevo pensato...e quindi come faccio? ![]() |
|
|
|
|
|
#19 |
|
Io cavalco da solo
|
Dunque... vedi che hai definito delle funzioni che però non chiami mai, in pratica il tuo codice iniziale
Codice:
main(void)
{
for(;;){ /*apro il for*/
Codice:
main(void)
{
init(); // inizializzi il controller
for(;;){ /*apro il for*/
Codice:
POMPA = 1; /*accendo la POMPA*/ DelayMs(100); /* 20sec */ LAMPI = 0; /*spengo le luci*/ Codice:
POMPA = 1; /*accendo la POMPA*/ delay20sec() /* 20sec */ LAMPI = 0; /*spengo le luci*/ Per l'attacco e lo stacco dei pulsanti start e stop del cd 5mS (DelayMs(5)) mi sembrano proprio pochi, fai almeno 250 altrimenti il relè nemmeno si muove, o almeno usa "DelayDecimi(5)" che hai definito ma non usi mai.... Se invece "sparisce" il segnale start a metà ciclo non vedo in che modo tu possa cavartela "a poco prezzo" con un ciclo in sequenza, dovresti controllare in continuazione il segnale prima di ogni operazione..... Morale della favola: operare per stati è un po' più complicato (nonché palloso) però ti lascia molto più libero.... fai finta di scrivere in java, no? ![]() ciao Augusto |
|
|
|
|
|
#20 | |
|
Io cavalco da solo
|
Ooops... dimenticavo:
Quote:
![]() Dammi retta se continui a trafficare con questi aggeggi (e hai tempo) e ti comincia a servire una precisione molto stretta sui tempi l'assembler è la cosa migliore. Oltre tutto un programma che scrissi in C per 16F876 mi ha riempito la rom, lo stesso programma in assembler sta a poco più di 1/4 di impegno.... riciao Augusto EDIT: (mi ero dimenticato pure questo) per i tempi variabili fai così: alla fine della init() controlla lo stato degli switch e poi carica una variabile in proporzione al valore ottenuto, fatto questo modifica la delay20sec() in modo che accetti in ingresso il numero di secondi che avrai ottenuto nella init() ed il gioco è fatto ![]() Ultima Modifica di the rider : 18-12-2008 21.17.12. |
|
|
|
|
![]() |
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 | |
|
|