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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Мой первый блин), Перехожу на Си
novlev
сообщение Oct 7 2009, 07:31
Сообщение #31


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Цитата(314 @ Oct 7 2009, 08:49) *
Вот Вам еще довесок из даташита на м640

The Watchdog always on (WDTON) fuse, if programmed, will force the Watchdog Timer to Sys-
tem Reset mode. With the fuse programmed the System Reset mode bit (WDE) and Interrupt

Если не ошибаюсь, то WDTON для м640 из программы не доступен, только с программатора.


Спасибо, получилось. Я просто понял что при подключенном программаторе он в 1. Мда..тогда все работает, так его получилось отключить:
Код
    cli();
    wdt_reset();
    MCUSR &= ~(1<<WDRF);
    WDTCSR |= (1<<WDCE) | (1<<WDE);
    WDTCSR = 0x00;
    sei();
Go to the top of the page
 
+Quote Post
novlev
сообщение Oct 15 2009, 10:24
Сообщение #32


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Всем доброго времени суток, подскажите в чем подвох
CODE

UBRR0 = 0x0033;
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);//|(1<<TXCIE0);
UCSR0C = (1<<UCSZ00)|(1<<UCSZ01);


while(1)
{
if(global_flag.rx_bit)
{
PORTA ^= 0x04;
PORTG |= (1<<1);
PORTG &= ~(1<<1);
global_flag.tx_bit = 1;
global_flag.rx_bit = 0;
}

if(global_flag.tx_bit)
{
global_flag.tx_bit = 0;
for(int i =0; i< 5; i++)
USART_Transmit(data[i]);
}
//wdt_reset ();
//ProgPage(255, *buf);
}
return 0;

}
}


но в окне дизасемблера, и при прогоне на эмуляторе есть команда PORTA ^= 0x04 в месте где я ее не ожидал увидеть)...

CODE

95: UBRR0 = 0x0033;
+000000CA: E383 LDI R24,0x33 Load immediate
+000000CB: E090 LDI R25,0x00 Load immediate
+000000CC: 939000C5 STS 0x00C5,R25 Store direct to data space
+000000CE: 938000C4 STS 0x00C4,R24 Store direct to data space
96: UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);//|(1<<TXCIE0);
+000000D0: E988 LDI R24,0x98 Load immediate
+000000D1: 938000C1 STS 0x00C1,R24 Store direct to data space
97: UCSR0C = (1<<UCSZ00)|(1<<UCSZ01);
+000000D3: E086 LDI R24,0x06 Load immediate
+000000D4: 938000C2 STS 0x00C2,R24 Store direct to data space
104: PORTA ^= 0x04;
+000000D6: E024 LDI R18,0x04 Load immediate
102: if(global_flag.rx_bit)
+000000D7: 91800211 LDS R24,0x0211 Load direct from data space
+000000D9: FF80 SBRS R24,0 Skip if bit in register s


Подскажите, пожалуйста, чего на этот раз не досмотрел?
Т е при пошаговом прогоне указатель сначала переходит на строку PORTA ^= 0x04, а только затем возвращается на условие if.

Сообщение отредактировал novlev - Oct 15 2009, 10:32
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 15 2009, 10:44
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(novlev @ Oct 15 2009, 13:24) *
но в окне дизасемблера, и при прогоне на эмуляторе есть команда PORTA ^= 0x04 в месте где я ее не ожидал увидеть)...
Т е при пошаговом прогоне указатель сначала переходит на строку PORTA ^= 0x04, а только затем возвращается на условие if.
Имхо, транслятор "решил" чуть-чуть оптимизировать код. Наверное, Вас это не должно беспокоить, поскольку в листинге хотя и стоит оператор
Цитата
104: PORTA ^= 0x04;
однако само тело этого оператора, наверное, ниже if (в приведённом Вами фрагменте этого не видно).
Go to the top of the page
 
+Quote Post
novlev
сообщение Oct 15 2009, 11:04
Сообщение #34


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Спасибо, пока оставлю так. Есть еще один вопрос, что означает в сообщение компилятора
Цитата
AVR Simulator: Invalid opcode 0xffff at address 0x0000e0
?
Появляется когда я вызываю процедуру ProgPage(255, buf_w);

CODE
void ProgPage(uint32_t page, uint8_t *buf)
{
eeprom_busy_wait ();
boot_page_erase (page);
boot_spm_busy_wait ();
unsigned short int i;
for (i=0; i<5; i+=2)//SPM_PAGESIZE
{
w = *buf++;
w += (*buf++) << 8;
boot_page_fill (page + i, w);
}
boot_page_write (page);
boot_spm_busy_wait();
boot_rww_enable ();
}


сам указатель обьявлен так -
Код
unsigned char data[6] = {0x01,0x02,0x03,0x04,0x05,0x06};
uint8_t *buf_w = &data[0];

может кто сталкивался - авр студия, компилятор WinAVR
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 15 2009, 11:12
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(novlev @ Oct 15 2009, 14:04) *
что означает в сообщение компилятора ?
Выполняется инструкция по адресу 0х0E, а там 0xFFFF - что не является командой МК. Адрес этот - некий вектор (зависит от типа МК); по-видимуму прерывание по событию (какому-то) разрешены, а процедуры его обработки Вы не написали (или неправильно указали вектор при процедуре)...

