Pages: [1] 2   Go Down
Author Topic: Aiuto con il C  (Read 820 times)
0 Members and 1 Guest are viewing this topic.
Dueville (VI)
Online Online
Edison Member
*
Karma: 28
Posts: 1723
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Adesso non uccidetemi: so che questo è il forum di arduino ma io ho un problema con i PIC smiley-grin e visto che c'è gente preparata sottopongo comunque il mio quesito.
Praticamente devo vedere se mi arriva una tensione sull' ADC del pic e se arriva, accendere un led per 5 secondi. Sto lavorando con Mikro C Pro, questo è il codice, compila ma non funziona:
Code:
void main() {
 trisb=0x00000000;
adc_init();



while(1){
unsigned int val;
val = adc_read(0) * 5/1024;
if(val>3) portb.rb0=1;


}
}
Logged

Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield.
Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

aha
Ciedi a un Forum dove usano Microcontroller ATMEL del aiuto per un Microcontroller Micochip.
Interessante.     smiley-mr-green smiley-mr-green smiley-mr-green
Ciao Uwe
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6573
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Da quello che leggo, non sapendo come si programmi un PIC, hai settato una variabile (credo un registro) a zero.
Poi inizializzi l'adc. Fai un ciclo infinito con dentro una lettura analogica e se questa è maggiore di 3 setti ad 1 una porta.
2 cose:
Dov'è che conti 5 secondi?
Sei sicuro che l'adc abbia il valore massimo a 1024?
 
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Torino
Offline Offline
God Member
*****
Karma: 2
Posts: 753
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Dov'è che conti 5 secondi?
Sei sicuro che l'adc abbia il valore massimo a 1024?
+1
Logged

Offline Offline
Edison Member
*
Karma: 24
Posts: 2032
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

aha
Ciedi a un Forum dove usano Microcontroller ATMEL del aiuto per un Microcontroller Micochip.
Interessante.     smiley-mr-green smiley-mr-green smiley-mr-green
Ciao Uwe
+1
almeno dici che vuoi far comunicare un pic con un atmega smiley-wink
Logged

"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

Dueville (VI)
Online Online
Edison Member
*
Karma: 28
Posts: 1723
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie mille a tutti, in effetti non ho inserito nel codice la storia dei 5 secondi, ora riprovo  smiley-mr-green.
Scusate che ho chiesto su un forum di atmel ma è uno dei migliori che conosco (su grix ci mettono tantissimo a rispondere nella sezione pic). Per il codice mi ha aiutato un mio amico dandomi delle dritte e io ho assemblato il tutto cercando di usare un libro sui pic che avevo comprato tempo fa smiley-grin
Logged

Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield.
Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9186
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ora riprovo  smiley-mr-green.

Ritenta sarai più fortunato  smiley-grin
Sopratutto posta queste domande nello spamm bar visto che siamo più che mai OT con Arduino, se sei fortunato forse ti rispondo e ti dico perché non funziona.
Logged

Dueville (VI)
Online Online
Edison Member
*
Karma: 28
Posts: 1723
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ora riprovo  smiley-mr-green.

Ritenta sarai più fortunato  smiley-grin
Sopratutto posta queste domande nello spamm bar visto che siamo più che mai OT con Arduino, se sei fortunato forse ti rispondo e ti dico perché non funziona.
Astieniti pure visto che ho rispoto smiley-razz smiley-razz smiley-razz smiley-razz smiley-razz
Logged

Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield.
Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9186
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

rispoto smiley-razz smiley-razz smiley-razz smiley-razz smiley-razz

Che fai cominci a parlare il "Lestese", guarda che poi vi capite solo tu e Lesto  smiley-mr-green
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

w la dislessia che tutte le lettere si porta via!

oppure

life is too short to use the spell-checker
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Edison Member
*
Karma: 24
Posts: 2032
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

w la dislessia che tutte le lettere si porta via!

oppure

life is too short to use the spell-checker
io sapevo life is too short for safely remove  smiley-grin
Logged

"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

Offline Offline
Jr. Member
**
Karma: 1
Posts: 51
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

o usi virgola mobile o devi fare così:

long val ;
val = ((long)adc_read(0) * 5L)/1024L;

Il perchè fattelo pure spiegare da quelli che ti sfottono.
Logged

Dueville (VI)
Online Online
Edison Member
*
Karma: 28
Posts: 1723
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

o usi virgola mobile o devi fare così:

long val ;
val = ((long)adc_read(0) * 5L)/1024L;

Il perchè fattelo pure spiegare da quelli che ti sfottono.
Grazie per il tuo intervento pertinente smiley-grin, io, ad esempio, ho risolto in un altro modo. Ho risolto così:
Code:
    unsigned int val;
void main() {
 trisb=0x00000000;
adc_init();



while(1){
unsigned int val;
val = adc_read(0) *5 /1024;
if(val>3){
portb.rb0=1;
delay_ms(5000);
portb.rb0=0;
}

}
}
[code]
[/code]
Logged

Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield.
Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10105
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

o usi virgola mobile o devi fare così:

long val ;
val = ((long)adc_read(0) * 5L)/1024L;

Il perchè fattelo pure spiegare da quelli che ti sfottono.

non mi torna. al massimo  adc_read nrtitorna ritorna 1024(altrimenti sarebbe errato il divisore), e 1024*5=5120, il che sta tranquillissimamente in un int, o in un unsigned int.
A questo punto che la divisione avvenga tra long o int è inifluente, la precisione sarà sempre limitata a +-0.5V se il numero viene arrotondato, da 0V a -1V se il numero viene troncato (credo che si scriva +-0.5V -0.5V)

poi magari mi perdo io per strada qualche passaggio eh..
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 1
Posts: 51
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì, ti perdi qualche passaggio... tipo i fondamenti del C, la precedenza degli operatori, l'ordine di valutazione dell'espressione etc.

ho visto dopo che val era dichiarata UINT, e bastava, però ci sono PIC dove l'ADC è a 12bit smiley-lol...

tagliandola a fettine sottili, la divisione int 5/1024 in aritemetica intera torna valore 0 ed è valutata per prima (è a destra dell'espressione) quindi qualsiasi sia il valore letto da analogread viene moltiplicato x 0...

usando le parentesi, come ho scritto, viene prima moltiplicato il risultato dell'analogread*5 quindi diviso per 1024 e funzia

Consiglio a tutti di leggersi il K&R Linguaggio C(del 1974!!!) di cui conservo gelosamente copia originale  smiley-grin smiley-grin smiley-grin smiley-grin

Edit: la mia edizione è del 1984, quando ho iniziato a programmare
« Last Edit: November 19, 2012, 04:19:23 pm by hreplo » Logged

Pages: [1] 2   Go Up
Jump to: