Перейти к содержанию
    

МК не отвечает :(

Приветствую специалистов!

Я недавно начал осваивать микроконтроллеры, решил остановиться на линейке 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 - глухо.

 

Прикрепляю фото программатора и тестовой платы с МК.

 

Кто подскажет, куда копать и как диагностировать неисправность МК? Буду благодарен за любую помощь :)

post-39212-1217006398_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По совету с другого форума укоротил шлейф до 10 см и повесил резистор 10К между RESET и VCC, ничего не изменилось. Щупал осциллографом - во время выполнения команды "dump flash 0 20000" на RESET, как и положено - 0, на SCK видны прямоугольные импульсы, на MOSI видна передача данных, а на MISO - глухо.

 

Прикрепляю фото программатора и тестовой платы с МК.

 

Кто подскажет, куда копать и как диагностировать неисправность МК? Буду благодарен за любую помощь :)

Начните с подачи внешнего тактового сигнала на XTAL1. Avreal умеет это делать сам, но лучше прямо на тестовой плате иметь свой. Хотя бы резонатор керамический со встроенными конденсаторами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прочитайте "Отчет от замене AT90S2313 на ATtiny2313" на http://caxapa.ru/?id=36834 - может быть у вас нечто подобное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Начните с подачи внешнего тактового сигнала на 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) светодиод, отключил программатор, но светодиод так и не замигал. Зато на осциллографе я увидел то, что в аттаче. Где моя ошибка?

Заранее большое спасибо за ответы.

post-39212-1217015873_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

посмотри в ассемблерный листинг, каких комманд он там насовал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

посмотри в ассемблерный листинг, каких комманд он там насовал.

Если бы я только что то понимал... :biggrin:

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

Результат - светодиод горит постоянно, осциллограмма не изменилась.

Изменено пользователем TwisteR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуй сначала в порт писать 0 до самой первой задержки. Если на осциолограмме что-то будет, значит походе на ватчдог...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У AVR фьюзы как бы "наоборот" - 0 - запрограммирован. Соотетственно WDTON = 0 это включенный ватчдог.

Задержка в 1000мс не получится, почитайте в delay.h о ограничениях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...