![]() |
Cần giúp đỡ về giao tiếp giữa DSpic33f với cảm biến DS18B20
Chào các bác.
Em đang làm về đo nhiệt độ dùng cảm biến DS18B20 nguồn ngoài với dspic33f nhưng em đang gặp khó khăn là không biết khi nào thì mình cấu hình chân kết nối giữa VDK với cảm biến là chân vaò (TrisBx=1), khi nào là chân ra (TrisBx=0). Em chỉ mới biết khi nào thì chân đó phải có mức 0 (LATBx hoặc PORTBx=0), khi nào thì chân đó có mức 1 thôi (LATBx hoặc PORTBx=1). còn nó là chân vào hay chân ra thì em chưa biết. Các bác giúp em với. em cảm ơn trước. |
kiểm tra giúp code Dspic33f + DS18B20 + LCD
1 Attachment(s)
Các bác giúp em với. Bây giờ thì em đã trả lời dc câu hỏi trên của em rồi. nhưng không hiểu sao chương trình của em vẫn không hiển thị được nhiệt độ lên LCD. LCD chỉ hiển thị là 0000 thôi. em up chương trình đo và đọc nhiệt độ lên các bác kiểm tra giúp em với. Em loay hoay với con này lâu quá rồi .
Chip em dùng là dspic33f. Em cấu hình Tần số hoạt động của chíp là Fosc = 40MPs. Chân DQ của cảm biến em kết nối với chân RB2 của DSpic. DS18B20 em dùng nguồn 3.3v, chân DQ có điện trở kéo 4.7k lên nguồn 3.3v. Chương trình đo nhiệt độ của em : //------ham tao tre 1us (khi PR1=40)------------------------------------------- void Delay_us(unsigned long time) { PMD1bits.T1MD = 0; // Enable Timer1 module T1CONbits.TON = 0; // Disable Timer T1CONbits.TCS = 0; // Select Internal Clock for Timer1 T1CONbits.TGATE = 0; // Disable Gated Timer Mode T1CONbits.TCKPS = 0b00; // Set Timer1 Prescaler = 1:1 TMR1 = 0; // Reset timer to 0 PR1 = time; // Timer1 period set IFS0bits.T1IF = 0; // Clears Timer 1 interupt flag IEC0bits.T1IE = 0; // Disable timer 1 interupts T1CONbits.TON = 1; // Starts timer while(IFS0bits.T1IF==0); // While the interupt flag is not set IFS0bits.T1IF = 0; T1CONbits.TON = 0; // Stop timer // LED2=0; } //================================================== ==== char Reset() { DQ=0; // DQ is output LATBbits.LATB2=0; // DQ to low Delay_us(20000);// delay 500us DQ=1; // QD is input Delay_us(2400); //delay 60us if(PORTBbits.RB2==0) // if there is a presence pule { Delay_us(20000); // delay 500us return 0; } else { Delay_us(20000); // delay 500us return 1; } } //================================================== ==== void Write_DS18B20(unsigned char CMD) { char i; DQ=1; // DQ is input for (i=0; i<8; i++) { if ((CMD&(1<<i))!=0) { // wirte 1 DQ=0; // DQ is output LATBbits.LATB2=0; Delay_us(100);// delay 2us DQ=1; // DQ is input Delay_us(2400); // Delay 60us } else { // wirte 0 DQ=0; // DQ is output LATBbits.LATB2=0; Delay_us(2400); // Delay 60us DQ=1; // DQ is input } } } //================================================== ==== char Read_DS18B20() { char i,result=0; DQ=1; // QD is input for(i=0;i<8;i++) { DQ=0; // DQ is output LATBbits.LATB2=0; Delay_us(80); // delay 2us DQ=1; // DQ is input if(LATBbits.LATB2!=0) result |=1<<i; Delay_us(2400); // Delay 60us } return result; } //=====chuong trinh doc nhiet do=================================== void nhiet_do() { if(Reset()==0) { Write_DS18B20(Skip_Rom); Write_DS18B20(Convert_T); Delay_us(40000); // Delay 1ms Reset(); Write_DS18B20(Skip_Rom ); Write_DS18B20(Read_Scratchpad); a=Read_DS18B20(); b=Read_DS18B20(); temp = (a >> 4) | (b << 4); temp=((int)(temp)); // hiển thị nhiệt độ lên LCD dưới dạng số nguyên } } Chương trình đầy đủ ở trong file đính kèm . Các bác cố gắng giúp em với. em cảm ơn rất nhiều. |
Múi giờ GMT. Hiện tại là 07:28 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam