Перейти к содержанию
    

Нужна помощь в прошивании AVR

Согласен с artkam.

Прежде чем браться за программу надобы со схемой разобраться!

Я не схемотехник но схема мне тоже не нравится!!!

Обьясните что должно происходить при выводе в PB4 единицы???

D2 работает от падения напряжения на R4?

R3=0.7 Ома?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Точно! ))) Так и есть. Но если вы повнемательней посмотрите на программу, то увидете, что это генератор с частоттой 125 Гц и скважностью 7/8. Так вот, когда открыт транзистор микроконтроллер питается от конденсатора С1, потом транзистор закрывается и С1 заряжается через R3, R4.

 

А инициализация стека?

            ldi        temp, LOW(RAMEND)
            out        SPL, temp

Добавить в самом начале.

А самое начало это после

Reset:

или после

.cseg
.org 0

?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А самое начало это после

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

//*********************************************
//    КОНЕЦ ФАЙЛА
//*********************************************

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот примерчик:

Боюсь тут не тот случай.

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

Видать стек нужно инициализировать при старте и каждый раз при входе в прер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Valek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

В Вашем случае да.

Похоже Вы не понимаете что такое стек зачем он нужен и как работает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Где у меня ошибка? Почему в симуляторе все работает как надо, а в микроконтроллере нет?

Может можно как-то поблочно программу проверить. Скажем чтобы был просто генератор. Отключить прерывания и оставить только задежки?

Изменено пользователем Valek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Наверное там предполагают что Вы знаете чем отличается команда вызова подпрограммы от команды перехода.

 

Где у меня ошибка? Почему в симуляторе все работает как надо, а в микроконтроллере нет?

Видать такие симуляторы.

 

Может можно как-то поблочно программу проверить. Скажем чтобы был просто генератор. Отключить прерывания и оставить только задежки?

Конечно можно. Попробуйте переписать программу по образу и подобию примерчика ув.adnega

 

И разберитесь со стеком. Пока не поймёте что это такое двигаться дальше бессмысленно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

.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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

За что же вы свою инициализацию стека в область векторов прерывания засунули? :blink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

За что же вы свою инициализацию стека в область векторов прерывания засунули? :blink:

Вообще я ставил инициализацию стека в разные места, не помогает (

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще я ставил инициализацию стека в разные места, не помогает (

 

ОФФ:

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

 

По делу:

Строки инициализации стэка это код (который будет оттранслирован в бинарные команды МК и вставлен в _то_место_ которое вы указали).

Адрес вектора сброса ВСЕГДА с нулевого адреса.

 

А теперь внимательно посмотрите что у вас вышло? Если до нулевого вектора программа и доковыляет, то вот другие аппаратные вектора у вас съехали в зад...

Ассэмблер тем и хорош - что написали, сам дурак. Т.е. он будет вставлять туда и то, только то что вы написали в исходниках.

Откройте для себя директиву

.org

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

А вот эти строки :

sei
EXT_INT0:
    sei

заменить на :

EXT_INT0:
    ldi temp, LOW(RAMEND)
    out SPL, temp  
    sei

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При первом и втором варианте программы, если закоментировать строку 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...