реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблемы с atmega64L
011119xx
сообщение Dec 24 2007, 07:04
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



В 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?
Go to the top of the page
 
+Quote Post
DASM
сообщение Dec 24 2007, 07:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Ну раз проблемы с вызовами - глядим настройки стека.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Dec 24 2007, 07:18
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(DASM @ Dec 24 2007, 12:13) *
Ну раз проблемы с вызовами - глядим настройки стека.

извините, а как?
Go to the top of the page
 
+Quote Post
DASM
сообщение Dec 24 2007, 07:29
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Гм, поглядел доку на WinAvr - он стек ставит сам, если в мэйк файле процессор нормально стоит. Так что сдаюсь, пусть гинекологи поглядят, а я - маляр smile.gif
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Dec 24 2007, 07:47
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(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, ее и видите. Стек здесь ни причем.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Dec 24 2007, 07:54
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



в подпрограмме PORTD = 0xCF, после 0xС7, в результате должен быть PORTD.3 = 0
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Dec 24 2007, 07:55
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Предыдущий пост не читайте, глупость сморозил, проверьте режим WDT, while (1) может дать сброс по WDT и переинициализацию, а там у вас 1.
Go to the top of the page
 
+Quote Post
man with no name
сообщение Dec 24 2007, 08:01
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 6-08-07
Из: Moscow
Пользователь №: 29 586



Скомпилил, вот что получилось:
Код
  ...
  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
Go to the top of the page
 
+Quote Post
011119xx
сообщение Dec 24 2007, 08:21
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



похоже дело действительно в 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 - Dec 24 2007, 08:28
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Dec 24 2007, 08:57
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(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 и все станет понятно.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Dec 24 2007, 09:57
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



окончательный вариант такой т. к. нужно одновременно с заданием периода обнулять 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;
}
Go to the top of the page
 
+Quote Post
GDI
сообщение Dec 24 2007, 10:09
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



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

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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Dec 24 2007, 11:26
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(GDI @ Dec 24 2007, 15:09) *
В майне то прописали сброс ватчдога?

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

да
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Dec 24 2007, 14:00
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Может просто фуз M103C вырубить надо?
А если оставить его активным, то учесть что:
Цитата
.........
The user must have set unused I/O bits to 0 in ATmega103 programs
Весь список на 5 странице полного даташита.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.0166 секунд с 7
ELECTRONIX ©2004-2016