Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с atmega64L
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
011119xx
В 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?
DASM
Ну раз проблемы с вызовами - глядим настройки стека.
011119xx
Цитата(DASM @ Dec 24 2007, 12:13) *
Ну раз проблемы с вызовами - глядим настройки стека.

извините, а как?
DASM
Гм, поглядел доку на WinAvr - он стек ставит сам, если в мэйк файле процессор нормально стоит. Так что сдаюсь, пусть гинекологи поглядят, а я - маляр smile.gif
VladimirYU
Цитата(011119xx @ Dec 24 2007, 11:04) *
В 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, ее и видите. Стек здесь ни причем.
011119xx
в подпрограмме PORTD = 0xCF, после 0xС7, в результате должен быть PORTD.3 = 0
VladimirYU
Предыдущий пост не читайте, глупость сморозил, проверьте режим WDT, while (1) может дать сброс по WDT и переинициализацию, а там у вас 1.
man with no name
Скомпилил, вот что получилось:
Код
  ...
  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 получилась smile.gif
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;
}
VladimirYU
Цитата(011119xx @ Dec 24 2007, 12:21) *
похоже дело действительно в 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 и все станет понятно.
011119xx
окончательный вариант такой т. к. нужно одновременно с заданием периода обнулять 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;
}
GDI
В майне то прописали сброс ватчдога?

Код
while(1){
asm volatile("WDR"); //Сброс WDT
};
011119xx
Цитата(GDI @ Dec 24 2007, 15:09) *
В майне то прописали сброс ватчдога?

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

да
_Sam_
Может просто фуз M103C вырубить надо?
А если оставить его активным, то учесть что:
Цитата
.........
The user must have set unused I/O bits to 0 in ATmega103 programs
Весь список на 5 странице полного даташита.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.