Go Down

Topic: Aiuto con il C (Read 1 time) previous topic - next topic

cece99

Adesso non uccidetemi: so che questo è il forum di arduino ma io ho un problema con i PIC :D 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: [Select]

void main() {
trisb=0x00000000;
adc_init();



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


}
}
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

uwefed

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

PaoloP

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?

tonid

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

+1

Madwriter


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 ;)
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

cece99

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 :D
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

astrobeed


ora riprovo  :smiley-mr-green:.


Ritenta sarai più fortunato  :D
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.

cece99



ora riprovo  :smiley-mr-green:.


Ritenta sarai più fortunato  :D
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 :P :P :P :P :P
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

astrobeed


rispoto :P :P :P :P :P


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

lesto

w la dislessia che tutte le lettere si porta via!

oppure

life is too short to use the spell-checker
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Madwriter


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  :D
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

hreplo

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.

cece99


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 :D, io, ad esempio, ho risolto in un altro modo. Ho risolto così:
Code: [Select]
    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]
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

lesto


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..
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

hreplo

#14
Nov 19, 2012, 10:11 pm Last Edit: Nov 19, 2012, 10:19 pm by hreplo Reason: 1
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 XD...

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  :D :D :D :D

Edit: la mia edizione è del 1984, quando ho iniziato a programmare

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy