Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Topics - ph_sarawut

#1
มีท่านใดที่มี Raspberry pi 3 ไม่ได้ใช้ อยู่บนหิ้งดองไว้  ;D ;D ;D อยากจะปล่อย ติดต่อได้ ครับ
;) ;) ;) ;)
ไลน์: ph_sarawut
โทร: o๘๖-๔๔๘-๘๕๖๖
#2
การเข้าถึง Register แบบ Shift กับใช้ bit-field structure คำสั่งแบบไหนจะเข้าถึงรีจีสเตอร์ได้เร็วกว่ากันครับ
ผมดูแล้วการใช้ Shift น่าจะช้ากว่า ใช่ไหมครับ

โค้ดแบบ Bits Field

#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>

struct ddrb_reg {
        unsigned char DDR0: 1;
        unsigned char DDR1: 1;
        unsigned char DDR2: 1;
        unsigned char DDR3: 1;
        unsigned char DDR4: 1;
        unsigned char DDR5: 1;
        unsigned char DDR6: 1;
        unsigned char DDR7: 1;
};
#define DDRB_BITS (*((volatile struct ddrb_reg *)0x37)) //Direct DDRB

struct portb_reg {
        unsigned char B0: 1;
        unsigned char B1: 1;
        unsigned char B2: 1;
        unsigned char B3: 1;
        unsigned char B4: 1;
        unsigned char B5: 1;
        unsigned char B6: 1;
        unsigned char B7: 1;
};
#define PORTB_BITS (*((volatile struct portb_reg *)0x38)) //Direct PORTB

int main(void)
{
DDRB_BITS.DDR0  = 1 ;                                   // ให้ PortB บิต 0 เป็น เอาท์พุท
while(1)
{
PORTB_BITS.B0 = ~PORTB_BITS.B0 ;
_delay_ms(500);
}
return 0 ;
}

#3
เนื่องจาก ADC บน MCU เป็นแบบกราวด์ร่วม ผมอยากจะไปต่อสัญญาณที่กราวด์ต่างกัน จึงอยากให้มัน isolate จะได้แยกกราวด์
ตอนนี้ที่ผมดูๆไว้คือ MAX4617CPE+ ดูสเปคแล้วขณะทำงานมันมีความต้านทาน 10 Ohm เหมื่อนกัน
พอดีผมไม่เคยมีประสบการณ์ใช้งานแนวนี้ อยากขอคำแนะนำท่านที่เคย isolate adc จะเป็นแบบ Multiplexers/Switches ก็ได้ หรือไม่ใช่ก็ได้ครับ
มีเบอร์ชิปหรือวงจรพอแนะนำเป็นแนวทางให้หน่อยครับ
#4
        สำหรับมือใหม่ที่ยังไม่ทราบ พอดีไปเจอมาครับ ตามลิ้งค์อ้างอิงด้านล่าง โดยเวลาเราจะสั่ง Print ออกพอร์ต UART หรือ LCD เราจะต้องแอดไลบรารี่ #include <stdio.h> แล้วเราสร้างฟังชั่น void putch(char c) ขึ้นมา (printf ต้องการฟังชั่น putch() มาใช้ โดยประกาศอยู่ใน stdio.h อยู่แล้ว) ทีนี้ถ้าเรามีจุดที่จะ printf หลายจุด เราก็ใช้วิธีหลักการ พอยเตอร์ของฟังชั่นมาช่วย ลองดูตามโค้ดตัวอย่างครับ

ไฟล์ตัวอย่างซิมบน Proteus 8 : http://www.zabzaa.com/upload/download.php?file=456XC8_TestPrintf_18F8722.zip

อ้างอิง : http://www.electro-tech-online.com/threads/is-it-possible-if-so-how-to-use-scanf-printf-on-your-own-input-output-routine.135005/

ปล. : ห้องนี้เงียบจังครับ หรือ หันไปเล่น Arduino กันหมด

#define _XTAL_FREQ 40000000UL

#include <xc.h>
#include "Config.h" // #pragma config
#include <stdio.h>

void delay_ms(unsigned int i)
{
    for(;i;i--)
    {
        __delay_ms(1) ;
    }
}

void uart_init1(unsigned int baudrate){
   
    TXSTA1 = 0;           // Reset USART registers to POR state
    RCSTA1 = 0;

    // BRG_val = ((FOSC/Desired Baud Rate)/64) - 1
    unsigned int BRG_val = ((_XTAL_FREQ/baudrate)/(64))-1;
    SPBRGH1 = BRG_val>>8;
    SPBRG1 = BRG_val;

    TXSTA1bits.BRGH = 0; // 0 = low speed mode ,1= high speed mode
    TXSTA1bits.SYNC = 0 ;
    BAUDCON1bits.BRG16 = 0;
    TRISCbits.TRISC6 = 0;
    TRISCbits.TRISC7 = 1;

    TXSTA1bits.TX9  = 0 ;
    TXSTA1bits.TXEN = 1;
    RCSTA1bits.SPEN = 1;
}

void uart_init2(unsigned int baudrate){
   
    TXSTA2 = 0;           // Reset USART registers to POR state
    RCSTA2 = 0;

    // BRG_val = ((FOSC/Desired Baud Rate)/64) - 1
    unsigned int BRG_val = ((_XTAL_FREQ/baudrate)/(64))-1;
    SPBRGH2 = BRG_val>>8;
    SPBRG2 = BRG_val;

    TXSTA2bits.BRGH = 0; // 0 = low speed mode ,1= high speed mode
    TXSTA2bits.SYNC = 0 ;
    BAUDCON2bits.BRG16 = 0;
    TRISGbits.TRISG1 = 0;
    TRISGbits.TRISG2 = 1;

    TXSTA2bits.TX9  = 0 ;
    TXSTA2bits.TXEN = 1;
    RCSTA2bits.SPEN = 1;
}

void uart_putc1(unsigned char c){
    while(!TXSTA1bits.TRMT);
    TXREG1 = c;
}

void uart_putc2(unsigned char c){
    while(!TXSTA2bits.TRMT);
    TXREG2 = c;
}

void (*putchFunc)(char c) = uart_putc1 ; // UART1 is putch defualt
void putch(char c)
{
    putchFunc(c);   // call whatever function we've set the pointer to point to
}

void main(void)
{
    uart_init1(4800) ;
    uart_init2(9600) ;
   
    printf("Test printf UART1 on PIC18F8722.\r") ; // Print UART1
    delay_ms(500) ;
   
    putchFunc = uart_putc2 ;
    printf("Test printf UART2 on PIC18F8722.\r") ; // Print UART2
    delay_ms(500);
   
    putchFunc = uart_putc1 ;
    printf("Test printf UART1 agian.\r") ; // Print UART1 agian.
    printf("End.") ;
   
    while(1);
}


ผลรันจะได้

#5
เข้าไปกดในลิ้งค์นี้ครับ http://filepi.com/i/6hAGVtX

#6
C Programming for Arduino 

เล่มนี้มีให้โหลดยังครับ พอดีไปเจอมาครับ กดที่ลิ้งค์มันจะโหลดมาเลยครับ



http://www.lakos.fs.uni-lj.si/images/Predmeti/MK/2014/C%20Programming%20for%20Arduino.pdf
#7
พอดีผมลองเขียน RB Interrupt บน PIC16F1937 โดยเลียนแบบตามหนังสือ

โดยฟังก์ชั่นการอินเตอร์รัพมีลักษณะแบบนี้
#INT_RB
{
    ........Code
}

และประกาศอินเตอร์รัพ
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);

ปรากฏว่าอินเตอร์รัพมันทำงานตลอดเลย โดยเหมื่อนมันไม่ยอมเคลียร์ให้
ซึ่งถ้าเป็นเบอร์ PIC16F887 มันได้ครับไม่มีปัญหา
ทีนี่ผมเลยหาวิธีให้มันได้ โดยเปลี่ยนเป็นลักษณะตามนี้

โดยฟังก์ชั่นการอินเตอร์รัพมีลักษณะแบบนี้
#INT_RB
{
    ........Code
    clear_interrupt(INT_RB4|INT_RB5|INT_RB6|INT_RB7) ;
}

ประกาศอินเตอร์รัพเป็น
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB4|INT_RB5|INT_RB6|INT_RB7);

ซึ่งปรากฎว่าใช้ได้ครับ ผมเลยส่งสัยว่ามันเป็นเพราะบักของ ccs หรือเปล่าครับ

โค้ดที่มีปัญหากับ PIC16F1937
#include <16F1937.h>

#FUSES NOWDT                   
#FUSES NOBROWNOUT               
#FUSES NOLVP                   

#use delay(internal=32MHz)

#INT_RB                           
void On_Change_ISR(void)         
{
    if (!input(PIN_B4))
   {                                                 
        output_toggle(PIN_A2);   
    }
    output_toggle(PIN_A1);       
    delay_ms(200);               
}

void main()
{
    enable_interrupts(GLOBAL);   
    enable_interrupts(INT_RB);

    set_tris_b(0xF0);           
    set_tris_a(0x00);           
    output_a(0x00);             

    while (TRUE)
   {               
        output_toggle(PIN_A0);   
        delay_ms(1000);
    }
}



โค้ดที่ใช้ได้ครับ
#include <16F1937.h>

#FUSES NOWDT                   
#FUSES NOBROWNOUT               
#FUSES NOLVP                   

#use delay(internal=32MHz)

#INT_RB                           
void On_Change_ISR(void)         
{
    if (!input(PIN_B4))
   {                                                 
        output_toggle(PIN_A2);   
    }
    output_toggle(PIN_A1);       
    delay_ms(200);               
    clear_interrupt(INT_RB4|INT_RB5|INT_RB6|INT_RB7);
}

