Dueville (VI)
Online
Edison Member
Karma: 15
Posts: 1050
http://cesarecacitti.wordpress.com/
|
 |
« on: November 18, 2012, 02:19:35 pm » |
Adesso non uccidetemi: so che questo è il forum di arduino ma io ho un problema con i PIC  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: 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
Brattain Member
Karma: 161
Posts: 15680
+39 349 2158303
|
 |
« Reply #1 on: November 18, 2012, 06:16:01 pm » |
aha Ciedi a un Forum dove usano Microcontroller ATMEL del aiuto per un Microcontroller Micochip. Interessante.  Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3001
|
 |
« Reply #2 on: November 18, 2012, 06:27:21 pm » |
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
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Torino
Offline
God Member
Karma: 2
Posts: 720
|
 |
« Reply #3 on: November 19, 2012, 12:53:37 am » |
Dov'è che conti 5 secondi? Sei sicuro che l'adc abbia il valore massimo a 1024? +1
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 16
Posts: 1799
|
 |
« Reply #4 on: November 19, 2012, 05:05:21 am » |
aha Ciedi a un Forum dove usano Microcontroller ATMEL del aiuto per un Microcontroller Micochip. Interessante.  Ciao Uwe +1 almeno dici che vuoi far comunicare un pic con un atmega 
|
|
|
|
|
Logged
|
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein
|
|
|
|
Dueville (VI)
Online
Edison Member
Karma: 15
Posts: 1050
http://cesarecacitti.wordpress.com/
|
 |
« Reply #5 on: November 19, 2012, 08:48:03 am » |
Grazie mille a tutti, in effetti non ho inserito nel codice la storia dei 5 secondi, ora riprovo  . 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 
|
|
|
|
|
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
Tesla Member
Karma: 74
Posts: 7348
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #6 on: November 19, 2012, 08:50:42 am » |
ora riprovo  . Ritenta sarai più fortunato  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
Edison Member
Karma: 15
Posts: 1050
http://cesarecacitti.wordpress.com/
|
 |
« Reply #7 on: November 19, 2012, 09:18:36 am » |
ora riprovo  . Ritenta sarai più fortunato  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 
|
|
|
|
|
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
Tesla Member
Karma: 74
Posts: 7348
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #8 on: November 19, 2012, 09:23:02 am » |
Che fai cominci a parlare il "Lestese", guarda che poi vi capite solo tu e Lesto 
|
|
|
|
|
Logged
|
|
|
|
|
0
Online
Tesla Member
Karma: 82
Posts: 8201
:(){:|:&};:
|
 |
« Reply #9 on: November 19, 2012, 09:43:35 am » |
w la dislessia che tutte le lettere si porta via!
oppure
life is too short to use the spell-checker
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 16
Posts: 1799
|
 |
« Reply #10 on: November 19, 2012, 10:56:02 am » |
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 
|
|
|
|
|
Logged
|
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 34
|
 |
« Reply #11 on: November 19, 2012, 01:01:49 pm » |
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
Edison Member
Karma: 15
Posts: 1050
http://cesarecacitti.wordpress.com/
|
 |
« Reply #12 on: November 19, 2012, 01:07:10 pm » |
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  , io, ad esempio, ho risolto in un altro modo. Ho risolto così: 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
Online
Tesla Member
Karma: 82
Posts: 8201
:(){:|:&};:
|
 |
« Reply #13 on: November 19, 2012, 02:13:06 pm » |
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
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 34
|
 |
« Reply #14 on: November 19, 2012, 04:11:40 pm » |
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  ... 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  Edit: la mia edizione è del 1984, quando ho iniziato a programmare
|
|
|
|
« Last Edit: November 19, 2012, 04:19:23 pm by hreplo »
|
Logged
|
|
|
|
|
|