Vizitator Mareshal Postat Mai 14, 2011 Partajează Postat Mai 14, 2011 Folosesc 18F2550 cu un DS18B20 conectat la PORTC.RC1, compilat cu MikroC for PIC , si Virtual Terminal in Proteus. Terminal-ul merge, restul nu prea. char t;int temp;void ds1820_read(){ Ow_Reset(&PORTC, 1); // 'Reset Ow_Write(&PORTC, 1, 0xCC);// 'Skip ROM Ow_Write(&PORTC, 1, 0x4E);// 'Write to scratchpad Ow_Write(&PORTC, 1, 0x55);// 'TH register value (85 degrees C) Ow_Write(&PORTC, 1, 0x19);// 'TL register value (25 degrees C) Ow_Write(&PORTC, 1, 0x7F);// 'Config register value (12bit) // 'Do temp conversion Ow_Reset(&PORTC, 1);// ' Reset Ow_Write(&PORTC, 1, 0xCC);// 'SKIP_ROM Ow_Write(&PORTC, 1, 0x44);// ' Issue command CONVERT_T Delay_us(120);// 'Read Temp Ow_Reset(&PORTC, 1); Ow_Write(&PORTC, 1, 0xCC);// 'SKIP_ROM Ow_Write(&PORTC, 1, 0xBE);// 'READ_SCRATCHPAD temp = Ow_Read(&PORTC, 1); temp = (Ow_Read(&PORTC, 1) << 8) + temp;}void main() { UART1_Init(9600); Delay_ms(100); UART1_Write_Text("DS18B20: "); TRISC = 0b00000010; while(1) { ds1820_read(); UART1_Write_Text(temp); UART1_Write('\r\n'); Delay_ms(300); }} Cineva o solutie? Am impresia ca e o greseala minora, dar nu stiu care e. Nici exemplul de la mikroC nu a mers. Link spre comentariu
Liviu M Postat Mai 15, 2011 Partajează Postat Mai 15, 2011 Cu RC1 iesire ai incercat? Link spre comentariu
Vizitator Mareshal Postat Mai 15, 2011 Partajează Postat Mai 15, 2011 Nimic. As vrea totusi sa primesc niste date rudimentare, dar sa vad ca primesc ceva. Link spre comentariu
picolo Postat Mai 15, 2011 Partajează Postat Mai 15, 2011 Gresesti la afisare temp.Tu incerci sa afisezi un integer cu UART1_Write_Text.Pentru test incearca asa:UART1_Write((temp>>4)%10 + '0');ar trebui sa vezi ultima cifra din temperatura. Link spre comentariu
Vizitator Mareshal Postat Mai 15, 2011 Partajează Postat Mai 15, 2011 Da, primesc doar 0-ul asta: UART1_Write((temp>>4)%10 + '0'); Link spre comentariu
picolo Postat Mai 15, 2011 Partajează Postat Mai 15, 2011 Intre intrarea DS si VCC ai pus o resistenta ? Link spre comentariu
Vizitator Mareshal Postat Mai 15, 2011 Partajează Postat Mai 15, 2011 Asta e schema: http://image.bayimg.com/baijeaadb.jpg Stai putin. Te referi la DQ si VCC ? Link spre comentariu
picolo Postat Mai 15, 2011 Partajează Postat Mai 15, 2011 Asta e schema: http://image.bayimg.com/baijeaadb.jpgStai putin. Te referi la DQ si VCC ?Da, DQ printr-o resistenta 10k la VCC. si MCLR tot la VCC, daca din soft nu l-ai declarat altfel. Link spre comentariu
Vizitator Mareshal Postat Mai 15, 2011 Partajează Postat Mai 15, 2011 Multumesc. Primesc balarii, dar se modifica in momentul in care modific temperatura. Sa vad ce ii pot face LE: cu bucata asta de cod sprintf(str, "%d", temp); UART1_Write_Text(str); Primesc 320, pentru 20. e ceva totusi. Still working... LELE: Merge acum. O sa postez tot codul si schema, dar sa il aranjez putin doar. Link spre comentariu
Vizitator Mareshal Postat Mai 15, 2011 Partajează Postat Mai 15, 2011 Cod complet: PIC18F2550(8 Mhz) + DS18B20 & Virtual Terminal Proteus, mikroC for PIC PS: codul se putea aranja si mai bine, poate fi optimizat, dar mai tarziu int temp;void ds1820_read(){ Ow_Reset(&PORTC, 1); // Reset Ow_Write(&PORTC, 1, 0xCC); // Skip ROM Ow_Write(&PORTC, 1, 0x4E); // Write to scratchpad Ow_Write(&PORTC, 1, 0x55); // TH register value (85 degrees C) Ow_Write(&PORTC, 1, 0x19); // TL register value (25 degrees C) Ow_Write(&PORTC, 1, 0x7F); // Config register value (12bit) // Temperature conversion Ow_Reset(&PORTC, 1); // Reset Ow_Write(&PORTC, 1, 0xCC); // SKIP_ROM Ow_Write(&PORTC, 1, 0x44); // Issue command CONVERT_T Delay_us(120); // Read Temperature Ow_Reset(&PORTC, 1); Ow_Write(&PORTC, 1, 0xCC); // SKIP_ROM Ow_Write(&PORTC, 1, 0xBE); // READ_SCRATCHPAD temp = Ow_Read(&PORTC, 1); temp = (Ow_Read(&PORTC, 1) << 8) + temp;}const unsigned short TEMP_RESOLUTION = 12; // 12 for DS18B20char *text = "000.0000";void Transform_temperature(unsigned int temp2write) { const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8; char temp_whole; unsigned int temp_fraction; // Check if temperature is negative if (temp2write & 0x8000) { text[0] = '-'; temp2write = ~temp2write + 1; } // Extract temp_whole temp_whole = temp2write >> RES_SHIFT ; text[1] = (temp_whole/10)%10 + 48; // Extract tens digit text[2] = temp_whole%10 + 48; // Extract ones digit // Extract temp_fraction and convert it to unsigned int temp_fraction = temp2write << (4-RES_SHIFT); temp_fraction &= 0x000F; temp_fraction *= 625; // Convert temp_fraction to characters text[4] = temp_fraction/1000 + 48; // Extract thousands digit text[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit text[6] = (temp_fraction/10)%10 + 48; // Extract tens digit text[7] = temp_fraction%10 + 48; // Extract ones digit temp = text;}void main() { UART1_Init(9600); Delay_ms(100); UART1_Write_Text("DS18B20: "); TRISC = 0b00000010; while(1) { ds1820_read(); Transform_temperature(temp); UART1_Write_text(temp); UART1_Write('\r\n'); Delay_ms(500); }} Schema conectare Proteus Link spre comentariu
MatyC Postat Mai 16, 2011 Partajează Postat Mai 16, 2011 In functia void ds1820_read() observ ca intre comanda Convert T (0x44) si Read Scrachpad (0xBE) ai lasat doar 120uS. Eu din cate stiu dupa comanda de conversie a temperaturi abia dupa 95-750 mS trebuie citit scrachpadul. Din codul prezentat nu m-as baza pe temperatura masurata. Link spre comentariu
Vizitator Mareshal Postat Mai 16, 2011 Partajează Postat Mai 16, 2011 Asa arata in exemplul lor: http://www.mikroe.com/esupport/index.ph ... icleid=140 Link spre comentariu
MatyC Postat Mai 16, 2011 Partajează Postat Mai 16, 2011 Asa arata in exemplul lor: http://www.mikroe.com/esupport/index.ph ... icleid=140Din datasheet-ul senzorului DS18x20 stiu ca dupa comanda de conversie a temperaturi senzorul trebuie lasat in pace timpul necesar (95ms-750ms). Abia dupa tconv trimiti comanda de Read Scrachpad si citesti cei 9 octeti din scrachpad. In exemplul ala nu vad rostul la Delay_ms(500) la finalul operatiei de transformare a informatiilor. Eu consider gresit exemplul, inlocuieste Delay_us(120) cu Delay_ms(500).La 1 Wire pinul de date se conecteaza cu un rezistor de 4k7 la VDD. Asa cere protocolul.LE. Aici foloseste 750ms si tot microC foloseste http://www.edaboard.com/thread148568.html#post637618 Link spre comentariu
Vizitator Mareshal Postat Mai 17, 2011 Partajează Postat Mai 17, 2011 Ok, am corectat. intr-adevar, primele 3 valori care le citeam erau eronate, primeam valoarea maxima a senzorului, adica 85 de grade. Link spre comentariu
10vid Postat Iunie 13, 2011 Partajează Postat Iunie 13, 2011 Pentru un fir lung 10k ar putea fi prea mare. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum