Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/20: Рейтинг темы: голосов - 20, средняя оценка - 4.60
reverse28
0 / 0 / 3
Регистрация: 07.05.2012
Сообщений: 46
1

ATmega16. Управление светодиодом

27.04.2014, 22:07. Просмотров 3881. Ответов 3
Метки нет (Все метки)

День добрый. Имеется задача-организация управления светодиодом по средствам программы proteus, код ес-но должен быть написан на асемблере. Само условие: имеется кнопка, при нажатии на которую диод должен мигать(изменять свое состояние) с периодом 0.14 секунды. при повторном нажатии кнопки, диод гаснет. Удалось реализовать только горение/гашение диода по нажатию кнопки(кстати нажатие имеется ввиду переходный процесс, т.е. фронт импульса 0-1 или 1-0). С мерцанием возникли проблемы. Догадываюсь, что нужно организовать все с помощью задержки, но не ведаю как именно. Вот мои наработки кода(просьба сильно не смеяться, на асемблере никогда не писал). Прошу помочь советом или действом
P.S. Контроллер-ATmega16
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
;включение светодиода по нажатию кнопки,светодиод - PC0;кнопка - PD3.
    .include     "m16def.inc"
    .def     temp=R16       
    .def    temp1=R20
    .Def    N=R17
    .Org    $00
;____ начало кода ____
    .org 0
;____ инициализация стека ____
init:     ldi     temp, low(RAMEND)
    out     SPL, temp        ;вершина стека-конечный адрес ОЗУ
    ldi     temp, high(RAMEND)
    out     SPH, temp
;____ инициализация портов B/B ____
    ldi     temp, 0b00000000
    out     DDRD, temp        ; PD3порт на ввод
    ldi     temp, 0b00001000
    out     PortD, temp        ;подключение внутреннего подтягивающего резистора на PD3,
    ldi     temp, 0b00000001
    out     DDRC, temp             ; PC0 порт на вывод
    Ldi     Temp1,low(Ramend)    ;инициализация указателя стека на конец SRAM
    Out        spl,Temp1
    Ldi        Temp1,high(Ramend)
    Out        Sph,temp1
    Ldi        N,2                ;параметр для формирования задержки в 0.2 с
start:
 
Q1:     sbic     pinD,3    ;обнулен ли 3ий бит?
        rjmp     Q1            ;повторять пока не обнулен
Q2:    sbis     pinD,3    ;установлен ли 3ий бит?
        rjmp     Q2            ;повторять,пока не установлен(вместе с предыдущим действием-нажатие/отжатие кнопки)
        sbis    PortC,0    ;если диод не горел-зажигаем-переход к led1
        RJMP    Led1    
        jmp      start
 
led:    ldi     temp, 0x00       ;гашение диода
        out     PortC,temp
        jmp     start
 
led1:    
        ldi     temp, 0x01       ;зажигание диода
        out     PortC,temp
        Call    Delay_100m        ;вызов подпрограммы задержки
        jmp        led2
         RJMP    Led1  
 
led2:    ldi     temp, 0x00   ;гасим диод
        out     PortC,temp
        sbic     pinD,3    ;проверяем нажата ли кнопка, если нажата, то гасим диод-переход led, если нет-повторяем 
        jmp        led1
        sbis     pinD,3    
        jmp        led1
        jmp        led
 
Delay_100m:    In        Temp1,SREG
            Push    Temp1                ;сохраняем ригистр  слова состояния МК
            Push    R18                    
            Push    R19                   
L1:            Ldi        R18,$F1                ;счетчик внешнего цикла
L2:            Ldi        R19,$FF                ;счетчик внутреннего
L3:        NOP                            
            NOP                           
            NOP                           
            NOP                            
            NOP                            
            NOP
            NOP
            DEC        R19                   ;декремент счетчика внутреннего цикла
            BRNE    L3                    
            DEC        R18                  
            BRNE    L2                    
            DEC        N                   
            Brne    L1                 
            Pop        R19                    ;восстановление регистров
            Pop        R18                   
            Pop        Temp1               
            Out        SREG,Temp1
            Ret
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2014, 22:07
Ответы с готовыми решениями:

Atmega16 управление светодиодом по нажатию двух кнопок
Помогите написать программу. По нажатию кнопки sw1, подключенной к выводу pd2, и одновременном...

ATtiny2313. Управление светодиодом
Пожалуйста помогите доделать программу. нужно, что бы " Разработать устройство управления одним...

Управление светодиодом от кнопки (VMLab)
Здравствуйте. С программе VMLab нужно смоделировать мигание светодиода с кнопкой. Кнопка нажата -...

Управление светодиодом одной кнопкой
Всем привет, прошу проверить код на правильность, у меня AVR ругается, но по алгоритму вроде бы...

Управление RGB светодиодом - разные Vf у разных цветов.
Уважаемые формучане, оцените реализацию задачи! Нужно рулить одним трехваттным RGB светодиодом...

3
Voland_
1688 / 1033 / 97
Регистрация: 04.01.2010
Сообщений: 3,480
27.04.2014, 23:31 2
если умеете писать на Сях, возьмите CV AVR, напишите то что хотите, можно без оптимизации, и получите ASM-файл с необходимым алгоритмом. Для него вам нужно будет выставить соотв.галочку в его настройках.

Что же касается алгоритма - у вас ошибка, начиная со строчки 51:
Assembler
1
2
3
4
5
  call Delay_100m ; // держим погасший светик сколько нужно
  sbic pinD,3 ; проверка на удержание кнопки
  rjmp led1 ; повтор, если кнопка нажата
  rjmp Q1 ; уход на ожидание нажатия кнопки, если кнопку отжали