P.S. Извиняюсь - не доглядел: адрес то - 0xE0, вряд ли это вектор. Нужно искать: почему Ваша программа попала на столь странный адрес.
Go to the top of the page
 
+Quote Post
novlev
сообщение Oct 15 2009, 11:24
Сообщение #36


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Цитата(Палыч @ Oct 15 2009, 14:12) *
Выполняется инструкция по адресу 0х0E, а там 0xFFFF - что не является командой МК. Адрес этот - некий вектор (зависит от типа МК); по-видимуму прерывание по событию (какому-то) разрешены, а процедуры его обработки Вы не написали (или неправильно указали вектор при процедуре)...

Учел и это замечание, еще я случайно цеплял программные инструкции, неудачно рассчитал адреса страниц, отсюда и фф после перезаписи страницы. Спасибо.
Go to the top of the page
 
+Quote Post
novlev
сообщение Oct 16 2009, 12:11
Сообщение #37


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Снова я) Слолкнулся со следующей ситуацией - пишу страницу во флеш(уже на реальной железяке), операция проходит, но содержимое не изменяется. При верификации читаются прежние значения.Наверное я запутался с лок битами, подскажите какое значение должно вычитываться, при старте FF, это означает что запись разрешена во все области? Менял и на другие...
Вот процедура записи
CODE

void ProgPage(uint32_t page, uint8_t *buf)
{
uint8_t sreg;
sreg = SREG;
cli();

eeprom_busy_wait();
boot_page_erase(page);
boot_spm_busy_wait();
boot_rww_enable();
uint16_t i;
for (i=0; i<SPM_PAGESIZE; i+=2)//SPM_PAGESIZE
{
uint16_t w = *buf++;
w += (*buf++) << 8;
boot_page_fill (page + i, w);
}
boot_page_write (page);
boot_spm_busy_wait();
boot_rww_enable();
SREG = sreg;
}
Go to the top of the page
 
+Quote Post
novlev
сообщение Oct 19 2009, 07:01
Сообщение #38


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Для перезаписи программы, код обязательно располагать в области бутлоадера, или основная программа может перезаписать сама себя?
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
novlev
сообщение Oct 19 2009, 11:28
Сообщение #39


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Подскажите пожалуйста, после записи программы с адреса бутлоадера (0х7000), достаточно только выполнить установку бита IVSEL, или надо еще что-то для использования прерываний? сами обработчики я не менял. После записи программы, прерывания не вызываются((.

CODE
void Move_interrupts(void)
{
unsigned char temp;
temp = MCUCR;
MCUCR = temp|(1<<IVCE);
MCUCR = temp|(1<<IVSEL);
}


Все, спасибо всем, нашел корень всего зла))) неверно рассчитал адрес старта бута.

Сообщение отредактировал novlev - Oct 19 2009, 12:14
Go to the top of the page
 
+Quote Post
novlev
сообщение Dec 4 2009, 11:01
Сообщение #40


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



приветствую всех! Вопрос - как разместить по конкретному адресу в памяти программы строковые константы?Пишу на си.

Сообщение отредактировал novlev - Dec 4 2009, 11:06
Go to the top of the page
 
+Quote Post
novlev
сообщение Dec 4 2009, 12:09
Сообщение #41


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Пробовал на асме, - указывал адрес один, а распологал компилятор по другому адресу.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Dec 4 2009, 12:23
Сообщение #42


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(novlev @ Dec 4 2009, 15:01) *
приветствую всех! Вопрос - как разместить по конкретному адресу в памяти программы строковые константы?Пишу на си.


Код
__flash char str[20] @0x0002;


Правда если пытаться инициализировать то компилятор требует ",".
Может гуру подскажут можно ли инициализировать массив во флеш располагая его по определённому адресу.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 4 2009, 12:38
Сообщение #43


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Так это - стандартно

uint8_t const __flash str_q[] = "Читаем вопрос" @0x2;

Или через #pragma.

Только у вас подход неправильный. Не надо этого делать. Я уже не говорю про адрес, который в области векторов находится. Я говорю вообще про абсолютные адреса.
Каждый должен заниматься своим. Вы - писать программу, LINK-ер размещать данные и код как ему удобно.

За мою практику требовалось только в одном случае фиксировать данные. Это при совместном использовании данных независимыми программами. А именно бутлоадером и приложением. Но и в этом случае необходимо передавать 1-2 значения. Например ссылку на данные.
Go to the top of the page
 
+Quote Post
novlev
сообщение Dec 4 2009, 12:41
Сообщение #44


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Это не совсем программное требование, простоя горожу систему по прожигу 70 блоков (разных но за раз) одним программатором, мне нужнопросто из прошивок вычитывать версии ПО, для этого и хочу чтоб во всех хексах по одному и тому же адресу была информация. "@0x2" - чот не понимает такой синтаксис unsigned char const PROGMEM data[] = "Строка в памяти программ "; - работает, как адрес указать..еще не разобрался. Всем спасибо за помощь.

Сообщение отредактировал novlev - Dec 4 2009, 13:07
Go to the top of the page
 
+Quote Post
novlev
сообщение Dec 4 2009, 14:20
Сообщение #45


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

Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645



Понял, это наверное в IAR-е @0x2 такой синтаксис, у меня авр студия и вин авр, вот тут чот не выходит ничопохожего...
Go to the top of the page
 
+Quote Post

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

 


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


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