de plus je dirais que ca ne viens pas de mon programmateur car j'ai mis ton hex directement sans aucune option ...
bonne soirée,
cordialement,
bypbop
-----
de plus je dirais que ca ne viens pas de mon programmateur car j'ai mis ton hex directement sans aucune option ...
bonne soirée,
cordialement,
bypbop
Hi Bypbop ,
c'est cool ;O]
et tu arrives bien à compiler le projet?
et oui, les fusibles ne créent pas de problème finalement (g testé)...
tiens nous au jus et...
bonn'journée ;O]
vede
;O]
ps : pour la sonde... j'avais utilisé la librairie "1Wire" de MikroE...
et c'était avec un MAX233...pour une com. RS232...
si mes souvenirs sont bons...
n'hésites pas si question...
Bonjour vede,
Ptite question a quoi sert la resistance de 4.7k entre la borne vdd et la sortie de ta sonde de temperature sur ton montage avec le MAX233.
Cordialement,
bypbop
Bonsoir Bypbop,
elle sert de "pull-up" de la ligne data...
et c'est le schéma "type/de base" proposé
dans la datasheet du DS18B20...
vede
;O]
ok j'ajoute ca à mon montage et je te tiens au courant
sinon j'ai rajouté un 3 connecteurs cnx avec un jumper qui permette d'alimenter le montage soit via l'alimentation secteur soit par l'alimentation usb ... pratique
Cordialement,
bypbop
ok, tiens nous au jus ;O]
je vais le faire (remplacer le MAX233 par de l'USB pour la DS18B20)...
mais là, je suis trop poccupé;O]
pour me "jeter/lancer" dans l'USB ;O]
et oui, c'est "bien pratique" le +5VDC de l'USB ;O]
bonn'soirée,
vede
;O]
Bonjour vede
quel version tu utilises de mikroC ... moi 3.2 et j'avais installé ca aussi MCHPFSUSB v2.2
car j'ai toujours une erreur de main qui fait que ne veut pas compiler avec mon code ...
Cordialement,0 1 mikroCPIC1618.exe -MSF -DBG -pP18F4550 -DL -O11101114 -fo48 -N"C:\Documents and Settings\Administrateur.SCULFO RT.000\Bureau\testusb\usb.mcpp i" -SP"C:\Program Files\Mikroelektronika\mikroC PRO for PIC\defs\" -SP"C:\Program Files\Mikroelektronika\mikroC PRO for PIC\uses\P18\" -SP"C:\Documents and Settings\Administrateur.SCULFO RT.000\Bureau\testusb\" "USBdsc.c" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl"
0 1138 Available RAM: 2027 [bytes], Available ROM: 32768 [bytes]
0 126 All files Preprocessed in 16 ms
0 122 Compilation Started vars.h
206 123 Compiled Successfully USBdsc.c
0 127 All files Compiled in 125 ms
0 357 main function is not defined main function is not defined
0 102 Finished (with errors): 15 janv. 2010, 11:20:15 usb.mcppi
bypbop
Bonjour Bypbop,
toujours la même erreur... ça me l'a fait hier soir...
toujours pareils... tenter en bidouillant le code...
(supprimer le main, compiler, le remettre, ...)
et oui j'utilise MikroC Pro 3.2, comme toi...
et j'ai aussi installé MCHPFSUSB...
mais je m'en sers pas...
encore...
vede
;O]
ok j'ai compris chez moi ca ne veut pas passer qd je fais une copie du void main() en recopiant le code je comprends pas prk .. enfin bref ca compile sans aucune erreur mais tjrs aucune avec mon code ...
je ne vois pas ou je fais une erreur .
Est ce que je peux te faire un zip de mon projet ? je dois avoir une erreur mais ou ???
Cordialement,
bypbop
aucune detection dslé
non vede mon projet se compile bien maintenant j'ai compris mon erreur avec le void main mais qd je charge mon hex je n'ai aucune detection au niveau de l'usb je voulais dire tandis qu'avec ton fichier .hex ca fonctionne sans probleme.
Cordialement,
bypbop
re ;O]
dans les fusibles, dans ton projet, je vois
USB Voltage Regulator = Disabled
moi je l'ai mis sur "Enabled" dans mon ".hex"...
c'est peut-être ça?...
vede
;O]
effectivement c bien ca encore merci vede.
tout fonctionne correctement chez moi maintenant
il y a une notion que j'ai compris à moitié avec le TRIS.
j'ai compris que cette fonction sert à mettre les differents ports du pic en entrées et en sorties mais je ne comprends pas ce comment on obtient la valeur à mettre dedans.
Par exemple si je veux mettre la port D6 en sortie je dois faire :
TRISD = ....... comment avoir la valeur ?
Cordialement,
bypbop
re ;O]effectivement c bien ca encore merci vede.
tout fonctionne correctement chez moi maintenant
il y a une notion que j'ai compris à moitié avec le TRIS.
j'ai compris que cette fonction sert à mettre les differents ports du pic en entrées et en sorties mais je ne comprends pas ce comment on obtient la valeur à mettre dedans.
Par exemple si je veux mettre la port D6 en sortie je dois faire :
TRISD = ....... comment avoir la valeur ?
Cordialement,
bypbop
super ;O]
moi pour initialiser les directions des ports j'ai tendance
à utiliser la notation binaire, ou chaque bit correspond
à un des numéro du port...
exemple en MB, je sais pas comment on signifie qu'un nombre est codé en binaire en MC, en MB, on met % devant...ça donne ça :
TRISD = %01000000
//met D6 en entrée, tous les autres (D0 à D5, et D7) en sorties...
sinon tu peux aussi convertir le binaire en décimal (grâce à la calculette
de windows en mode scientifique par exemple),
ça donne :
TRISD = 64
//met D6 en entrée, tous les autres (D0 à D5, et D7) en sorties...
vede
;O]
Bonjour vede,
donc si je comprends bien par ex : si je veux d0 et d6 en entrées je dois faire :
si je veux affecter la valeur d'un port en entrée à une variable je dois faire :trisd = %01000001;
temp = portd.b6;
cordialement;
bypbop
Bonjour vede,
j'avance un petit peu aujourd'hui sur mon projet alors j'ai ajouté certaine chose au code de base premièrement j'allume la led sur le port b4 et j'envoie une autre variable par usb pour la temperature j'ai une valeur mais pas la bonne ... tu verras j'ai commenté pas mal de chose qui n'influence pas le montage ...
ps : qd je decommente temperature=10; ca m envoie bien 10 dans hid terminal
En faisant ca j'obtiens 35 en boucle dans le hid terminal j espere avoir correctement calbé la sonde ...unsigned short m, k;
char temperature;
unsigned short userRD_buffer[1];
unsigned short userWR_buffer[1];
void interrupt() {
asm CALL _Hid_InterruptProc
asm nop
}
void Init_Main() {
// Disable all interrupts
// Disable GIE, PEIE, TMR0IE, INT0IE,RBIE
//INTCON = 0;
//INTCON2 = 0xF5;
//INTCON3 = 0xC0;
// Disable Priority Levels on interrupts
//RCON.IPEN = 0;
//PIE1 = 0;
//PIE2 = 0;
//PIR1 = 0;
//PIR2 = 0;
// Configure all ports with analog function as digital
//ADCON1 |= 0x0F;
// Ports Configuration
//TRISA = 0;
//TRISB = 0;
//TRISC = 0xFF;
TRISD = 00100000;
//TRISE = 0;
//LATA = 0;
//LATB = 0;
//LATC = 0;
//LATD = 0;
//LATE = 0;
}
void main() {
portd.b4=1;
Init_Main();
Hid_Enable(&userRD_buffer, &userWR_buffer);
do {
for (k = 0; k < 255; k++) {
temperature = PORTD.B5;
//temperature = 10;
// Prepare send buffer
userWR_buffer[0] = k;
userWR_buffer[1] = temperature;
// Send the number via USB
while(!Hid_Write(&userWR_buffe r[1], 1));
delay_ms(1000); // une ch'tite temporisation ;O]
}
}
while (1);
Hid_Disable();
}
je mets en pièce jointe le cablage pour voir si c 'est correct . La sonde est en vue de face (ecriture en face).
Cordialement,
bypbop
Bonsoir Bypbop,
en effet, ça fonctionnera jamais tel quel ;O]
Le câblage est bon...
C'est niveau logiciel... la temperature n'est
pas directement lisible sur le port... elle utilise
un protocole de communication (comme RS232,
USB... mais qui s'appelle "One Wire")...
dans mon projet, j'utilise la librairie fournie par
MikroE pour gérer ce protocole... comme je fait
d'ailleurs pour RS232, USB... pas IIC que j'ai émulé...
il faut donc que tu te penches sur la doc
(librairie One Wire de MikroC) et mon
exemple de code avec la DS18B20...
pour récupérer la température ;O]
enfin je suis là...
donc t'inquiétes...
on va plier ça rapidement ;O]
vede
;O]
ps : la datasheet de la sonde est aussi trés interessante....
tu vas voir comment certains se prennent la tête pour
stocker une temperature ;O] ....
re ;O]
en effet, il faut que tu commences pas
l'aide de MikroC sur la librairie One Wire
(Help > Hard Libraries > One Wire)...
ya un exemple (DS18x2x) et le schéma de base...
delà tu regardes mon code :
http://vede.free.fr/electronique/ds1...s232/ds232.rar
(en MB, mais c'est kif kif...)
et la datasheet :
http://www.maxim-ic.com/quick_view2.cfm?qv_pk=2812
et tu devrais avancer...
n'hésites pas si question,
vede
;O]
ps : il faut utiliser les "fonctions" One_Wire_Reset(), One_Wire_Write()...etc...
re ps : ce monologue est un complément d'informations...
Dernière modification par gienas ; 22/01/2010 à 14h20. Motif: Fusion de deux réponses consécutives
Bonjour vede,
ahh ok je pensais qu'on avait directement la temperature
ok je regarde ca et te tiens au courant ...
Cordialement,
bypbop
Bonsoir Bypbop,
bon je t'ai extrait la partie de code MB fonctionnelle
pour communiquer avec une sonde DS18B20...
et t'es allé voir mes 2 posts?
http://forums.futura-sciences.com/el...ee-2010-a.html
http://forums.futura-sciences.com/el...picoeoeoe.html
aprés faut "décoder" les 2 octets oct1 et oct2,Code:' initialisation sonde ow_reset(PORTA, 4) ' onewire reset ow_write(PORTA, 4, $CC) ' command to DS1820 ow_write(PORTA, 4, $4E) ' demande envoi 3 bits de config. ($4E) ow_write(PORTA, 4, $65) ' envoi TH ow_write(PORTA, 4, $81) ' envoi TL ow_write(PORTA, 4, $0) ' demande résolution t. sur 9 bits ow_reset(PORTA, 4) ' onewire reset ow_write(PORTA, 4, $CC) ' command to DS1820 ow_write(PORTA, 4, $48) ' copy scratchpad ($48) ' programme en boucle de lecture ' et d'affichage de la température while true ow_reset(PORTA, 4) ' onewire reset ow_write(PORTA, 4, $CC) ' command to DS1820 ow_write(PORTA, 4, $44) ' demande convertissage température ($44) delay_us(100) ow_reset(PORTA, 4) ' onewire reset ow_write(PORTA, 4, $CC) ' command to DS1820 ow_write(PORTA, 4, $BE) ' demande lecture température ($BE) oct1 = ow_read(PORTA, 4) ' lit 1 er octet du scratchpad oct2 = ow_read(PORTA, 4) ' lit 2 éme octet du scratchpad 'décodage et affichage... TODO... wend
pour en "extraire" la température...
je t'envois le code dans un prochain post...
et n'hésites pas si question,
vede
;O]
Re Vede, donc pour l'initialisation de la sonde qui pour moi est sur le port D 5 je dois faire ca ...
Cordialement,ow_reset(PORTD.B5, 4) ' onewire reset
ow_write(PORTD.B5, $CC) ' command to DS1820
ow_write(PORTD.B5, $4E) ' demande envoi 3 bits de config. ($4E)
ow_write(PORTD.B5, $65) ' envoi TH
ow_write(PORTD.B5, $81) ' envoi TL
ow_write(PORTD.B5, $0) ' demande résolution t. sur 9 bits
ow_reset(PORTD.B5) ' onewire reset
ow_write(PORTD.B5, $CC) ' command to DS1820
ow_write(PORTD.B5, $48)
bypbop
re ;O]
non, plutôt comme ça (extrait de l'exemple de l'aide de MC)
cad :Code:Ow_Reset(&PORTD, 5); // Onewire reset signal Ow_Write(&PORTD, 5, 0xCC); // Issue command SKIP_ROM Ow_Write(&PORTD, 5, 0x44); // Issue command CONVERT_ ....
Ow_fonction( &PORT, PIN, COMMANDE);
vede
;O]
Bonjour vede,
voila j'ai integré le code micro de l exemple avec la sonde c'est bon j'ai une valeur qui varie bien dès que je touche la sonde mais apparement il faut faire un calcul pour avoir la temperature et ca je ne comprends pas moi j'ai cette valeur
a quoi correspond cette valeur ?122, 133, 144 ...
Cordialement,Ow_Reset(&PORTD, 5);
Ow_Write(&PORTD, 5, 0xCC);
Ow_Write(&PORTD, 5, 0x44);
Delay_us(120);
Ow_Reset(&PORTD, 5);
Ow_Write(&PORTD, 5, 0xCC);
Ow_Write(&PORTD, 5, 0xBE);
temperature = Ow_Read(&PORTD, 5);
temperature = (Ow_Read(&PORTD, 5) << 8) + temperature;
bypbop
Dernière modification par bypbop ; 20/01/2010 à 11h23.
Re vede,
J'avais acheter cette photo resistance dans le but de l'ajouter sur mon montage maintenant que la sonde fonctionne a peu près je vais l'ajouter
photo resistance : http://fr.farnell.com/jsp/search/pro...sp?SKU=1652638
je n'ai pas sous la main de resistance variable de toute facon je veux juste recuperer la valeur de la photoresistance sur mon pic.
comment puis je faire ?
Cordialement,
bypbop
Bonjour Bypbop,
pour la sonde je t'envoie un code plus tard (avant ce soir)...
pour récupérer la valeur de la LDR (photo-résistance),
il faut la connecter à une entrée analogique du PIC, au
travers d'un pont de résistance, et tu auras une tension
lue +/- proportionnelle à la luminosité...
exemple :
.........entrée analogique
...................||
...................||
+5v -- LDR -- || -- R10K -- Ov
et là tu auras une tension sur l'entrée proportionnelle à
la résistance de la LDR, cad à la luminosité ambiante...
vede
;O]
ps : le code pour la sonde, qui fonctionne de 0 à 125°C
v ;O]Code:(...) oct1 = Ow_Read(&PORTD, 5); oct2 = Ow_Read(&PORTD, 5); oct1 = oct1 >> 4 oct2 = oct2 << 4 temperature = oct1 + oct2
re ps :
et pour la LDR, un exemple d'utilisation d'une entrée analogique avec un 16F88 :
http://vede.free.fr/electronique/16f88/can/
et de la doc sur l'utilisation et la configuration de l'ADC sur un 16F88 :
http://pagesperso-orange.fr/fabrice..../ADC_16F88.htm
et tu trouveras dans l'aide de MikroC, dans les librairies,
un exemple d'utilisation de ADC_Read()...
v;O]
Dernière modification par gienas ; 22/01/2010 à 14h22. Motif: Fusion de trois réponses consécutives
Re vede encore merci pour tes precieux conseils
pour l'exemple je comprends mieux
donc de + 5v à la photoresistance
de la photoresistance à une resistance de 10ko et à la masse
entre la photoresistance je vais à une entrée de mon pic 18f4550 marqué
AN je suppose ... AN0 ou AN1 par exemple
Cordialement,
bypbop
re ;O]Re vede encore merci pour tes precieux conseils
pour l'exemple je comprends mieux
donc de + 5v à la photoresistance
de la photoresistance à une resistance de 10ko et à la masse
entre la photoresistance je vais à une entrée de mon pic 18f4550 marqué
AN je suppose ... AN0 ou AN1 par exemple
Cordialement,
bypbop
oui c'est ça ...
entre la résistance et la LDR tu "vas" à l'entrée ADC...
en fait je vais te donner petit un exemple :
-mesurer avec un multimètre la résistance de la LDR
dans la lumière ambiante d'utilisation prévue...
-prendre une R fixe avec une valeur la plus proche de la R-LDR...
-delà en câblant ça sur le principe d'un pont diviseur
de tension à 2 résistance, tu trouveras :
-environ 2,5Volts sur l'entrée AN en lumière ambiante
(vu que c'est un ADC 10 bits, une valeur d'environ 512)
-plus la luminosité augmentera, plus la tension augmentera...
(entre 2,5 et 5V... soit entre 512 et 1024, niveau résultat ADC)
-plus la luminosité diminuera, plus la tension diminuera...
(entre 2,5 et 0V... soit entre 512 et 0, niveau résultat ADC)
(ou inversement selon "la place" de la LDR...rapport à la Masse...)...
vede
;O]
ps : pour les calculs, adaptations, étalonnage,
il faut voir le bloc (R fixe + R-LDR) comme une
R fixe placée en série avec un potard...
cad un diviseur de tension... plus une résistance fixe "talon"...
re-ps : et avant il faut initialiser l'ADC...
et sélectionner le port ADC à utiliser...
re-re-ps : la "courbe" d'une LDR est rarement linéaire...
Bonjour vede,
Pour la temperature ca fonctionne nikel par contre pour l'intensité lumineuse c'est autre chose . Pour le cablage j'ai bien une variation sur la sortie qui va au pic en fonction de la luminosité donc le cablage est bon.
pour le code j'ai fait ca :
j'utilise la borne 2 de mon pic RA0unsigned short m, k, temperature, oct1, oct2, lumiere;
unsigned short userRD_buffer[1];
unsigned short userWR_buffer[1];
void interrupt() {
asm CALL _Hid_InterruptProc
asm nop
}
void Init_Main() {
// Disable all interrupts
// Disable GIE, PEIE, TMR0IE, INT0IE,RBIE
//INTCON = 0;
//INTCON2 = 0xF5;
//INTCON3 = 0xC0;
// Disable Priority Levels on interrupts
//RCON.IPEN = 0;
//PIE1 = 0;
//PIE2 = 0;
//PIR1 = 0;
//PIR2 = 0;
// Configure all ports with analog function as digital
//ADCON1 |= 0x0F;
// Ports Configuration
TRISA = 000001;
TRISB = 0;
TRISC = 0xFF;
TRISD = 00100000;
TRISE = 0;
//LATA = 0;
//LATB = 0;
//LATC = 0;
//LATD = 0;
//LATE = 0;
}
void main() {
Init_Main();
portd.b4=1;
Hid_Enable(&userRD_buffer, &userWR_buffer);
do {
for (k = 0; k < 255; k++) {
Ow_Reset(&PORTD, 5);
Ow_Write(&PORTD, 5, 0xCC);
Ow_Write(&PORTD, 5, 0x44);
Delay_us(120);
Ow_Reset(&PORTD, 5);
Ow_Write(&PORTD, 5, 0xCC);
Ow_Write(&PORTD, 5, 0xBE);
oct1 = Ow_Read(&PORTD, 5);
oct2 = Ow_Read(&PORTD, 5);
oct1 = oct1 >> 4 ;
oct2 = oct2 << 4 ;
temperature = oct1 + oct2 ;
lumiere = PORTA.B0;
// Prepare send buffer
userWR_buffer[0] = k;
userWR_buffer[1] = temperature;
userWR_buffer[2] = lumiere;
// Send the number via USB
while(!Hid_Write(&userWR_buffe r[1], 1));
delay_ms(1000); // une ch'tite temporisation ;O]
}
}
while (1);
Hid_Disable();
}
sinon pour la temperature ca marche d'enfer
petite question A quoi correspond ce 1 ??while(!Hid_Write(&userWR_buffe r[1], 1));
delay_ms(1000); // une ch'tite temporisation ;O]
}
Comment puis je faire pour envoyer plusieurs valeur en mm tps ??
Hid_Write(&userWR_buffer[1], 1);
Hid_Write(&userWR_buffer[2], 1);
Hid_Write(&userWR_buffer[3], 1);
Cordialement
Bonsoir Bypbop,
cool ;O] pour la température ;O]
bon sinon, ça ça fonctionnera pas :
lumiere = PORTA.B0
pas directement, c'est "un peu" comme la sonde...
il faut commencer par initialiser le convertisseur,
puis sélectionner le canal, puis lancer une conversion,
puis attendre la fin, puis attendre un peu (100µs)
avant d'en re-lancer une (de conversion...)...
sinon, ce cours
http://pagesperso-orange.fr/fabrice..../ADC_16F88.htm
malgrés que ce soit pour un 16F88,
donne une trés bonne explication du fonctionnement
général de l'ADC des PICs, quel que soit le type de PIC (16F, 18F)...
c'est "toujours" via les registres :
-ADCON et/ou
-ADCON0 et/ou
-ADCON1 et/ou
-ANSEL et/ou
puis la valeur (10 bits) dans
-ADRESL
-ADRESH
et aussi des infos dans l'aide de MikroC (Help > Librairies > ADC)
(si tu utilises cette librairie même plus besoin de t'emmer..r avec
les registres concérnés ;O])
ça fait longtemps que j'ai pas utilisé l'ADC du 4550...
mais je vais regarder, te tiens au jus d'ici demain soir...
sinon après, je sais pas exactement, pour le buffer USB...
ni pour envoyer des variables "en même temps"...
faudrait aller voir sur le Forum MikroE...
vede
;O]
re ;O]
au niveau du code:
c'est par là qu'il va falloir dé-commenter/ajouter des lignes
pour pouvoir utiliser le convertisseur :
// Configure all ports with analog function as digital
//ADCON1 |= 0x0F;
et là ça va pas,
// Ports Configuration
TRISA = 000001;
TRISB = 0;
TRISC = 0xFF;
TRISD = 00100000;
TRISE = 0;
pour A et D, il faut mettre
TRISA = 0b00000001;
TRISD = 0b00100000;
cad un "0b" devant, pour signifier au compilo que c'est en notation binaire...
car sinon A et D = 00000001...
vede
;O]
Dernière modification par gienas ; 22/01/2010 à 14h25. Motif: Fusion de deux réponses voisines inutilement rapprochées