void main()
{
    enable_interrupts(GLOBAL);   
    enable_interrupts(INT_RB4|INT_RB5|INT_RB6|INT_RB7);

    set_tris_b(0xF0);           
    set_tris_a(0x00);           
    output_a(0x00);             

    while (TRUE)
   {               
        output_toggle(PIN_A0);   
        delay_ms(1000);
    }
}


วงจรตามหนังสือครับ
#8
ต้องการพนักงานช่างเทคนิค คุณสมบัติดังนี้
- จบ ปวช. / ปวส. ทางด้านไฟฟ้าหรืออิเล็คทรอนิกส์
- สามารถเริ่มงานได้ทันที

ติดต่อที่ คุณเทียนชัย
บริษัท ออโต้นิคส์ เทคโนโลยี จำกัด
98/19 หมู่ที่3 คูคต
ลำลูกกา
ปทุมธานี 12130
Tel. 085-341-6653 , Tel. 086-498-9466

สามารถติดต่อมาได้ทุกวันครับ
#9
ตามหัวข้อครับ  Reverse phase dimming กับ Forward phase dimming ใช้งานต่างกันยังไงครับ
พอดีภาษาอักฤษไม่ค่อยแข็งแรง  ;D ;D ;D เลยมาถามที่กูรูที่นี้อีกทีครับ
เท่าที่อ่านจากพี่กูเกิลมา ใช้กับโหลดที่ต่างกันใช่ไหมครับ  ;D ;D ;D ;D


Forward phase dimming


Reverse phase dimming
#10

ตามในรูปบนครับ ผมเห็นมีแต่ที่ขายตัดมาให้แล้วทั้งนั้นเลย ผมอยากจะหาที่ตัดเอง จะได้ตัดตามขนาดวงจรบน Breadboard จะได้ดูดีด้วย  :) :) :) :) :) :)
#11
ตามหัวข้อ มีท่านใดทำ LIB ของ Modbus บน VB บ้างไหมครับ
ผมเอาตัวนี้ http://www.codeproject.com/Articles/20929/Simple-Modbus-Protocol-in-C-NET-2-0 มาลองดูกับ Temp. Control ก็ไม่เห็นมีอะไรออกมาเลยครับ
#12
มีตัวอย่างมากมายครับ เข้าไปตามลิ้งค์นี้ http://www.doctronics.co.uk/555.htm
#13
อยากถามเพื่อนสมาชิกว่า RTD เพื่อนใช้ชิปอะไรเป็นตัวอ่านรับค่าเข้าไมโคร
ซึ่งถ้าเป็น TC ผมจะใช้ MAX6675 ครับ
#14
มีเซนเซอร์ อะไรบ้างครับที่เข้าใกล้แล้วทำงานแม้ว่าเราอยู่นิ่งมันก็ทำงาน
แต่พอเราเดินจากมันก็หยุด ลองตัวนี้แล้ว http://www.wired.com/geekdad/2012/09/using-motion-detectors-with-an-arduino/ มันหยุดถ้าเราอยู่นิ่งๆ รบกวนเพื่อนๆสมาชิกหน่อยครับว่ามีไอเดียเซนเซอร์ตัวไหนบ้าง
#15
พอดีเล่น XC8 มาสักพักแล้ว เลยอยากเล่นพวก 3th party ดูบางครับ แนะนำหน่อยครับว่าเล่นตัวไหนดีครับ
#16
MPLAB Code Configurer คือ ตัวที่จะสร้างโค้ดจากการเลือก IO หรือ โมดูลต่างๆของ PIC  (แต่ยังมีไม่กี่เบอร์ที่ใช้ MPLAB Code Configurer ได้ )
ลองดูวิดีโอก่อนได้ครับ จะได้เข้าใจง่ายขึ้น

http://www.youtube.com/watch?v=WTBy3Kf5aHM&feature=youtu.be

http://www.youtube.com/watch?v=9kzu_eoKQKo&feature=youtu.be
#18
ตามหัวข้อกระทู้ครับ "ขอถามสมาชิกหน่อยครับ ว่ามีโปรแกรมไหนที่ให้เราออกแบบต่อปริ้นอแนกประสงค์สะดวกบ้างครับ"
#19
 ข้อถามเป็นข้อๆนะครับ

1). ขอถามท่านที่มีประสกการณ์ใช้งาน PIC กับ internal clock กับ crystal clock ว่าอย่างไหนระบบจะเสถียรกว่ากัน
ในความเข้าใจผม ผมว่าแบบ crystal clock น่าจะเสถียรกว่า

2). พอดีตอนนี้ผมเล่น PIC เบอร์ PIC18F46K80 อยู่ เห็นตัวอย่างเป็น internal clock เยอะเหมื่อนกัน เลยส่งสัยว่า PIC18FxxKxx
internal clock มันดีกว่าเบอร์อื่นหรือเปล่าครับ

3). ประสบการณ์ทุกท่านที่เคยใช้ internal clock เป็นยังไงบ้างครับ
#20
ไม่รู้ว่ามีท่านใดแชร์ยังครับ ตามลิ้งค์นี้นครับ http://electronicxlovers.blogspot.com/p/codes.html