Programma in C
Ciao a tutti, ho un broblema a programmare in C ovvero devo scrivere un programma che mi accenda un diodo led per un secondo poi si spegne per un altro secondo e poi si riaccende, tutto questo per $n$ volte... il fatto è che in C ho soltanto scritto programmi ad esempio data una matrice $nxn$ scambiare riga e colonna...non ho idea di come si possa fare, le librerie da usare ecc...
Non so se la sezione è giusta, volevo postare in Ingegneria, ma ho pensato che il problema è scrivere il programma non creare un circuito....
Non so se la sezione è giusta, volevo postare in Ingegneria, ma ho pensato che il problema è scrivere il programma non creare un circuito....
Risposte
Ciao
per poterti aiutare avrei bisogno di capire con che cosa vuoi far accendere il led. Vuoi controllarlo tramite il PC oppure tramite un microcontrollore (PIC, ATMEL, etc)?
Se vuoi farlo tramite il PC il metodo più semplice è usare la porta parallela (ammesso che il tuo computer ce l'abbia ancora) ma, in qualsiasi caso non è dette che l'elettronica della parallela possa fornirti una corrente sufficiente per accendere il led, quindi dovresti costruirti un piccolo circuito per farlo. Anche in questo caso, se ti serve posso darti una mano
Se invece usi un PIC la cosa diventa molto più semplice a livello di programmazione, anche se richiede un pochino di hardware anche in questo caso
Prima di poterti aiutare a scrivere il programma ho bisogno che tu mi risponda alla mia prima domanda
Fammi sapere
per poterti aiutare avrei bisogno di capire con che cosa vuoi far accendere il led. Vuoi controllarlo tramite il PC oppure tramite un microcontrollore (PIC, ATMEL, etc)?
Se vuoi farlo tramite il PC il metodo più semplice è usare la porta parallela (ammesso che il tuo computer ce l'abbia ancora) ma, in qualsiasi caso non è dette che l'elettronica della parallela possa fornirti una corrente sufficiente per accendere il led, quindi dovresti costruirti un piccolo circuito per farlo. Anche in questo caso, se ti serve posso darti una mano
Se invece usi un PIC la cosa diventa molto più semplice a livello di programmazione, anche se richiede un pochino di hardware anche in questo caso
Prima di poterti aiutare a scrivere il programma ho bisogno che tu mi risponda alla mia prima domanda

Fammi sapere
Concordo con Summerwind, abbiamo bisogno di maggior informazioni per poterti aiutare. Non esiste una funzione già pronta del C per "accendere un led" (sicuramente non tra quelle standard almeno). Abbiamo bisogno di sapere l'hardware sul quale dovrà girare questo programma, come questo led è collegato al tuo sistema e nel caso di un PC anche il sistema operativo che stai usando.
Mi correggo
pare che sia possibile accendere un normale led con un pin della porta parallela, usando una resistenza da 470 ohm in serie al led.
Ma secondo me sarebbe piú saggio comunque crearti un piccolo driver open collector per evitare di stressare il chip della parallela
pare che sia possibile accendere un normale led con un pin della porta parallela, usando una resistenza da 470 ohm in serie al led.
Ma secondo me sarebbe piú saggio comunque crearti un piccolo driver open collector per evitare di stressare il chip della parallela
ciao, voglio accendere un led con un microcontrollore, il PIC.... da quello che ho capito devo prima scrivere il programma sul computer e scaricarlo sul PIC tramite la porta USB....una volta scaricato sul pic lo collego al led con un alimentazione e tutti i componenti...
il programma invece non lo so scrivere...
il programma invece non lo so scrivere...
ok adesso è più chiaro
dimmi esattamente quale pic vuoi usare, il modello intendo, 16F84A, 16F876, etc????
come li programmi con l'USB? ha un programmatore?
Per scrivere il codice in C ti consiglio di scaricare il programma MPLAB dal sito Microchip (è gratuito) così si può prima simulare e poi lo si carica nel pic
il circuito per il pic lo sai costruire?
dimmi esattamente quale pic vuoi usare, il modello intendo, 16F84A, 16F876, etc????
come li programmi con l'USB? ha un programmatore?
Per scrivere il codice in C ti consiglio di scaricare il programma MPLAB dal sito Microchip (è gratuito) così si può prima simulare e poi lo si carica nel pic
il circuito per il pic lo sai costruire?
Si il circuito per il pic lo so costruire; il modello è 12F615-i/sn...
si c'è una porta USB che va dal compuer ad una basetta dove si ci collega il pic per caricarvi il programma...
insieme al programmatore c'è un softwer per scrivere il programma e mi sembra che c'è proprio il programma MPLAB però non so come si usa....è una sorta di programma C, giusto?
"Summerwind78":
come li programmi con l'USB? ha un programmatore?
si c'è una porta USB che va dal compuer ad una basetta dove si ci collega il pic per caricarvi il programma...
"Summerwind78":
Per scrivere il codice in C ti consiglio di scaricare il programma MPLAB dal sito Microchip (è gratuito) così si può prima simulare e poi lo si carica nel pic[...]
insieme al programmatore c'è un softwer per scrivere il programma e mi sembra che c'è proprio il programma MPLAB però non so come si usa....è una sorta di programma C, giusto?
Ok
credo che sia tutto ciò che mi serve. Dammi tempo fino a stasera (23.00 circa) e ti indico qualcosa con cui iniziare
credo che sia tutto ciò che mi serve. Dammi tempo fino a stasera (23.00 circa) e ti indico qualcosa con cui iniziare
okkkkk!!!!!!!!!!!!!!!!! grazie milleeee!!!!!!
Cominciamo....
ovviamente funziona come tutto il resto dei programmi in C quindi con il classico
void main (void)
{
//Resto del programma.
}
La prima cosa che dobbiamo fare è scegliere la filosofia da seguire. Abbiamo due possibilità:
possibilità 1) possiamo fare in modo che il programma esegua delle operazioni a vuoto in modo che queste durino circa un secondo e poi far cambiare lo stato del LED (poi ti spiegherò come fare)
possibilità 2) usare un componente hardware detto Timer che ci permette di non fare nulla e far partire una funzione interrupt quando il timer va in overflow
la prima delle due possibilità è la più facile da implementare ma diciamo che spreca più risorse, mentre la seconda è la più "pulita" in termini di risorse ma è più complessa da implementare. Dipende da cosa preferisci tu.
non so se sto correndo troppo. Sono tutto concetti chiari questi per te? Sai cosa è un timer hardware e cosa è un interrupt?
per quanto riguarda il programma da usare sul PC, ti consiglio di scaricare l'ultima versione dell MPLAB del sito microchip, così usiamo la stessa versione ed evitiamo problemi in questo senso.
Quando lo installi scegli l'installazione "complete" in modo che tu abbia tutto quello che serve
ovviamente funziona come tutto il resto dei programmi in C quindi con il classico
void main (void)
{
//Resto del programma.
}
La prima cosa che dobbiamo fare è scegliere la filosofia da seguire. Abbiamo due possibilità:
possibilità 1) possiamo fare in modo che il programma esegua delle operazioni a vuoto in modo che queste durino circa un secondo e poi far cambiare lo stato del LED (poi ti spiegherò come fare)
possibilità 2) usare un componente hardware detto Timer che ci permette di non fare nulla e far partire una funzione interrupt quando il timer va in overflow
la prima delle due possibilità è la più facile da implementare ma diciamo che spreca più risorse, mentre la seconda è la più "pulita" in termini di risorse ma è più complessa da implementare. Dipende da cosa preferisci tu.
non so se sto correndo troppo. Sono tutto concetti chiari questi per te? Sai cosa è un timer hardware e cosa è un interrupt?
per quanto riguarda il programma da usare sul PC, ti consiglio di scaricare l'ultima versione dell MPLAB del sito microchip, così usiamo la stessa versione ed evitiamo problemi in questo senso.
Quando lo installi scegli l'installazione "complete" in modo che tu abbia tutto quello che serve
[OT]
Solo una piccola nota che non cambia comunque il fatto di dover scrivere la funzione main. Normalmente in C è illegale definire la funziona main in modo che non restituisca valori, lo standard richiede infatti che restituisca int. Ovviamente in contesti come questo non ha senso. Per questo e altri motivi (come la difficoltà ad implementare alcune funzioni delle librerie standard), lo standard definisce due modalità, una in cui lo standard viene supportato interamente e una in cui invece viene supportato solo in parte. Una di queste concessioni riguarda la funzione main e permette di definirne diverse versioni. La tua è una di quelle. Potrebbe però addirittura usare un nome diverso per la funzione.
[/OT]
Arrivando invece alle cose un po' più importanti:
Io credo che questa filosofia sia migliore sia dal punto di vista implementativo che dal punto di vista didattico (è utile sapere che cos'è un interrupt e come funziona).
Si tratta di un IDE, cioè un programma che offre al suo interno tutta una serie di strumenti per permettere e facilitare la scrittura di programmi in C per PIC. Immagino che tu abbia utilizzato qualcosa di simile in passato per scrivere gli esercizi di programmazione di cui parlavi nel primo post (o hai sempre usato il blocco note e richiamato tutto da linea di comando?).
"Summerwind78":
ovviamente funziona come tutto il resto dei programmi in C quindi con il classico
void main (void)
Solo una piccola nota che non cambia comunque il fatto di dover scrivere la funzione main. Normalmente in C è illegale definire la funziona main in modo che non restituisca valori, lo standard richiede infatti che restituisca int. Ovviamente in contesti come questo non ha senso. Per questo e altri motivi (come la difficoltà ad implementare alcune funzioni delle librerie standard), lo standard definisce due modalità, una in cui lo standard viene supportato interamente e una in cui invece viene supportato solo in parte. Una di queste concessioni riguarda la funzione main e permette di definirne diverse versioni. La tua è una di quelle. Potrebbe però addirittura usare un nome diverso per la funzione.
[/OT]
Arrivando invece alle cose un po' più importanti:
possibilità 2) usare un componente hardware detto Timer che ci permette di non fare nulla e far partire una funzione interrupt quando il timer va in overflow
Io credo che questa filosofia sia migliore sia dal punto di vista implementativo che dal punto di vista didattico (è utile sapere che cos'è un interrupt e come funziona).
insieme al programmatore c'è un softwer per scrivere il programma e mi sembra che c'è proprio il programma MPLAB però non so come si usa....è una sorta di programma C, giusto?
Si tratta di un IDE, cioè un programma che offre al suo interno tutta una serie di strumenti per permettere e facilitare la scrittura di programmi in C per PIC. Immagino che tu abbia utilizzato qualcosa di simile in passato per scrivere gli esercizi di programmazione di cui parlavi nel primo post (o hai sempre usato il blocco note e richiamato tutto da linea di comando?).
@apatriarca: concordo anche io sull'uso dell'interrupt. Però non credo che sia più semplice dal punto di vista dell'implementazione
se non si ha pratica nell'uso dei PIC è necessario comprendere come configurare il timer, il suo prescaler, e il registro interrupt e la chiamata alla funzione interrupt. Nell'insieme mi sembra un po' troppa roba con cui cominciare, non credi?
Ovviamente se domy90 ha tempo sufficiente, vale davvero la pena imparare, io faccio quasi tutto con gli interrupt
se non si ha pratica nell'uso dei PIC è necessario comprendere come configurare il timer, il suo prescaler, e il registro interrupt e la chiamata alla funzione interrupt. Nell'insieme mi sembra un po' troppa roba con cui cominciare, non credi?
Ovviamente se domy90 ha tempo sufficiente, vale davvero la pena imparare, io faccio quasi tutto con gli interrupt

Dicendo che fosse migliore dal punto di vista implementativo non intendevo dire che fosse più semplice. È migliore perché da qualche certezza mentre l'altro dipende da troppe cose e alla fine non è poi tanto più semplice. Come stabiliresti ad esempio il tempo di esecuzione? E se il compilatore decidesse che quel codice non fa niente e lo eliminasse (è un'ottimizzazione forse troppo aggressiva e forse più comune in altri sistemi.. però..)? Devi a quel punto iniziare a far fare qualcosa dentro al ciclo (magari su una variabile definita volatile e così via..). Alla fine si fa prima a fare le cose per bene e imparare qualcosa sugli interrupt e su come funzionano. Ma sentiamo che dice domy90...
Non posso che concordare 
anche se ho giá simulato la versione senza interrupt e funziona.
Domanda a parte... apatriarca sei di Torino cittá o dintorni? lo chiedo perché anche io ero di quelle parti prima di trasferirmi in Germania e mi fa sempre piacere trovare dei compaesani (in senso lato)

