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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Нужна помощь в прошивании AVR
zombi
сообщение Apr 19 2013, 22:43
Сообщение #16


Гуру
******

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



Согласен с artkam.
Прежде чем браться за программу надобы со схемой разобраться!
Я не схемотехник но схема мне тоже не нравится!!!
Обьясните что должно происходить при выводе в PB4 единицы???
D2 работает от падения напряжения на R4?
R3=0.7 Ома?
Go to the top of the page
 
+Quote Post
Valek
сообщение Apr 20 2013, 04:22
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 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

?
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 20 2013, 07:33
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 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

//*********************************************
//    КОНЕЦ ФАЙЛА
//*********************************************
Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 20 2013, 09:14
Сообщение #19


Гуру
******

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



Цитата(adnega @ Apr 20 2013, 10:33) *
Вот примерчик:

Боюсь тут не тот случай.
Поскольку у тс прерывание есть а выхода из оного нету.
Видать стек нужно инициализировать при старте и каждый раз при входе в прер.
Go to the top of the page
 
+Quote Post
Valek
сообщение Apr 21 2013, 10:21
Сообщение #20


Участник
*

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



Это получается в двух местах инициализацию делать?

Сообщение отредактировал Valek - Apr 21 2013, 10:30
Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 21 2013, 10:53
Сообщение #21


Гуру
******

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



Цитата(Valek @ Apr 21 2013, 13:21) *
Это получается в двух местах инициализацию делать?

В Вашем случае да.
Похоже Вы не понимаете что такое стек зачем он нужен и как работает.
Go to the top of the page
 
+Quote Post
Valek
сообщение Apr 22 2013, 17:04
Сообщение #22


Участник
*

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



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

Сообщение отредактировал Valek - Apr 22 2013, 17:11
Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 22 2013, 18:15
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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

И разберитесь со стеком. Пока не поймёте что это такое двигаться дальше бессмысленно.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Apr 22 2013, 18:34
Сообщение #24


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Покажите ка Вашу инит стека


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Valek
сообщение Apr 24 2013, 15:05
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 25 2013, 07:25
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



За что же вы свою инициализацию стека в область векторов прерывания засунули? blink.gif
Go to the top of the page
 
+Quote Post
Valek
сообщение Apr 25 2013, 10:48
Сообщение #27


Участник
*

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



Цитата(XVR @ Apr 25 2013, 10:25) *
За что же вы свою инициализацию стека в область векторов прерывания засунули? blink.gif

Вообще я ставил инициализацию стека в разные места, не помогает (
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 25 2013, 12:16
Сообщение #28


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Valek @ Apr 25 2013, 14:48) *
Вообще я ставил инициализацию стека в разные места, не помогает (


ОФФ:
Вы знаете - мой сосед шаляпина напевал. Фигня шаляпин, не катит...

По делу:
Строки инициализации стэка это код (который будет оттранслирован в бинарные команды МК и вставлен в _то_место_ которое вы указали).
Адрес вектора сброса ВСЕГДА с нулевого адреса.

А теперь внимательно посмотрите что у вас вышло? Если до нулевого вектора программа и доковыляет, то вот другие аппаратные вектора у вас съехали в зад...
Ассэмблер тем и хорош - что написали, сам дурак. Т.е. он будет вставлять туда и то, только то что вы написали в исходниках.
Откройте для себя директиву
.org
и ставте её в критичных к смещению во флэше местах. Всегда компилятор будет ругаться, если что то налезет на эти адреса при компиляции.
Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 25 2013, 14:23
Сообщение #29


Гуру
******

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



Попробуйте убрать инит.стека везде где Вы его вставили.

А вот эти строки :
Код
sei
EXT_INT0:
    sei

заменить на :
Код
EXT_INT0:
    ldi temp, LOW(RAMEND)
    out SPL, temp  
    sei
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Apr 25 2013, 17:32
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2025 - 20:50
Рейтинг@Mail.ru


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