|
|
  |
МК не отвечает :( |
|
|
|
Jul 25 2008, 17:22
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 25-07-08
Из: Киев
Пользователь №: 39 212

|
Приветствую специалистов! Я недавно начал осваивать микроконтроллеры, решил остановиться на линейке 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 avreal@real.kiev.ua 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 - глухо. Прикрепляю фото программатора и тестовой платы с МК. Кто подскажет, куда копать и как диагностировать неисправность МК? Буду благодарен за любую помощь
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 25 2008, 17:47
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(TwisteR @ Jul 25 2008, 21:22)  По совету с другого форума укоротил шлейф до 10 см и повесил резистор 10К между RESET и VCC, ничего не изменилось. Щупал осциллографом - во время выполнения команды "dump flash 0 20000" на RESET, как и положено - 0, на SCK видны прямоугольные импульсы, на MOSI видна передача данных, а на MISO - глухо. Прикрепляю фото программатора и тестовой платы с МК. Кто подскажет, куда копать и как диагностировать неисправность МК? Буду благодарен за любую помощь  Начните с подачи внешнего тактового сигнала на XTAL1. Avreal умеет это делать сам, но лучше прямо на тестовой плате иметь свой. Хотя бы резонатор керамический со встроенными конденсаторами.
|
|
|
|
|
Jul 25 2008, 19:57
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 25-07-08
Из: Киев
Пользователь №: 39 212

|
Цитата(Qwertty @ Jul 25 2008, 19:47)  Начните с подачи внешнего тактового сигнала на XTAL1. Avreal умеет это делать сам, но лучше прямо на тестовой плате иметь свой. Хотя бы резонатор керамический со встроенными конденсаторами. Спасибо большое, всё заработало. Я думал, что если к XTAL1 и 2 ничего не подключено - будет использоваться встроенный осциллятор. Теперь другой вопрос - нужен ли внешний генератор или кварцевый резонатор, если при программировании я указал частоту встроенного: CODE 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/avrealbug-reports, suggestions and so on mail to avreal@real.kiev.ua 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 CODE 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. Впрочем, это не существенно, т.к. МК программируется нормально. Просто интересно  И третий вопрос. Я прошил МК простой программкой, вот её код: CODE #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) светодиод, отключил программатор, но светодиод так и не замигал. Зато на осциллографе я увидел то, что в аттаче. Где моя ошибка? Заранее большое спасибо за ответы.
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 25 2008, 22:03
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 25-07-08
Из: Киев
Пользователь №: 39 212

|
Цитата(Flasher @ Jul 25 2008, 23:33)  посмотри в ассемблерный листинг, каких комманд он там насовал. Если бы я только что то понимал... CODE 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>
Пробовал так же этот код: CODE .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 Результат - светодиод горит постоянно, осциллограмма не изменилась.
Сообщение отредактировал TwisteR - Jul 25 2008, 22:06
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|