มิถุนายน 18, 2019, 11:39:04 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: ขอความช่วยเหลือเรื่องการรับค่าจาก uart + pic18f4520 + mcp4821  (อ่าน 3083 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
mabalowz
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 5


| |
« เมื่อ: เมษายน 04, 2016, 02:43:50 am »

คือผมจะใช้ uart รับค่าจากคอมพิวเตอร์ แล้วส่งไปให้ DAC MCP4821 อ่ะครับ
แต่พอลองแล้ว แรงดันที่ออกมาจาก mcp4821 มันไม่ถูกต้อง ไม่ทราบว่าผิดตรงไหน

ปล. ใช้โปรแกรม mikro C นะครับ

Code:
#define MCPCS              PORTC.B0
char input;
int x;y;u;o;g;buffer[3];

void DACMCP4821_Write(unsigned int dat)
{
     MCPCS = 0;

     SPI1_Write(dat>>8 | 0x30);
     SPI1_Write(dat&0x00FF);

     MCPCS = 1;
}

void main() {

     ADCON1 |= 0x07;
     TRISC.B0 = 0;
     TRISC.B7 = 1;
     PORTC.B7 = 1;
     SPI1_Init();
     UART1_Init(9600);


     while(1){
              if (UART1_Data_Ready())   {
                    input = UART1_Read();
                    input = buffer[index++];

                 x = buffer[0];
                 y = buffer[1];
                 o = buffer[2];
                 u = buffer[3];

                 g = ((x-'0')*1000)+((y-'0')*100)+(u-'0')+((o-'0')*10);
                 DACMCP4821_Write(g);

             }

     }
}

ขอบคุณครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #1 เมื่อ: เมษายน 04, 2016, 06:45:10 pm »

ป้อนค่าคงที่ไปให้ DACMCP4821_Write แล้วตรวจสอบว่าค่าที่ไดถูกต้องหรือไม่
ถ้าถูกแสดงว่า g ผิด
g ผิด แสดงว่าสมการผิด
ถ้ามันใจว่าสมการไม่ผิด ให้เปลี่ยนตัวแปรต่างๆ ที่ใช้ในการคำนวณเป็น float หรือ double แล้วค่อย cast กลับมาเป็นตัวที่ DACMCP4821_Write ต้องการ
**ถ้า int ใน mikroC ไม่ใช่ตัวแปรแบบ 8-bit ควรเปลี่ยนตัวแปร buffer เป็น char ครับ
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
mabalowz
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 5


| |
« ตอบ #2 เมื่อ: เมษายน 04, 2016, 10:58:26 pm »

ตอนนี้ผมลองใช้คำสั่ง UART1_Write(); ค่าที่ส่งเข้าไปกับค่าที่รับได้มันไม่ตรงกันอ่ะครับ
ไม่ทราบว่าเป็นเพราะอะไร

Code:
char i ;
void main() {
     OSCCON =  0X70;
     ADCON1 = 0x0F;
     CMCON = 7;
     UART1_Init(9600);
     
     delay_ms(2000);

     while (1) {
       if (UART1_Data_Ready()) {
        i = UART1_Read();
        UART1_Write(i);
        }
     }
}
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #3 เมื่อ: เมษายน 06, 2016, 07:17:22 pm »

1) ทดสอบส่งค่าคงที่แบบนี้
Code:
UART1_Write('A');
ผลที่ได้ตรงหรือไม่?
ถ้าไม่ตรงข้ามไป 3)
ถ้าตรง
2) ทดสอบ code นี้

Code:
i='B';
UART1_Write('A');
ผลที่ได้ตรงหรือไม่?
ถ้าไม่ตรงข้ามไป 3)
ถ้าตรงก็ข้ามไป  3)


3)
ตรวจสอบ การ initial ต่างๆ (ตัวรับตัวส่งจะต้องมี baudrate และ parameter ต่างๆ เท่า/เหมือนกัน)
ตรวจสอบ hardware
อ่านคู่มือการใช้งานใ้ละอียด
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
mabalowz
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 5


| |
« ตอบ #4 เมื่อ: เมษายน 10, 2016, 12:46:55 am »

ได้แล้วครับ ขอบคุณแอดมินมาก ๆ :)
บันทึกการเข้า
mabalowz
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 5


| |
« ตอบ #5 เมื่อ: เมษายน 10, 2016, 09:28:15 pm »

คือผมอยาก clear index ทุกๆครั้งหลังจากรับค่าเสร็จอ่ะครับ เพราะบางที รับค่ามาแค่ 3 หลัก 2 หลัก มันไม่เคลียร์
ถ้าใส่ index >= 2 ไป พอมันรับค่าเกิน 2 หลักมา มันก้เคลียร์ไปแล้ว ไม่รู้ว่าจะแก้ยังไง

Code:
              if (UART1_Data_Ready()==1)   {
                 input = UART1_Read();
                 buffer[index++] = input;
                 i = index-1;
                 UART1_Write(index);
                 x = buffer[0];
                 y = buffer[1];
                 u = buffer[2];
                 o = buffer[3];
                 if(i==0)  { g = (x-'0')+y+u+o; }
                 if(i==1)  { g = ((x-'0')*10)+(y-'0')+u+o; }
                 if(i==2)  { g = ((x-'0')*100)+((y-'0')*10)+(u-'0')+o; }
                 if(i==3)  { g = ((x-'0')*1000)+((y-'0')*100)+((u-'0')*10)+(o-'0'); }
                 DACMCP4821_Write(g);
                 if (index == 4 ) { index = 0; }
                 if (g >= 0) { g = 0 ; }
บันทึกการเข้า
mabalowz
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 5


| |
« ตอบ #6 เมื่อ: เมษายน 10, 2016, 09:44:19 pm »

ใน vb ผมใช้การเพิ่ม 0 ข้างหน้าก้สามารถแก้ไขตัวที่มี 3 หลักได้ แต่ถ้ามี 2 หลักลงมา มันเพิ่ม 0 มาได้แค่ตัวเดียวอ่ะครับ ไม่เข้าใจเหมือนกันว่าทำไม

Code:
                if (B >= 1000)
                {
                    serialPort1.Write(C);
                    textBox2.Text = C;
                }
                else if (B < 1000 || B >= 100)
                {
                    serialPort1.Write('0' + C);
                    textBox2.Text = ('0' + C);
                }
                else if (B < 100 || B >= 10)
                {
                    serialPort1.Write('0'+'0' + C);
                    textBox2.Text = ('0' + '0' + C);
                }
                else if (B < 10 || B >= 0)
                {
                    serialPort1.Write('0' + '0' + '0' + C);
                    textBox2.Text = '0' + '0' + '0' + C;
                }
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: