TwisteR 0 25 июля, 2008 Опубликовано 25 июля, 2008 · Жалоба Приветствую специалистов! Я недавно начал осваивать микроконтроллеры, решил остановиться на линейке AVR. Собрал STK200/300 по этой схеме, купил МК ATmega8535, подключил всё это дело к компу. Какое то время МК нормально определялся (правда, при чтении одних и тех же участков памяти я получал разные данные, но это другая история, подробности тут). Но недавно МК вообще перестал определсятья :( Произошло это во время получения очередной порции "рандомных данных" - в один прекрасный момент вместо беспорядочного набора байт я стал получатьодни 0xFF, а при следующем запуске avrdude и вовсе не обнаружил МК: tfsoft-3 avr # avrdude -p m8535 -c stk200 -t -F avrdude: AVR device not responding avrdude: initialization failed, rc=-1 avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0xffffff avrdude: Yikes! Invalid device signature. avrdude: Expected signature for ATMEGA8535 is 1E 93 08 avrdude> quit >>> quit avrdude: safemode: Fuses OK avrdude done. Thank you. Пробовал и avreal: tfsoft-3 avr # ./avreal-126r0 -p/dev/parport0 -as +ATMEGA8535 -% -e -! avreal/LINUX - AVR controllers LPT programmer by Redchuk Alexandr v1.26rev0 (Jul 10 2008 17:50:25) http://www.ln.ua/~real/avreal bug-reports, suggestions and so on mail to [email protected] Command: -p/dev/parport0 -as +ATMEGA8535 -% -o1MHZ -e -! % Parallel port `/dev/parport0' found, ioctl interface activated % assume that LPT data writes not faster then 1uS % Atmel adapter for STK*00 found % STK mode % osc = 1000kHz -> setup=2, hold=2,1 % Reset % PgmOn reply FF FF FF FF % Try 1 to resync by reset pulse % PgmOn reply FF FF FF FF % Try 2 to resync by reset pulse % PgmOn reply FF FF FF FF % Try 3 to resync by reset pulse % PgmOn reply FF FF FF FF % Try 4 to resync by reset pulse % PgmOn reply FF FF FF FF Can't resync Reset pin released Adapter disabled По совету с другого форума укоротил шлейф до 10 см и повесил резистор 10К между RESET и VCC, ничего не изменилось. Щупал осциллографом - во время выполнения команды "dump flash 0 20000" на RESET, как и положено - 0, на SCK видны прямоугольные импульсы, на MOSI видна передача данных, а на MISO - глухо. Прикрепляю фото программатора и тестовой платы с МК. Кто подскажет, куда копать и как диагностировать неисправность МК? Буду благодарен за любую помощь :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Qwertty 0 25 июля, 2008 Опубликовано 25 июля, 2008 · Жалоба По совету с другого форума укоротил шлейф до 10 см и повесил резистор 10К между RESET и VCC, ничего не изменилось. Щупал осциллографом - во время выполнения команды "dump flash 0 20000" на RESET, как и положено - 0, на SCK видны прямоугольные импульсы, на MOSI видна передача данных, а на MISO - глухо. Прикрепляю фото программатора и тестовой платы с МК. Кто подскажет, куда копать и как диагностировать неисправность МК? Буду благодарен за любую помощь :) Начните с подачи внешнего тактового сигнала на XTAL1. Avreal умеет это делать сам, но лучше прямо на тестовой плате иметь свой. Хотя бы резонатор керамический со встроенными конденсаторами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DpInRock 0 25 июля, 2008 Опубликовано 25 июля, 2008 · Жалоба Дорожки облудить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ильдус 2 25 июля, 2008 Опубликовано 25 июля, 2008 · Жалоба Прочитайте "Отчет от замене AT90S2313 на ATtiny2313" на http://caxapa.ru/?id=36834 - может быть у вас нечто подобное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TwisteR 0 25 июля, 2008 Опубликовано 25 июля, 2008 · Жалоба Начните с подачи внешнего тактового сигнала на XTAL1. Avreal умеет это делать сам, но лучше прямо на тестовой плате иметь свой. Хотя бы резонатор керамический со встроенными конденсаторами. Спасибо большое, всё заработало. Я думал, что если к XTAL1 и 2 ничего не подключено - будет использоваться встроенный осциллятор. Теперь другой вопрос - нужен ли внешний генератор или кварцевый резонатор, если при программировании я указал частоту встроенного: tfsoft-3 avr # ./avreal-126r0 -p/dev/parport0 -as +ATMEGA8535 -% -o0 -fcksel=4 -w avreal/LINUX - AVR controllers LPT programmer by Redchuk Alexandr v1.26rev0 (Jul 10 2008 17:50:25) http://www.ln.ua/~real/avreal bug-reports, suggestions and so on mail to [email protected] Command: -p/dev/parport0 -as +ATMEGA8535 -o0 -fcksel=4 -w Device connected, MEGA8535 detected Chip not locked Fuses OSCCALs = B1 B2 A8 AB BODLEVEL = 0 BODEN = 0 SUT = 0 CKSEL = 0 BLB1 = 3 BLB0 = 3 S8535C = 1 WDTON = 0 CKOPT = 0 EESAVE = 0 BOOTSZ = 1 BOOTRST = 0 Programming fuses New fuses value OSCCALs = B1 B2 A8 AB BODLEVEL = 0 BODEN = 0 SUT = 0 CKSEL = 4 BLB1 = 3 BLB0 = 3 S8535C = 1 WDTON = 0 CKOPT = 0 EESAVE = 0 BOOTSZ = 1 BOOTRST = 0 Reset pin released Adapter disabled Второй вопрос - почему я в avrdude в терминальном режиме не могу писать в flash avrdude> write flash 0 1 2 3 4 5 6 5 4 3 2 1 0 >>> write flash 0 1 2 3 4 avrdude (write): error writing 0x01 at 0x00000 cell=0xff avrdude (write): error writing 0x02 at 0x00001 cell=0xff avrdude (write): error writing 0x03 at 0x00002 cell=0xff avrdude (write): error writing 0x04 at 0x00003 cell=0xff avrdude (write): error writing 0x05 at 0x00004 cell=0xff avrdude> dump flash 0 16 >>> dump flash 0 200 0000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| А в eeprom - могу. Это при том, что и avrdude, и ponyprog и avreal нормально пишут указанные файлы .hex. Впрочем, это не существенно, т.к. МК программируется нормально. Просто интересно :) И третий вопрос. Я прошил МК простой программкой, вот её код: #include <avr/io.h> #include <util/delay.h> #define F_CPU 8000000UL int main(void) { DDRD = 0xff; while (1) { PORTD = 0xff; _delay_ms(1000); PORTD = 0x00; _delay_ms(1000); } } Подключил к ножке 14 (PD0) светодиод, отключил программатор, но светодиод так и не замигал. Зато на осциллографе я увидел то, что в аттаче. Где моя ошибка? Заранее большое спасибо за ответы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flasher 0 25 июля, 2008 Опубликовано 25 июля, 2008 · Жалоба посмотри в ассемблерный листинг, каких комманд он там насовал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TwisteR 0 25 июля, 2008 Опубликовано 25 июля, 2008 (изменено) · Жалоба посмотри в ассемблерный листинг, каких комманд он там насовал. Если бы я только что то понимал... main.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 0000007c 00000000 00000000 00000054 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .stab 0000036c 00000000 00000000 000000d0 2**2 CONTENTS, READONLY, DEBUGGING 2 .stabstr 00000054 00000000 00000000 0000043c 2**0 CONTENTS, READONLY, DEBUGGING 3 .debug_aranges 00000020 00000000 00000000 00000490 2**0 CONTENTS, READONLY, DEBUGGING 4 .debug_pubnames 0000001b 00000000 00000000 000004b0 2**0 CONTENTS, READONLY, DEBUGGING 5 .debug_info 0000015d 00000000 00000000 000004cb 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_abbrev 000000c7 00000000 00000000 00000628 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_line 000000e5 00000000 00000000 000006ef 2**0 CONTENTS, READONLY, DEBUGGING 8 .debug_frame 00000020 00000000 00000000 000007d4 2**2 CONTENTS, READONLY, DEBUGGING 9 .debug_str 000000ca 00000000 00000000 000007f4 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_loc 00000018 00000000 00000000 000008be 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00000000 <__vectors>: 0: 14 c0 rjmp .+40 ; 0x2a <__ctors_end> 2: 2d c0 rjmp .+90 ; 0x5e <__bad_interrupt> 4: 2c c0 rjmp .+88 ; 0x5e <__bad_interrupt> 6: 2b c0 rjmp .+86 ; 0x5e <__bad_interrupt> 8: 2a c0 rjmp .+84 ; 0x5e <__bad_interrupt> a: 29 c0 rjmp .+82 ; 0x5e <__bad_interrupt> c: 28 c0 rjmp .+80 ; 0x5e <__bad_interrupt> e: 27 c0 rjmp .+78 ; 0x5e <__bad_interrupt> 10: 26 c0 rjmp .+76 ; 0x5e <__bad_interrupt> 12: 25 c0 rjmp .+74 ; 0x5e <__bad_interrupt> 14: 24 c0 rjmp .+72 ; 0x5e <__bad_interrupt> 16: 23 c0 rjmp .+70 ; 0x5e <__bad_interrupt> 18: 22 c0 rjmp .+68 ; 0x5e <__bad_interrupt> 1a: 21 c0 rjmp .+66 ; 0x5e <__bad_interrupt> 1c: 20 c0 rjmp .+64 ; 0x5e <__bad_interrupt> 1e: 1f c0 rjmp .+62 ; 0x5e <__bad_interrupt> 20: 1e c0 rjmp .+60 ; 0x5e <__bad_interrupt> 22: 1d c0 rjmp .+58 ; 0x5e <__bad_interrupt> 24: 1c c0 rjmp .+56 ; 0x5e <__bad_interrupt> 26: 1b c0 rjmp .+54 ; 0x5e <__bad_interrupt> 28: 1a c0 rjmp .+52 ; 0x5e <__bad_interrupt> 0000002a <__ctors_end>: 2a: 11 24 eor r1, r1 2c: 1f be out 0x3f, r1 ; 63 2e: cf e5 ldi r28, 0x5F ; 95 30: d2 e0 ldi r29, 0x02 ; 2 32: de bf out 0x3e, r29 ; 62 34: cd bf out 0x3d, r28 ; 61 00000036 <__do_copy_data>: 36: 10 e0 ldi r17, 0x00 ; 0 38: a0 e6 ldi r26, 0x60 ; 96 3a: b0 e0 ldi r27, 0x00 ; 0 3c: ec e7 ldi r30, 0x7C ; 124 3e: f0 e0 ldi r31, 0x00 ; 0 40: 02 c0 rjmp .+4 ; 0x46 <.do_copy_data_start> 00000042 <.do_copy_data_loop>: 42: 05 90 lpm r0, Z+ 44: 0d 92 st X+, r0 00000046 <.do_copy_data_start>: 46: a0 36 cpi r26, 0x60 ; 96 48: b1 07 cpc r27, r17 4a: d9 f7 brne .-10 ; 0x42 <.do_copy_data_loop> 0000004c <__do_clear_bss>: 4c: 10 e0 ldi r17, 0x00 ; 0 4e: a0 e6 ldi r26, 0x60 ; 96 50: b0 e0 ldi r27, 0x00 ; 0 52: 01 c0 rjmp .+2 ; 0x56 <.do_clear_bss_start> 00000054 <.do_clear_bss_loop>: 54: 1d 92 st X+, r1 00000056 <.do_clear_bss_start>: 56: a0 36 cpi r26, 0x60 ; 96 58: b1 07 cpc r27, r17 5a: e1 f7 brne .-8 ; 0x54 <.do_clear_bss_loop> 5c: 01 c0 rjmp .+2 ; 0x60 <main> 0000005e <__bad_interrupt>: 5e: d0 cf rjmp .-96 ; 0x0 <__heap_end> 00000060 <main>: #include <util/delay.h> #define F_CPU 8000000UL // 8 MHz int main(void) // начало основой программы { 60: 8f ef ldi r24, 0xFF ; 255 62: 81 bb out 0x11, r24 ; 17 64: 2f ef ldi r18, 0xFF ; 255 66: e0 e0 ldi r30, 0x00 ; 0 68: f0 e0 ldi r31, 0x00 ; 0 DDRD = 0xff; /* все выводы порта D сконфигурировать как выходы */ while (1) { // Бесконечный цикл PORTD = 0xff; /* установить "1" на всех линиях порта D */ 6a: 22 bb out 0x12, r18 ; 18 milliseconds can be achieved. */ void _delay_loop_2(uint16_t __count) { __asm__ volatile ( 6c: cf 01 movw r24, r30 6e: 01 97 sbiw r24, 0x01 ; 1 70: f1 f7 brne .-4 ; 0x6e <main+0xe> _delay_ms(1000); // Ждем 1 сек. PORTD = 0x00; /* установить "0" на всех линиях порта D */ 72: 12 ba out 0x12, r1 ; 18 74: cf 01 movw r24, r30 76: 01 97 sbiw r24, 0x01 ; 1 78: f1 f7 brne .-4 ; 0x76 <main+0x16> 7a: f7 cf rjmp .-18 ; 0x6a <main+0xa> Пробовал так же этот код: .include "m8535def.inc" .def TMP = R16 .def VERT = R17 .def COUNT1 = R18 .def COUNT2 = R19 .def COUNT3 = R20 .org 0 reset: ldi TMP, 0xFF out DDRD, TMP enable: ldi TMP, 0xFF out PORTD, TMP ldi COUNT3, 16 wait1: dec COUNT1 brne wait1 dec COUNT2 brne wait1 dec COUNT3 brne wait1 disable: ldi TMP, 0x00 out PORTD, TMP ldi COUNT3, 16 wait2: dec COUNT1 brne wait2 dec COUNT2 brne wait2 dec COUNT3 brne wait2 rjmp enable Результат - светодиод горит постоянно, осциллограмма не изменилась. Изменено 25 июля, 2008 пользователем TwisteR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flasher 0 25 июля, 2008 Опубликовано 25 июля, 2008 · Жалоба Попробуй сначала в порт писать 0 до самой первой задержки. Если на осциолограмме что-то будет, значит походе на ватчдог... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Qwertty 0 26 июля, 2008 Опубликовано 26 июля, 2008 · Жалоба У AVR фьюзы как бы "наоборот" - 0 - запрограммирован. Соотетственно WDTON = 0 это включенный ватчдог. Задержка в 1000мс не получится, почитайте в delay.h о ограничениях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться