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

Проблемы с atmega64L

В atmega64L столкнулся с такой проблемой.

Программу пишу на Си в AVRStudio под WINAVR. Текст программы такой:

int main(void)

{

Init_ports();

 

PORTD = 0xC7;

 

while(1);

 

}

 

void Init_ports(void)

{

DDRD = 0x38;

PORTD = 0xCF;

 

return;

}

 

В результате после программирования и включения устройства напржение на PORTD.3 = 1,

а не 0 как должно быть. Создается впечатление что микроконтроллер не выходит из подпрограммы.

Хотя в симуляторе все работает. Если текст подпрограммы вынести в главную функцию, то все работает правильно.

В чем может быть проблема? Может в настройках WINAVR?

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


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

Гм, поглядел доку на WinAvr - он стек ставит сам, если в мэйк файле процессор нормально стоит. Так что сдаюсь, пусть гинекологи поглядят, а я - маляр :)

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


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

В atmega64L столкнулся с такой проблемой.

Программу пишу на Си в AVRStudio под WINAVR. Текст программы такой:

int main(void)

{

Init_ports();

 

PORTD = 0xC7;

 

while(1);

 

}

 

void Init_ports(void)

{

DDRD = 0x38; // 3-бит на вывод

PORTD = 0xCF; // 1 в 3 бите

 

return;

}

 

Чему удивляетесь, 3-й бит сконфигурировар на вывод 1, ее и видите. Стек здесь ни причем.

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


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

Предыдущий пост не читайте, глупость сморозил, проверьте режим WDT, while (1) может дать сброс по WDT и переинициализацию, а там у вас 1.

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


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

Скомпилил, вот что получилось:

  ...
  be:    0e 94 6a 00     call    0xd4; 0xd4 <main>
  c2:    0c 94 71 00     jmp    0xe2; 0xe2 <_exit>

000000c6 <__bad_interrupt>:
  c6:    0c 94 00 00     jmp    0; 0x0 <__vectors>

000000ca <Init_ports>:
}

void Init_ports(void)
{
    DDRD = 0x38; 
  ca:    88 e3           ldi    r24, 0x38; 56
  cc:    81 bb           out    0x11, r24; 17
    PORTD = 0xCF; 
  ce:    8f ec           ldi    r24, 0xCF; 207
  d0:    82 bb           out    0x12, r24; 18
  d2:    08 95           ret

000000d4 <main>:
  d4:    88 e3           ldi    r24, 0x38; 56
  d6:    81 bb           out    0x11, r24; 17
  d8:    8f ec           ldi    r24, 0xCF; 207
  da:    82 bb           out    0x12, r24; 18
  dc:    87 ec           ldi    r24, 0xC7; 199
  de:    82 bb           out    0x12, r24; 18
  e0:    ff cf           rjmp    .-2      ; 0xe0 <main+0xc>

Вроде всё нормально. Только Init_ports примерно как inline получилась :)

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


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

похоже дело действительно в wdt

 

использую 1 уровень конфигурации wdt и инициализацию:

void Init_wdt(void)

{

asm volatile("WDR"); //Сброс WDT

 

WDTCR |= (1<<WDCE) | (1<<WDE); //Включение WDT

WDTCR |= (1<<WDP1) | (1<<WDP0); //Период сброса WDT = 140 мс

 

return;

}

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

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


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

похоже дело действительно в wdt

 

использую 1 уровень конфигурации wdt и инициализацию:

void Init_wdt(void)

{

asm volatile("WDR"); //Сброс WDT

 

WDTCR |= (1<<WDCE) | (1<<WDE); //Включение WDT

WDTCR |= (1<<WDP1) | (1<<WDP0); //Период сброса WDT = 140 мс

 

return;

}

 

После while(1) поставте WDR и все станет понятно.

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


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

окончательный вариант такой т. к. нужно одновременно с заданием периода обнулять WDCE

 

void Init_wdt(void)

{

asm volatile("WDR"); //Сброс WDT

 

WDTCR = (1<<WDCE) | (1<<WDE); //Включение WDT

WDTCR = (1<<WDE) | (1<<WDP0) | (1<<WDP1); //Период сброса WDT = 140 ??

 

return;

}

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


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

В майне то прописали сброс ватчдога?

 

while(1){
asm volatile("WDR"); //Сброс WDT
};

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


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

Может просто фуз M103C вырубить надо?

А если оставить его активным, то учесть что:

.........

The user must have set unused I/O bits to 0 in ATmega103 programs

Весь список на 5 странице полного даташита.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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