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.


Messages - ph_sarawut

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

2
ผมเช็คดูแล้ว การทำงานเดียวกันขนาดไฟล์ได้เท่ากันเลย
แต่ดูโค้ด asm บนไฟล์ lss เหมื่อน bit field จะเยอะกว่าครับ

ไฟล์ lss แบบ Bit Field
Code: [Select]

Attiny2313bitField.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000058  00000000  00000000  00000074  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00800060  00000058  000000cc  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .comment      00000011  00000000  00000000  000000cc  2**0
                  CONTENTS, READONLY
  3 .debug_aranges 00000040  00000000  00000000  000000e0  2**3
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_info   000002f2  00000000  00000000  00000120  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_abbrev 00000112  00000000  00000000  00000412  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_line   0000021b  00000000  00000000  00000524  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_frame  00000024  00000000  00000000  00000740  2**2
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_str    00005a83  00000000  00000000  00000764  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_ranges 00000010  00000000  00000000  000061e7  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_macro  00001db8  00000000  00000000  000061f7  2**0
                  CONTENTS, READONLY, DEBUGGING

Disassembly of section .text:

00000000 <__vectors>:
   0: 12 c0        rjmp .+36      ; 0x26 <__ctors_end>
   2: 17 c0        rjmp .+46      ; 0x32 <__bad_interrupt>
   4: 16 c0        rjmp .+44      ; 0x32 <__bad_interrupt>
   6: 15 c0        rjmp .+42      ; 0x32 <__bad_interrupt>
   8: 14 c0        rjmp .+40      ; 0x32 <__bad_interrupt>
   a: 13 c0        rjmp .+38      ; 0x32 <__bad_interrupt>
   c: 12 c0        rjmp .+36      ; 0x32 <__bad_interrupt>
   e: 11 c0        rjmp .+34      ; 0x32 <__bad_interrupt>
  10: 10 c0        rjmp .+32      ; 0x32 <__bad_interrupt>
  12: 0f c0        rjmp .+30      ; 0x32 <__bad_interrupt>
  14: 0e c0        rjmp .+28      ; 0x32 <__bad_interrupt>
  16: 0d c0        rjmp .+26      ; 0x32 <__bad_interrupt>
  18: 0c c0        rjmp .+24      ; 0x32 <__bad_interrupt>
  1a: 0b c0        rjmp .+22      ; 0x32 <__bad_interrupt>
  1c: 0a c0        rjmp .+20      ; 0x32 <__bad_interrupt>
  1e: 09 c0        rjmp .+18      ; 0x32 <__bad_interrupt>
  20: 08 c0        rjmp .+16      ; 0x32 <__bad_interrupt>
  22: 07 c0        rjmp .+14      ; 0x32 <__bad_interrupt>
  24: 06 c0        rjmp .+12      ; 0x32 <__bad_interrupt>

00000026 <__ctors_end>:
  26: 11 24        eor r1, r1
  28: 1f be        out 0x3f, r1 ; 63
  2a: cf ed        ldi r28, 0xDF ; 223
  2c: cd bf        out 0x3d, r28 ; 61
  2e: 02 d0        rcall .+4      ; 0x34 <main>
  30: 11 c0        rjmp .+34      ; 0x54 <_exit>

00000032 <__bad_interrupt>:
  32: e6 cf        rjmp .-52      ; 0x0 <__vectors>

00000034 <main>:
};
#define PORTB_BITS (*((volatile struct portb_reg *)0x38)) //Direct PORTB

int main(void)
{
DDRB_BITS.DDR0  = 1 ;
  34: b8 9a        sbi 0x17, 0 ; 23
while(1)
{
PORTB_BITS.B0 = ~PORTB_BITS.B0  ;
  36: 88 b3        in r24, 0x18 ; 24
  38: 80 ff        sbrs r24, 0
  3a: c0 9a        sbi 0x18, 0 ; 24
  3c: 80 fd        sbrc r24, 0
  3e: c0 98        cbi 0x18, 0 ; 24
#else
//round up by default
__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
#endif

__builtin_avr_delay_cycles(__ticks_dc);
  40: 2f ef        ldi r18, 0xFF ; 255
  42: 84 e3        ldi r24, 0x34 ; 52
  44: 9c e0        ldi r25, 0x0C ; 12
  46: 21 50        subi r18, 0x01 ; 1
  48: 80 40        sbci r24, 0x00 ; 0
  4a: 90 40        sbci r25, 0x00 ; 0
  4c: e1 f7        brne .-8      ; 0x46 <__SREG__+0x7>
  4e: 00 c0        rjmp .+0      ; 0x50 <__SREG__+0x11>
  50: 00 00        nop
  52: f1 cf        rjmp .-30      ; 0x36 <main+0x2>

00000054 <_exit>:
  54: f8 94        cli

00000056 <__stop_program>:
  56: ff cf        rjmp .-2      ; 0x56 <__stop_program>


ไฟล์ lss แบบ Shift
Code: [Select]

ATtiny2313FirstProgram.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000058  00000000  00000000  00000074  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00800060  00000058  000000cc  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .comment      00000011  00000000  00000000  000000cc  2**0
                  CONTENTS, READONLY
  3 .debug_aranges 00000020  00000000  00000000  000000e0  2**3
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_info   000000cd  00000000  00000000  00000100  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_abbrev 00000014  00000000  00000000  000001cd  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_line   0000005b  00000000  00000000  000001e1  2**0
                  CONTENTS, READONLY, DEBUGGING

Disassembly of section .text:

00000000 <__vectors>:
   0: 12 c0        rjmp .+36      ; 0x26 <__ctors_end>
   2: 17 c0        rjmp .+46      ; 0x32 <__bad_interrupt>
   4: 16 c0        rjmp .+44      ; 0x32 <__bad_interrupt>
   6: 15 c0        rjmp .+42      ; 0x32 <__bad_interrupt>
   8: 14 c0        rjmp .+40      ; 0x32 <__bad_interrupt>
   a: 13 c0        rjmp .+38      ; 0x32 <__bad_interrupt>
   c: 12 c0        rjmp .+36      ; 0x32 <__bad_interrupt>
   e: 11 c0        rjmp .+34      ; 0x32 <__bad_interrupt>
  10: 10 c0        rjmp .+32      ; 0x32 <__bad_interrupt>
  12: 0f c0        rjmp .+30      ; 0x32 <__bad_interrupt>
  14: 0e c0        rjmp .+28      ; 0x32 <__bad_interrupt>
  16: 0d c0        rjmp .+26      ; 0x32 <__bad_interrupt>
  18: 0c c0        rjmp .+24      ; 0x32 <__bad_interrupt>
  1a: 0b c0        rjmp .+22      ; 0x32 <__bad_interrupt>
  1c: 0a c0        rjmp .+20      ; 0x32 <__bad_interrupt>
  1e: 09 c0        rjmp .+18      ; 0x32 <__bad_interrupt>
  20: 08 c0        rjmp .+16      ; 0x32 <__bad_interrupt>
  22: 07 c0        rjmp .+14      ; 0x32 <__bad_interrupt>
  24: 06 c0        rjmp .+12      ; 0x32 <__bad_interrupt>

00000026 <__ctors_end>:
  26: 11 24        eor r1, r1
  28: 1f be        out 0x3f, r1 ; 63
  2a: cf ed        ldi r28, 0xDF ; 223
  2c: cd bf        out 0x3d, r28 ; 61
  2e: 02 d0        rcall .+4      ; 0x34 <main>
  30: 11 c0        rjmp .+34      ; 0x54 <_exit>

00000032 <__bad_interrupt>:
  32: e6 cf        rjmp .-52      ; 0x0 <__vectors>

00000034 <main>:
  34: 81 e0        ldi r24, 0x01 ; 1
  36: 87 bb        out 0x17, r24 ; 23
  38: 91 e0        ldi r25, 0x01 ; 1
  3a: 88 b3        in r24, 0x18 ; 24
  3c: 89 27        eor r24, r25
  3e: 88 bb        out 0x18, r24 ; 24
  40: 2f ef        ldi r18, 0xFF ; 255
  42: 34 e3        ldi r19, 0x34 ; 52
  44: 8c e0        ldi r24, 0x0C ; 12
  46: 21 50        subi r18, 0x01 ; 1
  48: 30 40        sbci r19, 0x00 ; 0
  4a: 80 40        sbci r24, 0x00 ; 0
  4c: e1 f7        brne .-8      ; 0x46 <__SREG__+0x7>
  4e: 00 c0        rjmp .+0      ; 0x50 <__SREG__+0x11>
  50: 00 00        nop
  52: f3 cf        rjmp .-26      ; 0x3a <main+0x6>

00000054 <_exit>:
  54: f8 94        cli

00000056 <__stop_program>:
  56: ff cf        rjmp .-2      ; 0x56 <__stop_program>


3
การเข้าถึง 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 ;
}


4
เคยใช้พวก ตระกูล HCNR ของ AVAGO ครับ
http://www.digikey.com/catalog/en/partgroup/hcnr-200-201-series/19027
เป็น Analog Optoisolator
วงจรการต่อดูจาก Datasheet นะครับ
ลืมหมดแล้ว ไม่ได้ใช้งานนานแล้วครับ
ขอบคุณที่แนะนำเบอร์นี้ครับ ผมเพิ่งรู้จักจริงๆ
อีกวิธีใช้ IC-ADC เช่น MCP32xx เพิ่มแหล่งจ่าย Isolate แยกให้ IC-ADC
และ MCU ติดต่อ IC-ADC โดย SPI/I2C ผ่าน OPTO ก็ได้ครับ
ขอบคุณสำหรับไอเดียนี้ เป็นไอเดียดีเลยครับ ไม่เกิด loss จากการ coupling แน่นอน

5
เนื่องจาก ADC บน MCU เป็นแบบกราวด์ร่วม ผมอยากจะไปต่อสัญญาณที่กราวด์ต่างกัน จึงอยากให้มัน isolate จะได้แยกกราวด์
ตอนนี้ที่ผมดูๆไว้คือ MAX4617CPE+ ดูสเปคแล้วขณะทำงานมันมีความต้านทาน 10 Ohm เหมื่อนกัน
พอดีผมไม่เคยมีประสบการณ์ใช้งานแนวนี้ อยากขอคำแนะนำท่านที่เคย isolate adc จะเป็นแบบ Multiplexers/Switches ก็ได้ หรือไม่ใช่ก็ได้ครับ
มีเบอร์ชิปหรือวงจรพอแนะนำเป็นแนวทางให้หน่อยครับ

6
โดยส่วนตัวผมชอบ Eclipse มากเลยครับ เอาไปใช้ได้หลายตัวเลยครับ ที่สำคัญมันใช้ได้ทั้ง MAC,Linux,Windows สะดวกดีครับ

7
ขอบคุณครับ
ปล. ผม PIC ไม่ยอมเปลี่ยนแปลง ส่งงานลูกค้าแต่ PIC แต่ Arduino กำลังมา เดี๋ยวคุยกับวัยรุ่นไม่รู้เรื่อง ต้องรู้ไว้ครับ คิดเหมือนผมไหม :) :) :)

ผมเองก็มือใหม่ไม่นานนี้เอง ชอบ PIC มีให้เลือกเอาไปใช้ให้เหมาะกับงานเยอะดีครับ

8
        สำหรับมือใหม่ที่ยังไม่ทราบ พอดีไปเจอมาครับ ตามลิ้งค์อ้างอิงด้านล่าง โดยเวลาเราจะสั่ง 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);
}

ผลรันจะได้


Pages: [1] 2 3 ... 12