anche se ho giá simulato la versione senza interrupt e funziona.

Domanda a parte... apatriarca sei di Torino cittá o dintorni? lo chiedo perché anche io ero di quelle parti prima di trasferirmi in Germania e mi fa sempre piacere trovare dei compaesani (in senso lato)
Sono di Torino città da qualche anni ma vengo dalla provincia di Vercelli, che fai di bello in Germania? Dottorato? Lavori?
Lavoro. Ho lavorato per qualche anno a torino e poi ho cercato all'estero per farmi un'esperienza diversa e ho trovato in Germania
Io sono originario della zona di Saluzzo ma sono cresciuto vicino a Pinerolo
tu?
Io sono originario della zona di Saluzzo ma sono cresciuto vicino a Pinerolo
tu?
"Summerwind78":
La prima cosa che dobbiamo fare è scegliere la filosofia da seguire. Abbiamo due possibilità:
possibilità 1) possiamo fare in modo che il programma esegua delle operazioni a vuoto in modo che queste durino circa un secondo e poi far cambiare lo stato del LED (poi ti spiegherò come fare)
possibilità 2) usare un componente hardware detto Timer che ci permette di non fare nulla e far partire una funzione interrupt quando il timer va in overflow[...]
prferisco la seconda sembra, appunto, come hai detto tu più pulita....
"Summerwind78":
Sono tutto concetti chiari questi per te? Sai cosa è un timer hardware e cosa è un interrupt?
il timer hardware è un dispositivo per intenderci tipo una sveglia, ma molto più complesso....
L'interrupt è un interruzione, sto leggendo qualcosa su wlikipedia ma non ci capisco quasi niente sono ci diversi concetti legati all'interrupt....
"Summerwind78":
per quanto riguarda il programma da usare sul PC, ti consiglio di scaricare l'ultima versione dell MPLAB del sito microchip, così usiamo la stessa versione ed evitiamo problemi in questo senso.
l'ultima versione qual'e? io ho MPLAB versione 8.60...
"apatriarca":
insieme al programmatore c'è un softwer per scrivere il programma e mi sembra che c'è proprio il programma MPLAB però non so come si usa....è una sorta di programma C, giusto?
Si tratta di un IDE, cioè un programma che offre al suo interno tutta una serie di strumenti per permettere e facilitare la scrittura di programmi in C per PIC. Immagino che tu abbia utilizzato qualcosa di simile in passato per scrivere gli esercizi di programmazione di cui parlavi nel primo post (o hai sempre usato il blocco note e richiamato tutto da linea di comando?).
si all'inizio utilizzavo il DEV-C che comunque credo che sia un IDE, ultimamente invece utilizzo il blocco note....
[semi-OT]
ma per lavorare con gli interrupt non bisogna scrivere codice in kernel-space (mondo *nix), o ci sono funzioni che delegano in user-space la faccenda.
Quando studiai questi argomeni, sapevo che il tutto si fa in kernel-space se si lavora direttamente con porte hardware....
[/OT]
ma per lavorare con gli interrupt non bisogna scrivere codice in kernel-space (mondo *nix), o ci sono funzioni che delegano in user-space la faccenda.
Quando studiai questi argomeni, sapevo che il tutto si fa in kernel-space se si lavora direttamente con porte hardware....
[/OT]
@ham_burst: I PIC non sono dotati di sistemi operativi* e tantomeno di un sistema operativo *nix. È ovviamente possibile utilizzare o implementare un sistema operativo nel caso di microcontrollori più potenti e progetti più grossi, ma difficilmente si tratta di un qualche sistema operativo *nix (e anche averlo POSIX compliant potrebbe essere troppo in molti casi). Che te ne fai insomma di un sistema operativo *unix se devi solo accendere un led? Considera che il progetto deve essere scritto su questo microcontrollore...
EDIT: Il messaggio era ovviamente che molta della complessità presente nei sistemi mainstream è quindi del tutto assente in sistemi così semplici. Non ha quindi molto senso a mio parere approcciarsi alla programmazione per PIC con la mentalità di un sistema operativo come *nix che è stato progettato per sistemi ben più potenti e con usi decisamente diversi.
* Forse qualche modello più potente viene venduto con un qualche sistema operativo, ma non ne ho idea.
EDIT: Il messaggio era ovviamente che molta della complessità presente nei sistemi mainstream è quindi del tutto assente in sistemi così semplici. Non ha quindi molto senso a mio parere approcciarsi alla programmazione per PIC con la mentalità di un sistema operativo come *nix che è stato progettato per sistemi ben più potenti e con usi decisamente diversi.
* Forse qualche modello più potente viene venduto con un qualche sistema operativo, ma non ne ho idea.
"domy90":
l'ultima versione qual'e? io ho MPLAB versione 8.60...
L'ultima versione stabile è la 8.73a
la trovi qui in fondo alla pagine:
http://www.microchip.com/stellent/idcpl ... t=SW007002
veniamo ai concetti di base prima di procedere con il programma vero e proprio.
Cosa è un timer?? Tu prima lo hai definito una sorta di "sveglia". Direi che questa definizione non è molto appropriata.
Quando si parla di microcontrollori, il timer è un registro, quindi una specie di allocazione di memoria "fissa", ovvero non viene utilizzata per metterci dentro variabili o altro. In particolar modo il timer è in registro il cui valore numerico che viene automaticamente incrementato di 1 ad intervalli di tempo regolari.
Poi vedremo come fare a definire questi intervalli di tempo. Per ora semplifichiamo dicendo che si incrementa ogni volta che il clock del sistema ha una transizione dallo stato logico basso a quello alto. Per intenderci quando passa da 0 a 1.
Il fatto che il valore si incrementi non deve essere gestito dal tuo programma, ma viene fatto automaticamente dall'hardware del controllore, indipendentemente da che cosa il tuo programma sta facendo.
Normalmente nei pic, questi timer sono a 8 o a 16 bit. Per ora supponiamo che il nostro timer sia a 8 bit pertanto il registro può assumere al massimo il valore 255. Quando raggiunge 255 e si incrementa di nuovo generando un overflow, scatta un interrupt (se noi lo abbiamo programmato perchè scatti).
cosa è un interrupt? Nello spiegare questo concetto mi attengo strettamente al mondo dei PIC e dei microcontrollori semplici. In un PC il concetto è decisamente più complesso.
Un interrupt è un particolare evento (con nel nostro caso l'overflow del timer) che fa sì che il tuo programma che sta girando si interrompa (da qui "interrupt") e vada ad eseguire una particolare funzione che tu avrai definito.
Facciamo un esempio.
Hai un pic che sta disegnando un'immagine in costante movimento su un display LCD.
Per mezzo di una tastiera anch'essa collegata al PIC hai modo di cambiare lo sfondo dell'immagine.
Se dovessimo gestire la pressione dei tasti dal programma, dovremmo ogni $x$ millisecondi andare a controllare se un tasto è stato premuto e apportare il cambio del colore di sfondo. Questo comporta il rischio che il pulsante venga premuto tra un controllo e l'altro e che quindi il programma non se ne accorga.
questo metodo porta via risorse al PIC che deve costantemente "ricordarsi" di andare a vedere se un tasto è stato premuto.
Se invece la pressione di un tasto genera un interrupt, la cosa si semplifica.
Il programma gestisce tranquillamente l'immagine; se un tasto viene premuto, il programma va automaticamente in pausa, viene eseguita la funzione interrupt che gestisce il cambio del colore di sfondo, e poi il programma riparte automaticamente.
In questo modo non si perde alcuna pressione di tasti.
Spero di averlo spiegato bene.
Se non ti fosse chiaro contattami in privato, ti do il mio contatto skype e te lo spiego a voce. Sarebbe più facile.
se ti è tutto chiaro iniziamo con il programma ok?
si è tutto chiaro!!!!!!!adesso ho capito, prima no; come dicevo su wikipedia erano molti concetti legati a una singola cosa...