..
и далее, со строчки 58.

PS: почитайте про команды rjmp и jmp - это одно и то же, только rjmp прыгает на +-127команд вперед или назад, а jmp - по абсолютному адресу. В вашей программе лучше везде использовать rjmp, т.к. программа маленькая однозначно.
1
reverse28
0 / 0 / 3
Регистрация: 07.05.2012
Сообщений: 46
28.04.2014, 00:28  [ТС] 3
Спасибо, ошибку исправил. К сожалению всё еще находится в нерабочем состоянии-при повторном нажатии диод не гаснет.

Что касается CV AVR, я бы и рад, но дело в том, что я студент, а наша система построена таким образом, что сначала проходим C , а потом пытаемся программировать МК на асемблере(и как следствие, всё нужно на асемблере)


Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
    .include    "m16def.inc"
    .def    temp=R16        
    .def    temp1=R20
    .Def    N=R17
    .Org    $00
 
    .org 0
 
init:   ldi     temp, low(RAMEND)
    out     SPL, temp       
    ldi     temp, high(RAMEND)
    out     SPH, temp
 
    ldi     temp, 0b00000000
    out     DDRD, temp      
    ldi     temp, 0b00001000
    out     PortD, temp     
    ldi     temp, 0b00000001
    out     DDRC, temp          
    Ldi     Temp1,low(Ramend)   
    Out     spl,Temp1
    Ldi     Temp1,high(Ramend)
    Out     Sph,temp1
    Ldi     N,2             
start:
 
Q1:     sbic    pinD,3    
        rjmp    Q1          
Q2:     sbis    pinD,3    
        rjmp    Q2          
        sbis    PortC,0   
        RJMP    Led1    
        rjmp    start
 
led:    ldi     temp, 0x00       
        out     PortC,temp
        rjmp    start
 
led1:   
        ldi     temp, 0x01      
        out     PortC,temp
        Call    Delay_100m      
        rjmp    led2
        RJMP    Led1  
 
led2:   ldi     temp, 0x00   
        out     PortC,temp
        sbic    pinD,3    
        rjmp        led1
        call Delay_100m 
        sbic pinD,3 
        rjmp led1 
        rjmp Q1 
 
Delay_100m: In      Temp1,SREG
            Push    Temp1               
            Push    R18                 
            Push    R19                 
L1:         Ldi     R18,$F1             
L2:         Ldi     R19,$FF             
L3:         NOP                          
            NOP                         
            NOP                         
            NOP                         
            NOP                         
            NOP
            NOP
            DEC     R19                 ;ÄåêðåìåГ*ГІ Г±Г·ГҐГІГ·ГЁГЄГ* ГўГ*óòðåГ*Г*ГҐГЈГ® öèêëГ*
            BRNE    L3                  ;åñëè Г*ГҐ îáГ*óëèëñÿ ïðîäîëæГ*ГҐГ¬ ГўГ*óòðåГ*Г*ГЁГ© öèêë
            DEC     R18                 ;âûõîäèì ГЁГ§ ГўГ*ГіГІГ°. öèêëГ*, äåêðåìåГ*ГІ Г±Г·ГҐГІГ·ГЁГЄГ* ГўГ*ГҐГёГ*ГҐГЈГ® öèêëГ*
            BRNE    L2                  ;åñëè Г*ГҐ îáГ*óëèëñÿ ïðîäîëæГ*ГҐГ¬ ГўГ*ГҐГёГ*ГЁГ© öèêë
            DEC     N                   ;î÷åðåäГ*îé ГўГ*ГҐГёГ*ГЁГ© öèêë Г§Г*âåðøèëñÿ, äåêðåìåГ*ГІ ГЇГ*Г°Г*ìåòðГ*
            Brne    L1                  ;åñëè Г*ГҐ 0, Г*Г*Г·ГЁГ*Г*ГҐГ¬ ГўГ±ГҐ Г±Г*Г*Г·Г*Г«Г*, 0 - âûõîäèì ГЁГ§ òðîéГ*îãî öèêëГ*
            Pop     R19                 ;âîññòГ*Г*îâëåГ*ГЁГҐ ðåãèñòðîâ ïåðåä
            Pop     R18                 ;âîçâðГ*òîì ГЁГ§ ïîäïðîãðГ*ììû
            Pop     Temp1               ;èäåò Гў ïîðÿäêå, îáðГ*ГІГ*îì Г§Г*ГЇГЁГ±ГЁ
            Out     SREG,Temp1
            Ret
0
Voland_
1688 / 1033 / 97
Регистрация: 04.01.2010
Сообщений: 3,480
28.04.2014, 11:21 4
Цитата Сообщение от reverse28 Посмотреть сообщение
Что касается CV AVR
вы, очевидно, не поняли идею. CV AVR может из кода Си экспортировать программу в ассемблер, перед линкером. Сложность может лишь в том, что оптимизация сильно режет код, который в итоге сложно изучить.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2014, 11:21

Управление светодиодом по нажатию кнопки (ATMega32, ASM, Proteus)
Работаю в AVR, через Протеус схему сделал и микроконтроллером. Проблема в том, что сначало диод...

Управление потенциометров по SPI из AtMega16
Приветствую. Уже третий день пытаюсь разобраться с косяком.. В Proteuse создал простуйшую...

ATmega16 (VMLAB). Управление светодиодами
Написать программу в AVR, что бы работала в VMLAB: устройство с 4 светодиодами тактовой частотой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru