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.


Topics - ph_sarawut

Pages: [1] 2 3
1
มีท่านใดที่มี Raspberry pi 3 ไม่ได้ใช้ อยู่บนหิ้งดองไว้  ;D ;D ;D อยากจะปล่อย ติดต่อได้ ครับ
 ;) ;) ;) ;)
ไลน์: ph_sarawut
โทร: o๘๖-๔๔๘-๘๕๖๖

2
การเข้าถึง Register แบบ Shift กับใช้ bit-field structure คำสั่งแบบไหนจะเข้าถึงรีจีสเตอร์ได้เร็วกว่ากันครับ
ผมดูแล้วการใช้ Shift น่าจะช้ากว่า ใช่ไหมครับ

โค้ดแบบ Bits Field
Code: [Select]
#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 กันหมด

Code: [Select]
#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
พอดีผมลองเขียน 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
Code: [Select]
#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);
    }
}


โค้ดที่ใช้ได้ครับ
Code: [Select]
#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);
    }
}

วงจรตามหนังสือครับ
 

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

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

สามารถติดต่อมาได้ทุกวันครับ

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


Forward phase dimming


Reverse phase dimming

8

ตามในรูปบนครับ ผมเห็นมีแต่ที่ขายตัดมาให้แล้วทั้งนั้นเลย ผมอยากจะหาที่ตัดเอง จะได้ตัดตามขนาดวงจรบน Breadboard จะได้ดูดีด้วย  :) :) :) :) :) :)

Pages: [1] 2 3