ATtiny2313 từ chối lập trình sau khi đặt xung nhịp CPU thành 500kHz


7

Hôm nọ tôi đang viết một chương trình cho ATtiny2313 . Khi nó hoạt động, tôi quyết định thử nghiệm nó ở các tốc độ đồng hồ khác nhau có sẵn và được lập trình thông qua cài đặt LFUSE như được mô tả trên trang 158.

  • Tốc độ xung nhịp mặc định là 1 MHz;
  • Vì vậy, tôi đã thử 8 MHz tiếp theo và tất cả đều hoạt động tốt;
  • Sau đó, tôi đặt tốc độ xung nhịp cho 4 MHz với / 8-prescaler dẫn đến xung nhịp 500kHz.

Mặc dù bộ điều khiển chạy chương trình với tốc độ mong đợi, lập trình viên của tôi từ chối lập trình lại bộ điều khiển kể từ đó. avrdude(5.11.1) chỉ cần ném một cái tên nổi tiếng: 'Yike!':

avrdude: Device signature = 0x000000
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.

Tôi đã thử thêm -Fcờ, nhưng tất nhiên là không được.

Dưới đây là một số đoạn mã tôi đã sử dụng và thay đổi tốc độ xung nhịp như mong đợi:

// 0.5MHz
FUSES = { .low = 0x62   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };


// 1MHz (default)
FUSES = { .low = 0x64   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };

// 8MHz
FUSES = { .low = 0xe4   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };

Để lập trình, tôi sử dụng một Arduino với bản phác thảo ArduinoISP (phiên bản 04m3) đi kèm với Arduino IDE 1.0.1.

Đây là lệnh để lập trình flash:

avrType=attiny2313
avrFreq=1000000
programmerDev=/dev/ttyUSB003
programmerType=arduino
avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U flash:w:$(src).flash.hex

Đây là lệnh để lập trình các cầu chì:

avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U lfuse:w:$(src).lfuse.hex

Câu hỏi của tôi có hai mặt:

  1. Lý do tôi không thể lập trình bộ điều khiển sau khi đặt nó thành xung nhịp 500kHz (trong khi chương trình trong bộ điều khiển dường như chỉ chạy tốt);
  2. Các tùy chọn của tôi để lập trình lại các cầu chì mà không cần sử dụng một lập trình viên HV là gì? Có lẽ tôi đã bỏ lỡ bất kỳ cờ hữu ích avrdude?

BTW: Có cùng một vấn đề một lần với ATtiny45 @ 128kHz. Lập trình HV giải quyết nó, nhưng tôi muốn ngăn chặn tình trạng HV.


Ở tần số nào lập trình viên cố gắng lập trình? Tôi nhớ rằng tôi đã gặp vấn đề tương tự khi tôi cố gắng lập trình các AVR với tần số SPI quá cao so với đồng hồ chính. Giảm tần số SPI đã giải quyết vấn đề cho tôi.
AndrejaKo

Tôi đã suy nghĩ về điều đó, nhưng tôi không biết. Arduino chạy trên 16 MHz, nhưng tôi không biết về các chân lập trình. Tất cả xảy ra quá nhanh để đo dòng đồng hồ chẳng hạn. Tôi có thể cho nó một thử sau ngày hôm nay, sau khi làm việc. Tôi cũng không có ý tưởng làm thế nào để giảm tần số lập trình viên.
jippie

1
Tôi không thể giúp bạn nhiều ở đó. Tôi chưa sử dụng Arduino, vì vậy tôi không biết chính xác bản phác thảo trông như thế nào. Lập trình viên tôi đã sử dụng, có thiết lập đặc biệt chỉ dành cho trường hợp này. Một số tìm kiếm ban đầu đã cho tôi những kết quả này: arduino.cc/forum/index.php?topic=71973.0 github.com/rsbohn/ArduinoISP/pull/2 Thật không may, tôi không có thời gian để nghiên cứu thêm về chủ đề này . Chúc may mắn!
AndrejaKo

Tôi không sử dụng Arduino, vì vậy tôi không biết nhiều về nó, nhưng đôi khi tôi đã phải thay đổi tốc độ SPI khi cố gắng lập trình một thiết bị AVR có xung nhịp chậm hơn. Có một tùy chọn -B để kiểm soát tốc độ hoạt động với lập trình viên USBtiny, nhưng nó không giống như bạn đang sử dụng. Nó được đề cập ở đây: tom-itx.dyndns.org:81/~webpage/usbtiny_programmer/ chủ cũng như trong các liên kết từ nhận xét trước.
Kurt E. Clothier

Câu trả lời:


4

Vấn đề, như đã giải thích, tần số xung nhịp SPI quá cao. Có tồn tại một phiên bản cố định của ArduinoISP có thể lập trình ở tần số thấp hơn có sẵn ở đây . Một số thảo luận về chủ đề có sẵn ở đây .


Tôi đã kiểm tra liên kết github và tôi có thể flash lại bộ điều khiển trong lần thử đầu tiên. Vì thực tế, nó cho phép thay đổi giữa SPI (quá nhanh như được giải thích trong Electronics.stackexchange.com/a/65019/8627 đối với một số cài đặt cầu chì) và bit banging (dường như chỉ hoạt động). Mặc dù tôi đã quản lý việc lập trình lại bộ điều khiển, phiên bản ArduinoISP ban đầu ổn định hơn. Cái mới đôi khi không thành công và sau đó hoạt động trên lần thử thứ hai.
jippie

3

Theo nguyên tắc thông thường, bạn không được chọn bất kỳ ISP nào có tốc độ cao hơn một phần tư tốc độ của MCU mục tiêu của bạn. Trong trường hợp của bạn, 500/4 = 125KHz phải là tốc độ ISP tối đa. Nếu bạn không thể thay đổi tốc độ SPI của Arduino như Angelatlarge đã mô tả, bạn có thể cần một lập trình viên bên ngoài.

Nếu bạn không thể quản lý giảm tốc độ SPI của ArduinoISP, một giải pháp khác có thể là mã lập trình viên tùy chỉnh. Bạn có thể thay đổi ArduinoISP để sử dụng SPI phần mềm và tính toán độ trễ thích hợp để giảm xuống 100KHz hoặc có thể tốc độ tùy chỉnh. Hãy xem http://little-scale.blogspot.com/2007/07/spi-by-hand.html để triển khai phần mềm SPI.


1

Tôi sẽ sử dụng huy hiệu Captain Ob Rõ ràng ở đây và đề nghị rằng tốc độ ATtiny2313 quá thấp để được lập trình bởi ArduinoISP. Từ bảng dữ liệu ATtiny2313:

Thời gian thấp và cao tối thiểu cho đầu vào đồng hồ nối tiếp (SCK) được xác định như sau: Thấp:> 2 chu kỳ xung nhịp CPU cho fck <12 MHz, 3 chu kỳ xung nhịp CPU cho fck > = 12 MHz Cao:> 2 chu kỳ xung nhịp CPU cho fck <12 MHz, 3 chu kỳ xung nhịp CPU cho fck > = 12 MHz

Arduino của bạn có thể chạy ít nhất 16Mhz. Đây là dòng có liên quan từ ArduinoISP.ino:

SPCR = 0x53;

Điều này đặt tốc độ Arduino SPI ở fOSC/ 64 hoặc 250Khz nếu SPI2Xbit được lập trình trong thanh SPSRghi . Nếu điều này đúng ở xung nhịp 500kHz, thì đây không phải là hơn 2 chu kỳ xung nhịp CPU như bảng dữ liệu khuyến nghị. Nếu giả thuyết này là chính xác, giải pháp là đặt bộ chia xung nhịp SPI thành 128 bằng cách đảm bảo SPI2Xtắt spi_init()chức năng trong ArduinoISP.ino:

SPSR &= ~(1<<SPI2X);

Thật không may, phiên bản ArduinoISP của tôi đã có sẵn / 256 :(
jippie

0

Tôi hiện đang làm việc trên ScratchMonkey, một bản phác thảo của lập trình viên Arduino thực hiện dự phòng phần mềm cho SPI, dần dần lùi về tốc độ thấp tới 1kHz.

Đây vẫn là một công việc đang tiến triển, nhưng bạn có thể lấy nó từ github

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.