zombi 0 19 апреля, 2013 Опубликовано 19 апреля, 2013 · Жалоба Согласен с artkam. Прежде чем браться за программу надобы со схемой разобраться! Я не схемотехник но схема мне тоже не нравится!!! Обьясните что должно происходить при выводе в PB4 единицы??? D2 работает от падения напряжения на R4? R3=0.7 Ома? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Valek 0 20 апреля, 2013 Опубликовано 20 апреля, 2013 · Жалоба Очень уж странная у Вас схема... Здесь получается, что при срабатывании мосфета, питание, подаваемое на контроллер, просаживается до ноля. Точно! ))) Так и есть. Но если вы повнемательней посмотрите на программу, то увидете, что это генератор с частоттой 125 Гц и скважностью 7/8. Так вот, когда открыт транзистор микроконтроллер питается от конденсатора С1, потом транзистор закрывается и С1 заряжается через R3, R4. А инициализация стека? ldi temp, LOW(RAMEND) out SPL, temp Добавить в самом начале. А самое начало это после Reset: или после .cseg .org 0 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 20 апреля, 2013 Опубликовано 20 апреля, 2013 · Жалоба А самое начало это после 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 //********************************************* // КОНЕЦ ФАЙЛА //********************************************* Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 20 апреля, 2013 Опубликовано 20 апреля, 2013 · Жалоба Вот примерчик: Боюсь тут не тот случай. Поскольку у тс прерывание есть а выхода из оного нету. Видать стек нужно инициализировать при старте и каждый раз при входе в прер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Valek 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 (изменено) · Жалоба Это получается в двух местах инициализацию делать? Изменено 21 апреля, 2013 пользователем Valek Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 21 апреля, 2013 Опубликовано 21 апреля, 2013 · Жалоба Это получается в двух местах инициализацию делать? В Вашем случае да. Похоже Вы не понимаете что такое стек зачем он нужен и как работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Valek 0 22 апреля, 2013 Опубликовано 22 апреля, 2013 (изменено) · Жалоба Инициализация стека не спасло ситуацию (((. Мне вот интересно, есть статья http://radiokot.ru/start/mcu_fpga/avr/ там используются такие же команды как у меня в программе, но там ни слова про инициализацию стека. Где у меня ошибка? Почему в симуляторе все работает как надо, а в микроконтроллере нет? Может можно как-то поблочно программу проверить. Скажем чтобы был просто генератор. Отключить прерывания и оставить только задежки? Изменено 22 апреля, 2013 пользователем Valek Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 22 апреля, 2013 Опубликовано 22 апреля, 2013 · Жалоба Инициализация стека не спасло ситуацию (((. Мне вот интересно, есть статья http://radiokot.ru/start/mcu_fpga/avr/ там используются такие же команды как у меня в программе, но там ни слова про инициализацию стека. Наверное там предполагают что Вы знаете чем отличается команда вызова подпрограммы от команды перехода. Где у меня ошибка? Почему в симуляторе все работает как надо, а в микроконтроллере нет? Видать такие симуляторы. Может можно как-то поблочно программу проверить. Скажем чтобы был просто генератор. Отключить прерывания и оставить только задежки? Конечно можно. Попробуйте переписать программу по образу и подобию примерчика ув.adnega И разберитесь со стеком. Пока не поймёте что это такое двигаться дальше бессмысленно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 22 апреля, 2013 Опубликовано 22 апреля, 2013 · Жалоба Покажите ка Вашу инит стека Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Valek 0 24 апреля, 2013 Опубликовано 24 апреля, 2013 (изменено) · Жалоба Покажите ка Вашу инит стека .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) убераешь магнит тухнет светодиод. Изменено 24 апреля, 2013 пользователем Valek Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 25 апреля, 2013 Опубликовано 25 апреля, 2013 · Жалоба За что же вы свою инициализацию стека в область векторов прерывания засунули? :blink: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Valek 0 25 апреля, 2013 Опубликовано 25 апреля, 2013 · Жалоба За что же вы свою инициализацию стека в область векторов прерывания засунули? :blink: Вообще я ставил инициализацию стека в разные места, не помогает ( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 25 апреля, 2013 Опубликовано 25 апреля, 2013 · Жалоба Вообще я ставил инициализацию стека в разные места, не помогает ( ОФФ: Вы знаете - мой сосед шаляпина напевал. Фигня шаляпин, не катит... По делу: Строки инициализации стэка это код (который будет оттранслирован в бинарные команды МК и вставлен в _то_место_ которое вы указали). Адрес вектора сброса ВСЕГДА с нулевого адреса. А теперь внимательно посмотрите что у вас вышло? Если до нулевого вектора программа и доковыляет, то вот другие аппаратные вектора у вас съехали в зад... Ассэмблер тем и хорош - что написали, сам дурак. Т.е. он будет вставлять туда и то, только то что вы написали в исходниках. Откройте для себя директиву .org и ставте её в критичных к смещению во флэше местах. Всегда компилятор будет ругаться, если что то налезет на эти адреса при компиляции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 25 апреля, 2013 Опубликовано 25 апреля, 2013 · Жалоба Попробуйте убрать инит.стека везде где Вы его вставили. А вот эти строки : sei EXT_INT0: sei заменить на : EXT_INT0: ldi temp, LOW(RAMEND) out SPL, temp sei Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaxiMuz 0 25 апреля, 2013 Опубликовано 25 апреля, 2013 · Жалоба При первом и втором варианте программы, если закоментировать строку 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться