วันอังคารที่ 16 พฤศจิกายน พ.ศ. 2564

UsbAsp โปรแกรมบอร์ดไม่ได้

 หลังจากที่อัพเกรดเฟิร์มแวร์ให้กับ UsbAsp แล้วก็มีปัญหาอัพโหลดได้ครั้งเดียว หลังจากนั้นก็ไม่สามารถอัพโหลดได้ ต้องถอดออกแล้วเสียบเข้าไปใหม่ถึงจะอัพโหลดได้

ลองหาข้อมูลก็ไปพบเว็บหนึ่งที่อธิบายการอัพเกรดเฟิร์มแวร์แล้วให้เซ็ต jumper สำหรับ Very Low Frequency เพื่ออัพโหลดบอร์ดบางบอร์ทที่ตอบสนองไม่ทัน แต่ถ้าไม่เซ็ต jumper ก็ใช้ออปชัน -B โดยกำหนด -B 1024 ก็ลองกำหนดตาม ก็สามารถอัพโหลดได้ตามปกติ และลองกำหนดค่าที่เหมาะสมได้ -B 10 เป็นต้นไป ถ้าต่ำกว่านี้ก็อัพโหลดไม่ได้

$ avr-gcc -Wall -g -Os -mmcu=atmega16 -o led.bin led.c
$ avr-objcopy -j .text -j .data -O ihex led.bin led.hex
$ avrdude -p m16 -c usbasp -U flash:w:led.hex:i -F -P usb

avrdude: error: program enable: target doesn't answer. 1 
avrdude: initialization failed, rc=-1
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x1859e0
avrdude: Expected signature for ATmega16 is 1E 94 03
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude done.  Thank you.


ตัวอย่างโปรแกรม

led.c

#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>

int main(void){
  DDRD  = 0x00;
  PORTD = 0x00;
  DDRB  = 0xff;      //PB0-7 as output.
  PORTB = 0xff;

  while (1){
    if((PIND&(1<<PIN7)) == (1<<PIN7)){
      PORTB = (PORTB == 0xff)?(PORTB <<1):(PORTB<<1)|1;
      _delay_ms(50);
    }else{
      PORTB = 0xff;
    }
  }
  return 0;
}


คอมไพล์และสร้างไฟล์ .hex

avr-gcc -Wall -g -Os -mmcu=atmega16 -o led.bin led.c
avr-objcopy -j .text -j .data -O ihex led.bin led.hex

อัพโหลดโปรแกรม

avrdude -p m16 -c usbasp -U flash:w:led.hex:i -F -P usb_device -B 100


ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Gtk4 ตอนที่ 6 Defining a Child object

Defining a Child object A Very Simple Editor ในบทความที่ผ่านมาเราสร้างโปรแกรมอ่านไฟล์ชนิดข้อความ และในบทความนี้ก็จะมาปรับแต่งโปรแกรมกันสักหน...