011119xx 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба В 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 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба Ну раз проблемы с вызовами - глядим настройки стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
011119xx 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба Ну раз проблемы с вызовами - глядим настройки стека. извините, а как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба Гм, поглядел доку на WinAvr - он стек ставит сам, если в мэйк файле процессор нормально стоит. Так что сдаюсь, пусть гинекологи поглядят, а я - маляр :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба В 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 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба в подпрограмме PORTD = 0xCF, после 0xС7, в результате должен быть PORTD.3 = 0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба Предыдущий пост не читайте, глупость сморозил, проверьте режим WDT, while (1) может дать сброс по WDT и переинициализацию, а там у вас 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
man with no name 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба Скомпилил, вот что получилось: ... 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 получилась :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
011119xx 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 (изменено) · Жалоба похоже дело действительно в 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; } Изменено 24 декабря, 2007 пользователем 011119xx Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба похоже дело действительно в 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 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба окончательный вариант такой т. к. нужно одновременно с заданием периода обнулять 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 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба В майне то прописали сброс ватчдога? while(1){ asm volatile("WDR"); //Сброс WDT }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
011119xx 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба В майне то прописали сброс ватчдога? while(1){ asm volatile("WDR"); //Сброс WDT }; да Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Sam_ 0 24 декабря, 2007 Опубликовано 24 декабря, 2007 · Жалоба Может просто фуз M103C вырубить надо? А если оставить его активным, то учесть что: ......... The user must have set unused I/O bits to 0 in ATmega103 programs Весь список на 5 странице полного даташита. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться