Easyelectronics.ru

Электроника для всех
Текущее время: 23 окт 2018, 12:40

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Самопрограммирование AVR, ATmega48
СообщениеДобавлено: 21 янв 2018, 08:56 
Заглядывает иногда

Зарегистрирован: 14 май 2017, 19:45
Сообщения: 58
Пытаюсь записать в флеш память программ по адресу 400h и 401h значение 0. Но не работает.
Чип ATmega48. Пробовал на ATmega88, тоже не работает. В симуляторе работает, в железе нет. EEPROM и спящий режим не использую.
Где я ошибся?
Код:
test:
  clr r0
  clr r1
  ldi ZL,  Low(0x400)
  ldi ZH, High(0x400)

  ldi XL, (1 << SELFPRGEN)
  rcall Do_SPM; записать r1:r0 в буфер

  ldi XL, (1 << PGWRT) | (1 << SELFPRGEN)
  rcall Do_SPM; записать буфер во флеш
rjmp P0


Do_SPM:
  push XL
  in XL, SPMCSR
  sbrc XL, SELFPRGEN
  rjmp Do_SPM

wait_EE_Do_SPM:
  sbic EECR, EEPE
  rjmp wait_EE_Do_SPM
  pop XL
  cli
  out SPMCSR, XL
  spm
  sei
ret


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Самопрограммирование AVR, ATmega48
СообщениеДобавлено: 21 янв 2018, 11:13 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1336
Откуда: Курск
Фьюз биты проверьте


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Самопрограммирование AVR, ATmega48
СообщениеДобавлено: 21 янв 2018, 11:45 
Заглядывает иногда

Зарегистрирован: 14 май 2017, 19:45
Сообщения: 58
Cthulhu писал(а):
Фьюз биты проверьте

Благодарю! Помогло!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Самопрограммирование AVR, ATmega48
СообщениеДобавлено: 21 янв 2018, 13:03 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3469
Откуда: Новосибирск
Манипуляции с флагом I лучше производить следующим образом:
Код:
//===================================================================
.def RSREG = r4
//===================================================================

//===================================================================
in RSREG, SREG
cli

// bla-bla

out SREG, RSREG
//===================================================================

//===================================================================
in r16, SREG
push r16
cli

// bla-bla

pop r16
out SREG, r16


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Самопрограммирование AVR, ATmega48
СообщениеДобавлено: 21 янв 2018, 14:37 
Старожил
Аватара пользователя

Зарегистрирован: 02 фев 2012, 02:14
Сообщения: 673
Откуда: Вiльна та самостiйна Баварiя
В этом участке
Код:
Do_SPM:
  push XL
  in XL, SPMCSR
  sbrc XL, SELFPRGEN
  rjmp Do_SPM
стэк будет испорчен в случае, если бит SELFPRGEN окажется установленым, поскольку push XL будет повторяться до тех пор, пока этот бит не обнулится.
demiurg1978 писал(а):
Манипуляции с флагом I лучше производить следующим образом:
Код:
in RSREG, SREG
cli

// bla-bla

out SREG, RSREG
Чем же это лучше? Тем, что вместе с флагом I восстановятся и прочие флаги состояния ЦПУ?
А если в этом // bla-bla были вычисления и их результат важен после разрешения прерываний, то изменения флагов будут потеряны для дальнейних проверок!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Самопрограммирование AVR, ATmega48
СообщениеДобавлено: 21 янв 2018, 18:23 
Заглядывает иногда

Зарегистрирован: 14 май 2017, 19:45
Сообщения: 58
Fahivec писал(а):
стэк будет испорчен в случае, если бит SELFPRGEN окажется установленым, поскольку push XL будет повторяться до тех пор, пока этот бит не обнулится.

Упс, не заметил. Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Самопрограммирование AVR, ATmega48
СообщениеДобавлено: 21 янв 2018, 18:53 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3469
Откуда: Новосибирск
Fahivec писал(а):
...

А мозги на что? Чтобы решать, как в том или ином случае поступать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Самопрограммирование AVR, ATmega48
СообщениеДобавлено: 21 янв 2018, 19:25 
Старожил
Аватара пользователя

Зарегистрирован: 02 фев 2012, 02:14
Сообщения: 673
Откуда: Вiльна та самостiйна Баварiя
demiurg1978 писал(а):
Fahivec писал(а):
...

А мозги на что? Чтобы решать, как в том или ином случае поступать.

Сударь пытается мне ответить на вопрос "чем же лучше" или просто хамить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Самопрограммирование AVR, ATmega48
СообщениеДобавлено: 21 янв 2018, 20:07 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3469
Откуда: Новосибирск
Вам никто не хамит. Вы что-то надумываете. Как в анекдоте. "Ах я вру, значит брешу, значит я собака. Мама, он меня сукой назвал!". Запомните, интернет общение воспринимается в разы острее. Вы не видите собеседника, и отсутствие визуального контакта восполняется вашей фантазией. Чистая психология.
В теле программы после сброса флага I ничто не мешает SREG. Этот способ хорош тем, что мы не трогаем флаг I до манипуляций. Сохранили регистр. Сбросили флаг I. После манипуляций вернули состояние SREG взад, что бы там ни было.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Самопрограммирование AVR, ATmega48
СообщениеДобавлено: 21 янв 2018, 20:51 
Старожил
Аватара пользователя

Зарегистрирован: 02 фев 2012, 02:14
Сообщения: 673
Откуда: Вiльна та самостiйна Баварiя
Вот-вот, не всегда этот способ лучше. Лишь в том случае, когда изменения прочих флагов при этих манипуляциях совершенно ненужны.

В противном случае, дабы не повлиять на предидущее состояние флага I и вместе с тем учесть изменения остальных флагов, придется усложнить те части кода, где состояние флага I сохраняется и восстанавливается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Самопрограммирование AVR, ATmega48
СообщениеДобавлено: 21 янв 2018, 21:08 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3469
Откуда: Новосибирск
Попробуйте в следующий раз подумать очень хорошо. Если предлагается какой либо способ, тем более от опытного участника, значит в этом что то есть. А я ассемблерщик с приличным стажем без лишнего хвастовства.
Сброс глобального флага прерываний нужно делать обдуманно. Вариант первый. Не зависимо от того, включено или отключено, сбрасываем флаг.
Вариант второй. Мы не знаем состояние программы и флага. Но в данный конкретный момент точно нужно отключить прерывание. Для такого случая и используется предложенный мной способ.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB