|
|
  |
Мой первый блин), Перехожу на Си |
|
|
|
Oct 7 2009, 07: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();
|
|
|
|
|
Oct 15 2009, 10:24
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 15 2009, 10:44
|

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

|
Цитата(novlev @ Oct 15 2009, 13:24)  но в окне дизасемблера, и при прогоне на эмуляторе есть команда PORTA ^= 0x04 в месте где я ее не ожидал увидеть)... Т е при пошаговом прогоне указатель сначала переходит на строку PORTA ^= 0x04, а только затем возвращается на условие if. Имхо, транслятор "решил" чуть-чуть оптимизировать код. Наверное, Вас это не должно беспокоить, поскольку в листинге хотя и стоит оператор Цитата 104: PORTA ^= 0x04; однако само тело этого оператора, наверное, ниже if (в приведённом Вами фрагменте этого не видно).
|
|
|
|
|
Oct 15 2009, 11:04
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 15 2009, 11:24
|
Частый гость
 
Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645

|
Цитата(Палыч @ Oct 15 2009, 14:12)  Выполняется инструкция по адресу 0х0E, а там 0xFFFF - что не является командой МК. Адрес этот - некий вектор (зависит от типа МК); по-видимуму прерывание по событию (какому-то) разрешены, а процедуры его обработки Вы не написали (или неправильно указали вектор при процедуре)... Учел и это замечание, еще я случайно цеплял программные инструкции, неудачно рассчитал адреса страниц, отсюда и фф после перезаписи страницы. Спасибо.
|
|
|
|
|
Oct 16 2009, 12:11
|
Частый гость
 
Группа: Участник
Сообщений: 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; }
|
|
|
|
|
Oct 19 2009, 07:01
|
Частый гость
 
Группа: Участник
Сообщений: 116
Регистрация: 24-09-06
Пользователь №: 20 645

|
Для перезаписи программы, код обязательно располагать в области бутлоадера, или основная программа может перезаписать сама себя?
Причина редактирования: Нарушение п.3.4 Правил форума.
|
|
|
|
|
Oct 19 2009, 11:28
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 4 2009, 12:23
|

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

|
Цитата(novlev @ Dec 4 2009, 15:01)  приветствую всех! Вопрос - как разместить по конкретному адресу в памяти программы строковые константы?Пишу на си. Код __flash char str[20] @0x0002; Правда если пытаться инициализировать то компилятор требует ",". Может гуру подскажут можно ли инициализировать массив во флеш располагая его по определённому адресу.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|