Vizitator ighdaniel Postat Mai 31, 2006 Partajează Postat Mai 31, 2006 Buna, Daca se poate sa ma ajutati si pe mine cu ceva! Am realizat montajul unui termometru digital http://chaokhun.kmitl.ac.th/~kswichit/a ... hermo.html cu o singura modificare, am folosit senzor de temperatura DS18B20 in loc de DS1820, si microcontroler Tiny2313 in loc de AT90s2313. Acum problema mea e ca pe afisaj imi arata in permanenta -5 C, am masurat si cu osciloscopul si se pare ca nu citeste senzorul! Am modificat si programul ca sa il adaptez la Tiny2313 (sper ca am modificat bine, era doar un header si un registru ce nu corespundeau), dar poate are si alte erori. Imi puteti spune va rog de ce nu merge!!! Nu ma pricep prea bine, e primul meu proiect cu microcontrolere si e pt faculta! Merci mult de tot si astept un raspuns cat mai curand pt ca sunt in criza de timp! Am atasat si programul, si il pun si aici: /************************************** thermo.c Digital Thermometer -55C to +125C AVR 90S2313 & DS1820 Copyright 2001 by Wichit Sirichote **************************************/ #include #include #include // 1 Wire Bus functions #asm .equ __w1_port=0x12 .equ __w1_bit=6 #endasm #include <1wire.h> // DS1820 temperature sensor functions #include // Declare your global variables here unsigned char tick,digit; unsigned char heat[4]; unsigned int xtimer1; int temp,T,X1,X2,X3,X4,X5; // signed number for negative and positve temperature manipulating char key; unsigned char convert[10] = {0x3F,0x06,0xdb,0xcf,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; #define segment PORTB #define LED_digit PORTD // converts 16-bit data in T to display buffer for both negative and positive reading void heatToBuffer() { if(T<0){ heat[3] = 0x40; // if negative, put - heat[0] = 0x39; // C T = abs(T); // get only amplitude heat[1] = convert[T%10]; heat[2] = convert[T/10]; if (heat[2] == 0x3f) heat[2] = 0; // off msd } else { heat[0] = 0x39; // C heat[3] = convert[T/100]; temp = T%100; heat[1] = convert[temp%10]; heat[2] = convert[temp/10]; // off msd if (heat[3] == 0x3f) { heat[3] = 0; if(heat[2] == 0x3f) heat[2] = 0; } } } LPF() // performs five-point moving average { X5=X4; X4=X3; X3=X2; X2=X1; X1= T; T = (X1+X2+X3+X4+X5)/5; } read_temp() { if(++xtimer1 >=5) { xtimer1 = 0; segment = 0xff; T = ds1820_temperature_10(0)/10; // read DS1820 every 5 sec. LPF(); // enter filter heatToBuffer(); // convert it } } // Timer 0 overflow interrupt service routine // timer interrupt every 1/15 sec provides foreground task to be run periodically. interrupt [TIM0_OVF] void timer0_ovf_isr(void) { switch (++tick){ case 15: tick = 0; read_temp(); //second_task(); } } void scanLED() /* scan 4-digit LED and 4-key switch, if key pressed key = 0-3 else key = -1 */ // adapted from 89C2051 project if needs scan key, find one bit input port { char i; digit = 0x20; key = -1; for( i = 0; i < 4; i++) /* 4-DIGIT scanning */ { LED_digit = ~digit; /* send complement[digit] */ segment = ~heat; /* send complement[segment] */ delay_ms(1); /* delay a while */ segment = 0xff; /* off LED */ // if ((PORTD & 0x10) == 0) /* if key pressed P3.4 became low */ // key = i; /* save key position to key variable */ digit>>=1; /* next digit */ } } void main(void) { DDRB=0xFF; PORTB=0x00; DDRD=0x7F; PORTD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 3.906 kHz // Mode: Output Compare // OC0 output: Disconnected TCCR0B=0x05; TCNT0=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x02; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // 1 Wire Bus initialization w1_init(); // Global enable interrupts #asm("sei") // 1 Wire Bus initialization w1_init(); T = 34; heatToBuffer(); while (1) { scanLED(); // run background task forever } } Link spre comentariu
Vizitator yoco Postat Mai 31, 2006 Partajează Postat Mai 31, 2006 pai ia si tu pdf de la ambii senzori si o sa vezi ca nu corespund ca si protocol folosit la transimiterea datelor si nici conversia temperaturii...cel putin atat pot zice asa la prima vedere... Link spre comentariu
Vizitator ighdaniel Postat Mai 31, 2006 Partajează Postat Mai 31, 2006 Si ce pot face?! Ma poti ajuta te rog sa modific programul?! Nu ma pricep si nici nu mai am timpul necesar sa invat...am un deadline pt proiect in cateva zile si mai si alte examene in curs! Poti te rog sa te uiti peste program! merci mult de tot Link spre comentariu
Vizitator DragosP Postat Iunie 1, 2006 Partajează Postat Iunie 1, 2006 Si ce pot face?!1.Poţi să montezi senzorul din proiectul original.2.Poţi să faci modificarea softului singur.3.Poţi să te abţii de la a spune că n-ai timp, bănuiesc că nimeni n-are...4.Poţi să... Link spre comentariu
Filipone Postat Iunie 1, 2006 Partajează Postat Iunie 1, 2006 Si ce pot face?! Daca te apuci sa faci singur softul uite ce am gasit rapid pe google: http://www.daxia.com/list_647.shtml Ar fi un fisier in C cu rutine pentru 18b20. Adaptarea codului o faci si tu. Daca folosesti CodeVisionAVR Compiler ia incearca sa modifici in codul postat de tine linia #include cu linia #include pentru ca aceeasi cautare in google mi-a returnat o pagina cu history-ul compilatorului in care se spune ca au adaugat suport pt DS18B20 V1.24.6 Commercial Release added support for the Maxim DS18B20 temperature sensor (ds18b20.h and ds18b20.lib) O sa iti dea o eroare la aceasta linie: T = ds1820_temperature_10(0)/10; // read DS1820 every 5 sec. dar daca citesti documentatia aferenta librariei ds18b20.lib o sa poti face modificarile de rigoare. Cred ca o sa gasesti si cod sursa ca exemplu in ea :weedman: BAFTA! Si iarasi vine o sesiune :axe: Filipone Link spre comentariu
Filipone Postat Iunie 16, 2006 Partajează Postat Iunie 16, 2006 Pai ai rezolvat maestre? Ca ne-ai cam lasat cu gura cascata... 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