|
|
  |
Нужна помощь в прошивании AVR |
|
|
|
Apr 20 2013, 04:22
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 19-06-07
Из: Челябинск
Пользователь №: 28 542

|
Цитата(artkam @ Apr 19 2013, 21:34)  Очень уж странная у Вас схема... Здесь получается, что при срабатывании мосфета, питание, подаваемое на контроллер, просаживается до ноля. Точно! ))) Так и есть. Но если вы повнемательней посмотрите на программу, то увидете, что это генератор с частоттой 125 Гц и скважностью 7/8. Так вот, когда открыт транзистор микроконтроллер питается от конденсатора С1, потом транзистор закрывается и С1 заряжается через R3, R4. Цитата(adnega @ Apr 19 2013, 21:42)  А инициализация стека? Код ldi temp, LOW(RAMEND) out SPL, temp Добавить в самом начале. А самое начало это после Код Reset: или после Код .cseg .org 0 ?
|
|
|
|
|
Apr 20 2013, 07:33
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Valek @ Apr 20 2013, 08:22)  А самое начало это после Код Reset: или после Код .cseg .org 0 ? Вот примерчик: Код //--------------------------------------------- // Настройка (HIGH = 0xF9, LOW = 0x7A): // Fclk = 9.6 MHz // BOD = 4.3 V //--------------------------------------------- .include "tn13def.inc" //********************************************* // Константы //********************************************* .equ TO_PULSE = 50 ; Стартовый импульс, мс .equ pulse = PB2 ; Выход OUT_PULSE
//********************************************* // Регистры //********************************************* .def temp = r16
//********************************************* // Сегмент кода //********************************************* .org 0 rjmp RESET RESET: // Настройка стека ldi temp, LOW(RAMEND) out SPL, temp
// Настройка ввода-вывода ldi temp, (1<<pulse) out DDRB, temp
// Настройка аналгового кмпаратора ldi temp, (0<<ACD)|(0<<ACBG) out ACSR, temp
// Стартовый импульс sbi PORTB, pulse ldi temp, TO_PULSE rcall delay_ms
MAINLOOP: // Подать ток sbi PORTB, pulse rcall delay
// Ждать сработки компаратора wait_ac: sbic ACSR, ACO rjmp wait_ac
// Отключить ток cbi PORTB, pulse rcall delay rcall delay rcall delay
rjmp MAINLOOP
//********************************************* // БИБЛИОТЕКИ и ФУНКЦИИ //*********************************************
//--------------------------------------------- // Задержка ms //--------------------------------------------- // Формирует задержку в temp мс. //--------------------------------------------- delay_ms: push temp delay_ms_1: push temp ldi temp,148 delay_ms_2: push temp ldi temp,20 delay_ms_3: dec temp brne delay_ms_3 pop temp dec temp brne delay_ms_2 pop temp dec temp brne delay_ms_1 pop temp
ret
//--------------------------------------------- // Задержка тактирования //--------------------------------------------- delay: ldi temp,9 delay_1: dec temp brne delay_1 ret
//********************************************* // КОНЕЦ ФАЙЛА //*********************************************
|
|
|
|
|
Apr 21 2013, 10:21
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 19-06-07
Из: Челябинск
Пользователь №: 28 542

|
Это получается в двух местах инициализацию делать?
Сообщение отредактировал Valek - Apr 21 2013, 10:30
|
|
|
|
|
Apr 22 2013, 17:04
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 19-06-07
Из: Челябинск
Пользователь №: 28 542

