AVR-MCS-PIC-Microcontroller Project
หน้า: 1 2 [3]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: AVR-MCS-PIC-Microcontroller Project  (อ่าน 97388 ครั้ง)
JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #58 เมื่อ: พฤศจิกายน 09, 2011, 11:37:33 pm »

555 พี่ JUB ก็เอามาตุนไว้ด้วยหรอ LED Matrix นั่นน่ะ ผมก็จัดมา 1 ชิ้น จนบัดเด่วนี้ยังไม่มีเวลาลองเล่นเลย ยังกองอยู่่ในกล่องไปรษณีย์เหมือนเดิม

ก็เพิ่งเอามาเล่นนั่นล่ะ ดองไว้นานเดี๋ยวเปื่อย... Grin
บันทึกการเข้า

PIC16
member
*

คะแนน2
ออฟไลน์ ออฟไลน์

กระทู้: 13


« ตอบ #59 เมื่อ: ธันวาคม 29, 2011, 01:17:17 pm »

พี่ JUB ครับ สอบถามหน่อยครับผมกำลังหัดเขียนภาษาแอสแซมบลี้ โดยใช้ PIC ครับ 
MOVLW .150
MOVWF TRM0
คืออะไรครับ
บันทึกการเข้า
JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #60 เมื่อ: ธันวาคม 29, 2011, 02:48:28 pm »

MOVLW .150
คือการย้ายค่าคงที่ ค่า decimal 150 ไปที่ Working Register
ให้ลองดูที่คำสั่ง MOVLW โดย MOV คือ move หรือย้าย L ในที่นี้คือ 150 และ W คือ Working Register

MOVWF TMR0

อันนี้ก็เช่นเดียวกัน แต่ต้นทางคือ W และปลายทางคือ F หรือ File Register ก็คือ TMR0 นั่นเอง

เมื่อจบสองคำสั่งนี้ TMR0 จะมีค่าเท่ากับ decimal 150 หรือ 0x96 ครับ
บันทึกการเข้า
PIC16
member
*

คะแนน2
ออฟไลน์ ออฟไลน์

กระทู้: 13


« ตอบ #61 เมื่อ: ธันวาคม 31, 2011, 11:40:47 am »

ขอบคุณครับพี่ JUB ที่ให้ความรู้
เดี๋ยวมีอะไรจะสอบถามเข้ามาใหม่ครับ lv! lv!
บันทึกการเข้า
PIC16
member
*

คะแนน2
ออฟไลน์ ออฟไลน์

กระทู้: 13


« ตอบ #62 เมื่อ: มกราคม 02, 2012, 10:10:26 am »

พี่ JUB ครับสอบถามหน่อยครับ

GOTO $+1  หรือว่า  GOTO $+3    เป็นคำสั่งหน่วงเวลา ใช่หรือเปล่าครับ ถ้าหน่วงจะหน่วงกี่ mS ครับ

GOTO $-1  หรือว่า  GOTO $-3     เป็นคำสั่งหน่วงเวลา เหมือนข้างบนหรือเปล่าครับ  เครื่องหมาย  +, -  ต่างกันยังไงครับ
                 
                            cry2!! cry2!!
บันทึกการเข้า
JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #63 เมื่อ: มกราคม 02, 2012, 04:09:50 pm »

พี่ JUB ครับสอบถามหน่อยครับ
GOTO $+1  หรือว่า  GOTO $+3    เป็นคำสั่งหน่วงเวลา ใช่หรือเปล่าครับ ถ้าหน่วงจะหน่วงกี่ mS ครับ
GOTO $-1  หรือว่า  GOTO $-3     เป็นคำสั่งหน่วงเวลา เหมือนข้างบนหรือเปล่าครับ  เครื่องหมาย  +, -  ต่างกันยังไงครับ

GOTO $+1    ตัว $ คือตำแหน่ง PC หรือ Program counter และ goto $ หมายถึง กระโดดไปยังตำแหน่งปัจจุบัน
ก็คือกระโดดอยู่กับที่

ถ้า goto $-1 คือกระโดดไปตำแหน่งก่อนหน้า 1 ตำแหน่งนับจากตำแหน่งปัจจุบัน
ถ้า goto $+1 คือกระโดดไปตำแหน่งถัดไป 1 ตำแหน่งนับจากตำแหน่งปัจจุบัน

ส่วนการกระทำจะใช้เวลาเท่าไรนั้นขึ้นอยู่กับ XTAL/4 เท่ากับเวลาที่เสียไป 1 m-cycle ต่อจำนวนการกระโดด
บันทึกการเข้า
PIC16
member
*

คะแนน2
ออฟไลน์ ออฟไลน์

กระทู้: 13


« ตอบ #64 เมื่อ: มกราคม 02, 2012, 09:37:54 pm »

ต้องขอบคุณพี่ JUB อีกครับ ที่เสียสละเวลาเข้ามาตอบคำถามของผม
ขอบคุณมากครับ พี่ JUB lv! lv!
บันทึกการเข้า
JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #65 เมื่อ: พฤษภาคม 22, 2012, 05:16:19 pm »

ลองเขียน code แบบง่ายๆ interface กับอุปกรณ์ต่างๆ
จะค่อยๆทยอย up นะ ผมไม่ได้จับ avr มานานเหมือนกัน
มาเรียนไปด้วยกันครับ ใครมีอะไรแนะนำ ผมยินดีครับ
มาแลกเปลี่ยนความรู้กัน

dev. board กับ programmer ที่ผมมี


ลาย PCB ครับ เอาไปทำแล้วมาเล่นไปพร้อมๆกัน
http://www.4shared.com/rar/oJYyo0bU/P-8515dev.html

1.clcd 16x2

http://www.4shared.com/rar/H41Ugvh8/P-CLCD.html

2.max7219

http://www.4shared.com/rar/XXQmuYUp/P-MAX7219.html

3.simple project LCD Clock มันเดินไม่ตรงนะทำให้ดูเสยๆ
http://www.youtube.com/v/vOjUT_GpK3A
http://www.4shared.com/rar/0RDacVlB/P-LcdClock.html

4.Usart

http://www.4shared.com/rar/rlzi0TTh/P-USART.html

5.Keypad 4x4

http://www.4shared.com/rar/0AlTy6Mq/P-KEYPAD.html

6.simple project LCD Clock DS1307

http://www.4shared.com/rar/tL65mgQn/P-DS1307.html

7.DS1307mini

http://www.4shared.com/rar/WuNBzHYa/P-RTCMini.html

8.DS1820

http://www.4shared.com/rar/aRW4V3zM/P-ds1820.html
บันทึกการเข้า
JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #66 เมื่อ: มิถุนายน 15, 2012, 05:24:53 pm »

source code มาแล้วครับ  Smiley
บันทึกการเข้า
JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #67 เมื่อ: มิถุนายน 16, 2012, 11:13:51 am »

LM35 Temperature Sensors (PIC16F887)

http://www.youtube.com/v/9ON2-KuZx8w

ปรับ Vref+ (RA4)ให้ได้ 1 โวลท์นะครับ output ของ lm35 อยู่ในระดับ 10mv/c
เช่นวัดได้ 0.317 โวลท์ แปลงเป็นอุณหภูมิได้ 31.7C เป็นต้น
การเปลี่ยนแปลงไวกว่า DS1820 ใช้วัดอุณหภูมิในบรรยากาศ
ได้เป็นอย่างดี code ไม่ได้ optimize นะครับเขียนแบบด้นสด

edit1. การปรับแต่งหา digital meter ตั้งย่านวัดไม่เกิน 2volt วัดขา Vout
ของ LM35 แล้วปรับ Vref+ (RA4) ให้ค่าตรงกับ 7segment เป็นอันใช้ได้

http://www.4shared.com/rar/PuF3enX6/LM35.html


One Button Control 4 Relay (PIC16F887)

อธิบายหน่อยนึง โปรแกรมเป็น state machine ครับ
เน้นการตอบสนองที่ราบรื่น

http://www.youtube.com/v/Ar-WbSZG3rk

การควบคุมจะเป็นแบบ toggle
กด 1 ครั้ง toggle channel 1
กด 2 ครั้ง toggle channel 2
กด 3 ครั้ง toggle channel 3
กด 4 ครั้ง toggle channel 4
กดค้าง ปิดทุก channel

การกดทุกๆหนึ่งครั้งจะทำให้ COUNT+1 และ TIMERCNT จะเป็น 0
ซึ่ง TIMERCNT จะเป็นเวลาหน่วงก่อน Execute คำสั่งตามค่าของ
COUNT. ซึ่งผมตั้งไว้ที่ 500ms. การกดเพื่อควบคุม แต่ละ channel
ช่วงการกดจะต้องไม่เกิน 500ms ในแต่ล่ะช่วง

หากกดค้างไว้ไม่ว่าในช่วงใดๆก็ตามจะปิดทุก channel

ส่วนในเรื่อง Beep sound
จากการทดลอง หาก Gen. เสียงโดย toggle pin มันจะมี
ปัญหาเรื่องการตอบสนองตอนกดปุ่มซึ่งต้องไปหยุดอยู่ที่
Sound Gen. routine มันเลยสะดุดๆ ผมเลย Gen. จาก PWM
แทน ซึ่ง work มากๆ

http://www.4shared.com/rar/iDzOOF9J/OneButton_withBeep.html


Control Servo motor (PIC16F887)

มาเล่น servo motor กันมั่ง

http://www.youtube.com/v/xnzf6ghAkKI

หลักการไม่มีอะไรมากครับ เอา timer 2 ตัวมาทำ โดยใช้ timer1 ทำฐานเวลา
ที่ 20 ms เพื่อ set port ทุกๆ 20ms และใช้ timer0 เป็นตัว clr port ตาม
เวลาที่กำหนด ตัวแปรการปรับมุมได้จากการอ่านค่าจาก ADC ความละเอียด
ที่ทำได้ อยูที่ 143 step

โดยอันดับแรกเมื่อ timer1 เกิด interrupt จะ set servo pin และ reload
ค่า duty ลง timer0 พร้อมกับ enable interrupt ของ timer0 เมื่อ timer0
over flow ก็จะเกิด interrupt ไป clear servo pin และปิด interrupt
ของตัว timer0 เอง เป็นโปรแกรมง่ายๆลองเอาไปต่อยอดกัน

ปล. servo ที่ผมใช้ค่าเวลากว้าง ถ้าใช้กับยี่ห้ออื่นให้ปรับที่ servo_min
กับ servo_max เอาครับ

http://www.4shared.com/rar/f7Xwjfj8/SERVO_MOTOR.html

บันทึกการเข้า
JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #68 เมื่อ: กรกฎาคม 12, 2012, 05:40:48 pm »

http://www.youtube.com/v/d0rjfx6_E1U
บันทึกการเข้า
JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #69 เมื่อ: กันยายน 28, 2012, 03:41:39 pm »

IR Decode NEC Protocol (WinAVR + ATmega8A)

•ว่างอยู่1วันหลังจากส่งงานหมด พอมีเวลาเล่น HC-SR04 โดยใช้ input capture
ลองผิดๆถูกอยู่พักนึงบวกกับได้กระทู้นี้ช่วย เลยไปได้ไวหน่อย ขอบคุณป๋า samira ด้วยครับ
www.electoday.com/bbs/viewthread.php?tid=14149&highlight=%2Bsamira
http://www.youtube.com/v/3ViTo0AsX9M

•แต่ project นี้ไม่ได้เกี่ยวอะไรกับ HC-SR04 แต่มันเป็นความต่อเนื่อง บวกกับคันมือ
อยากลอง เลยไปหยิบ remote ในกองขยะมาได้ตัวนึง ซึ่งเป็น remote dvd จีน
ใช้ nec protocol ซึ่งรูปแบบของ ir nec นี้ถูกใช้อย่างมากในสินค้าจากจีน
แทบจะทุกอย่างเลยก็ว่าได้ โดย protocol มีรูปแบบและหน้าตาดังนี้


ข้อมูลประกอบไปด้วย
1.Address
2.Logical Inverse Address
3.Command
4.Logical Inverse Command
•การตรวจสอบข้อมูล Address และ Command จะใช้การ Inverse แล้วเทียบกับ Logical Inverse
เป็นการตรวจสอบแบบง่ายๆและเพิ่มความน่าเชื่อถือของข้อมูลที่ได้รับว่ามีความถูกต้อง
•แนวการถอดระหัสหรือ algorithm ผมด้นๆมั่วๆเอาเองนึกอะไรได้ก็เขียนมันส่ง อาจจะยังไม่ค่อยดีเท่าไร
ตอนนี้ยังรับ repeat pulse ไม่ได้ เอาไว้จะปรับปรุงให้ดีขึ้นใน version ต่อๆไป

•โดยผมแบ่ง state ออกเป็น 4 state ตามภาพ โดยจะสลับบิตICES1เพื่อให้เกิด interruptที่สัญญาณ
ขอบขาขึ้นและขอบขาลง ที่เหลือดูรายละเอียดจากcodeนะครับถ้าอธิบายสงสัยจะยืดยาว


•ตอน debug ส่งออก serial port เพื่อดู key code


•ต่อกันง่ายๆผ่าน arduino v3.3 มีled4ดวงเอาไว้ลอง command


โค๊ด:
//--------------------------------------------------
//Program :IR Decode (NEC Protocol)
//Author :Somlak Mangnimit
//Date :27/09/2012
//Mcu :ATmega8A
//Xtal :16Mhz
//Compiler :WinAVR 20100110
//Version   :1.0
//Note  :-
//--------------------------------------------------
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#define BAUD_RATE 9600