|
Инициализация стека не спасло ситуацию (((. Мне вот интересно, есть статья http://radiokot.ru/start/mcu_fpga/avr/ там используются такие же команды как у меня в программе, но там ни слова про инициализацию стека. Где у меня ошибка? Почему в симуляторе все работает как надо, а в микроконтроллере нет? Может можно как-то поблочно программу проверить. Скажем чтобы был просто генератор. Отключить прерывания и оставить только задежки?
Сообщение отредактировал Valek - Apr 22 2013, 17:11
|
|
|
|
|
Apr 22 2013, 18:15
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(Valek @ Apr 22 2013, 20:04)  Инициализация стека не спасло ситуацию (((. Мне вот интересно, есть статья http://radiokot.ru/start/mcu_fpga/avr/ там используются такие же команды как у меня в программе, но там ни слова про инициализацию стека. Наверное там предполагают что Вы знаете чем отличается команда вызова подпрограммы от команды перехода. Цитата(Valek @ Apr 22 2013, 20:04)  Где у меня ошибка? Почему в симуляторе все работает как надо, а в микроконтроллере нет? Видать такие симуляторы. Цитата(Valek @ Apr 22 2013, 20:04)  Может можно как-то поблочно программу проверить. Скажем чтобы был просто генератор. Отключить прерывания и оставить только задежки? Конечно можно. Попробуйте переписать программу по образу и подобию примерчика ув. adnegaИ разберитесь со стеком. Пока не поймёте что это такое двигаться дальше бессмысленно.
|
|
|
|
|
Apr 24 2013, 15:05
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 19-06-07
Из: Челябинск
Пользователь №: 28 542

|
Цитата(ILYAUL @ Apr 22 2013, 21:34)  Покажите ка Вашу инит стека Код .device ATtiny13A .nolist .include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13Adef.inc" .list
;èíèöèàëåçàöèÿ ñòåêà ldi temp, LOW(RAMEND) out SPL, temp
.def temp = r16 .def Delay1 = r17 .def Delay2 = r18 .def Delay3 = r19
rjmp RESET; Reset Handler rjmp EXT_INT0; IRQ0 Handler reti;rjmp PCINT0; PCINT0 Handler reti;rjmp TIM0_OVF; Timer0 Overflow Handler reti;rjmp EE_RDY; EEPROM Ready Handler reti;rjmp ANA_COMP; Analog Comparator Handler reti;rjmp TIM0_COMPA; Timer0 CompareA Handler reti;rjmp TIM0_COMPB; Timer0 CompareB Handler reti;rjmp WATCHDOG; Watchdog Interrupt Handler reti;rjmp ADC; ADC Conversion Handler
;******************************************************************************* **
Reset: ;èíèöèàëåçàöèÿ ñòåêà ldi temp, LOW(RAMEND) out SPL, temp
;Íàçíà÷àåì âõîäû è âûõîäû ïîðòîâ (0-âõîä, 1-âûõîä) ldi temp, 0b111101 out DDRB, temp
;Âêëþ÷àåì ïîäòÿæêó è çàäàåì íà÷àëüíîå ñîñòîÿíèå âûõîäîâ ldi temp, 0b000010 out PORTB ,temp ;Íàñòðàèâàåì ðåãèñòð MCUCR íà ðàçðåøåíèå ïðåðûâàíèé ñ 0 íà 1 ;è óñòàíàâëèâàåì ðåæèì Power-down ldi temp, 0b00110011 out MCUCR, temp ;ðàçðåøàåì âíåøíèå ïðåðûâàíèÿ íà INT0 ldi temp, 0b01000000 out GIMSK, temp
sei ;ðàçðåøèòü ïðåðûâàíèÿ
EXT_INT0: sei
ldi temp, 0b00110011 out MCUCR, temp sbis PinB, 1;æäåì íàæàòèÿ êíîïêè (0-âûïîëíÿåì, 1-ïðîïóñêàåì) sleep
puch:;æäåì îòïóñêàíèÿ êíîïêè sbic PinB, 1 rjmp puch
;Íàñòðàèâàåì ðàçðåøåíèå ïðåðûâàíèé ñ 1 íà 0 ldi temp, 0b00110010 out MCUCR, temp
Loop: sbi PortB, 4 ;âêëþ÷àåì ñâåòîäèîä
;çàäåðæêà 7 ìèëèñåêóíä ldi Delay1, 0x78 ldi Delay2, 0x05 ldi Delay3, 0x00 rcall Delay
cbi PortB, 4 ;òóøèì ñâåòîäèîä ;çàäåðæêà 1 ìèëèñåêóíäà ldi Delay1, 0xC8 ldi Delay2, 0x00 ldi Delay3, 0x00 rcall Delay
;åñëè êíîïêà íå íàæàòà ïðîäîëæàåì ãîðåòü sbis PinB, 1 rjmp Loop puch1:;æäåì îòïóñêàíèÿ êíîïêè sbic PinB, 1 rjmp puch1 rjmp EXT_INT0 Delay: subi Delay1,1 sbci Delay2,0 sbci Delay3,0 brcc Delay ret При первом и втором варианте программы, если закоментировать строку sleep, то программа работает так - подносишь магнит загорается светодиод (как задумано, со скважностью 7/8) убераешь магнит тухнет светодиод.
Сообщение отредактировал Valek - Apr 24 2013, 14:44
|
|
|
|
|
Apr 25 2013, 10:48
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 19-06-07
Из: Челябинск
Пользователь №: 28 542

|
Цитата(XVR @ Apr 25 2013, 10:25)  За что же вы свою инициализацию стека в область векторов прерывания засунули?  Вообще я ставил инициализацию стека в разные места, не помогает (
|
|
|
|
|
Apr 25 2013, 12:16
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Valek @ Apr 25 2013, 14:48)  Вообще я ставил инициализацию стека в разные места, не помогает ( ОФФ: Вы знаете - мой сосед шаляпина напевал. Фигня шаляпин, не катит... По делу: Строки инициализации стэка это код (который будет оттранслирован в бинарные команды МК и вставлен в _то_место_ которое вы указали). Адрес вектора сброса ВСЕГДА с нулевого адреса. А теперь внимательно посмотрите что у вас вышло? Если до нулевого вектора программа и доковыляет, то вот другие аппаратные вектора у вас съехали в зад... Ассэмблер тем и хорош - что написали, сам дурак. Т.е. он будет вставлять туда и то, только то что вы написали в исходниках. Откройте для себя директиву .org и ставте её в критичных к смещению во флэше местах. Всегда компилятор будет ругаться, если что то налезет на эти адреса при компиляции.
|
|
|
|
|
Apr 25 2013, 14:23
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Попробуйте убрать инит.стека везде где Вы его вставили. А вот эти строки : Код sei EXT_INT0: sei заменить на : Код EXT_INT0: ldi temp, LOW(RAMEND) out SPL, temp sei
|
|
|
|
|
Apr 25 2013, 17:32
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(Valek @ Apr 24 2013, 18:05)  При первом и втором варианте программы, если закоментировать строку sleep, то программа работает так - подносишь магнит загорается светодиод (как задумано, со скважностью 7/8) убераешь магнит тухнет светодиод. не понятно как она у вас вообще запускается, во-первых сделайте как посоветовал zombi или попробуйте вот так: Код .device ATtiny13A .nolist .include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13Adef.inc" .list .def temp = r16 .def Delay1 = r17 .def Delay2 = r18 .def Delay3 = r19 rjmp RESET; Reset Handler rjmp INT0; IRQ0 Handler rjmp PCINT0; PCINT0 Handler reti;rjmp TIM0_OVF; Timer0 Overflow Handler reti;rjmp EE_RDY; EEPROM Ready Handler reti;rjmp ANA_COMP; Analog Comparator Handler reti;rjmp TIM0_COMPA; Timer0 CompareA Handler reti;rjmp TIM0_COMPB; Timer0 CompareB Handler reti;rjmp WATCHDOG; Watchdog Interrupt Handler reti;rjmp ADC; ADC Conversion Handler ;**************************************************************************** *** ** RESET: INT0: ;èíèöèàëåçàöèÿ ñòåêà ldi temp, LOW(RAMEND) out SPL, temp ;Íàçíà÷àåì âõîäû è âûõîäû ïîðòîâ (0-âõîä, 1-âûõîä) ldi temp, 0b111101 out DDRB, temp ;Âêëþ÷àåì ïîäòÿæêó è çàäàåì íà÷àëüíîå ñîñòîÿíèå âûõîäîâ ldi temp, 0b000010 out PORTB ,temp ;Íàñòðàèâàåì ðåãèñòð MCUCR íà ðàçðåøåíèå ïðåðûâàíèé ñ 0 íà 1 ;è óñòàíàâëèâàåì ðåæèì Power-down ldi temp, 0b00110010; вкл.режима Power-down + прерываания PCINT0 + вкл.режима срабатывания INT0 от перехода 1в0 out MCUCR, temp
; точка входа по прерыванию INT0 - Пробуждение из спящего режима ;INT0: ldi temp, 0b000010; устанавливаем слежение за выв.1 out PCMSK,temp ; вкл. прерывания PCINT0 по изменению уровня на выводах ldi temp, 0b00100000 out GIMSK, temp ; задержка от дребезга кнтактов ldi Delay1, 0x78 ldi Delay2, 0x05 ldi Delay3, 0x00 rcall Delay
sei ;ðàçðåøèòü ïðåðûâàíèÿ Loop: sbi PortB, 4 ;âêëþ÷àåì ñâåòîäèîä ;çàäåðæêà 7 ìèëèñåêóíä ldi Delay1, 0x78 ldi Delay2, 0x05 ldi Delay3, 0x00 rcall Delay cbi PortB, 4 ;òóøèì ñâåòîäèîä ;çàäåðæêà 1 ìèëèñåêóíäà ldi Delay1, 0xC8 ldi Delay2, 0x00 ldi Delay3, 0x00 rcall Delay rjmp Loop puch1:;æäåì îòïóñêàíèÿ êíîïêè sbic PinB, 1 rjmp puch1 Delay: subi Delay1,1 sbci Delay2,0 sbci Delay3,0 brcc Delay ret
; Пробуждение из спящего режима INT0:
; Прерывание по нажатию кнопки PCINT0: cbi PortB, 4 ;откл. св.диода ; вкл. прерывания INT0 ldi temp, 0b01000000 out GIMSK, temp sleep reti
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|