static int usart_putc(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(usart_putc, NULL,_FDEV_SETUP_WRITE);
volatile unsigned char buffer[4],ir_state,bit_flag,bit_cnt,byte_cnt,ndat;
volatile unsigned long BIT_BUF;
enum{rem_state1,rem_state2,rem_state3,rem_state4};

#define ICCR_RISING()       TCCR1B |= (1<<ICES1);
#define ICCR_FALLING()      TCCR1B &= ~(1<<ICES1);

#define ICCR_ENABLE()       TIMSK |= (1<<TICIE1);
#define ICCR_DISABLE()      TIMSK &= ~(1<<TICIE1);

#define LED_ON()            PORTB |= (1<<PB5);
#define LED_OFF()           PORTB &= ~(1<<PB5);

#define Adr                 buffer[0]
#define AdrInv              buffer[1]
#define Cmd                 buffer[2]
#define CmdInv              buffer[3]

//timer
void initial(void){
TCCR1B |= (1<<CS12);            //prescaler clk/256
TIMSK |= (1<<TICIE1);           //input capture interrupt enable
sei();                          //global interrupt enable
}

//put usart
static int usart_putc(char c , FILE *stream){
    if(c == '\n')
    usart_putc('\r', stream);
    loop_until_bit_is_set(UCSRA, UDRE);
    UDR = c;
    return 0;
}

//usart initial
void usart_initial(void){
    DDRD |= (1<<PD1);
    UBRRH = (((F_CPU/BAUD_RATE)/16)-1)>>8; // set baud rate
    UBRRL = (((F_CPU/BAUD_RATE)/16)-1);
    UCSRB = (1<<RXEN)|(1<<TXEN); // enable Rx & Tx
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // config USART; 8N1
    stdout = &mystdout;
}

//test logical inverse
unsigned char log_inv(unsigned char a,unsigned char b){
    a ^= a;
    if(a==b){return 0;}
    else{return 1;}
}

//main
int main(void){
DDRB |= (1<<PB5)|(1<<PB3);
DDRC |= (1<<PC3)|(1<<PC2)|(1<<PC1)|(1<<PC0);
initial();
usart_initial();
    LED_ON();
    _delay_ms(300);
    LED_OFF();

    for(;;){
        ndat = 0;
        while(!ndat);
        if(log_inv(Adr,AdrInv)&&log_inv(Cmd,CmdInv)){
            switch(Cmd){
                case 12:
                    PORTC ^= (1<<PC0);
                break;

                case 6:
                    PORTC ^= (1<<PC1);
                break;

                case 5:
                    PORTC ^= (1<<PC2);
                break;

                case 79:
                    PORTC ^= (1<<PC3);
                break;

                case 1:
                    PORTC &= ~(1<<PC3)&(1<<PC2)&(1<<PC1)&(1<<PC0);
                //end case
            }
        }
        printf("Address = %d\nLogical Inverse Address = %d\nCommand = %d\nLogical Inverse Command = %d\n\n",
        buffer[0],buffer[1],buffer[2],buffer[3]);
    }

}

//reset ir state
void RESET_IR(void){
    ir_state = rem_state1;
    bit_flag = 0;
    byte_cnt = 0;
    bit_cnt = 0;
    ICCR_FALLING();
    LED_OFF();
}

//isr input capture
ISR(TIMER1_CAPT_vect){
LED_ON();
    switch(ir_state){
        case rem_state1:
            ir_state = rem_state2;
            ICCR_RISING();
            TCNT1 = 0;
        break;

        case rem_state2:
            BIT_BUF = ICR1;
            BIT_BUF = BIT_BUF*10000/625;
            if(BIT_BUF>9000-200&&BIT_BUF<9000+200){
            ir_state = rem_state3;}
            else{RESET_IR();break;}
            ICCR_FALLING();
            TCNT1 = 0;
        break;

        case rem_state3:
            BIT_BUF = ICR1;
            BIT_BUF = BIT_BUF*10000/625;
            if(BIT_BUF>4400-200&&BIT_BUF<4400+200){
            ir_state = rem_state4;}
            else{RESET_IR();break;}
            ICCR_RISING();
        break;

        case rem_state4:
            if(!bit_flag){
                bit_flag = 1;
                ICCR_FALLING();
                TCNT1 = 0;
            }else{
                bit_flag = 0;
                BIT_BUF = ICR1;
                BIT_BUF = BIT_BUF*10000/625;
                buffer[byte_cnt] >>= 1;         //LSB
                if(BIT_BUF>1500&&BIT_BUF<1700){
                buffer[byte_cnt] |= 0x80;}
                else if(BIT_BUF>300&&BIT_BUF<600){
                buffer[byte_cnt] &= ~0x80;}
                else{RESET_IR();break;}
                ICCR_RISING();
            }

            if(++bit_cnt>15){
                if(++byte_cnt>3){RESET_IR();ndat = 1;}
                else{bit_cnt = 0;}
            }
        //end case
    }
    TIFR |= (1<<ICF1);              //clear flag by write one
}
บันทึกการเข้า
JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #70 เมื่อ: ตุลาคม 02, 2012, 07:43:44 am »

AVR cop siren กะจะเอามาทำ home security 

http://www.youtube.com/v/5ZRCmB5jtBo
บันทึกการเข้า
หน้า: 1 2 [3]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: