Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Anastasiya22
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 9
1

Atmel Studio

01.07.2016, 14:26. Просмотров 772. Ответов 12
Метки нет (Все метки)

помогите написать программу работы светофора на языке Assembler
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2016, 14:26
Ответы с готовыми решениями:

Почему AVR Studio 4, а не Atmel Studio 6?
По какой причине большинство специалистов по AVR микроконтроллерам в основном используют AVR Studyo...

Atmel Studio
Подскажите где смотреть библиотеку Atmel Studio.

Atmel studio 6.1
Здравствуйте. столкнулся с проблемой запуска программы. вылетает сообщение:debugging tool is not...

Atmel studio 6
Вопрос таков, есть некая библиотека, в lcd_lib.h прототипы, в lcd_lib.c сами функции, оба файла...

Atmel Studio 6.0
Здравствуйте! Подскажите пожалуйста , не пойму почему при запуске программы компилятор выдает : ...

12
pyzhman
809 / 499 / 70
Регистрация: 15.05.2012
Сообщений: 2,826
02.07.2016, 09:56 2
Для нерегулируемого перекрестка:

Assembler
1
2
3
4
5
6
7
8
9
10
11
loop:
ser r16
out PORTB,r16
rcall delay
clr r16
out PORTB,r16
rcall delay
rjmp loop
delay:
;пишем нужную задержку
ret
А какой у вас?
2
ValeryS
Модератор
7523 / 5700 / 736
Регистрация: 14.02.2011
Сообщений: 19,505
Завершенные тесты: 1
02.07.2016, 10:10 3
pyzhman,
0
Rom_Left
3 / 3 / 1
Регистрация: 28.05.2016
Сообщений: 18
02.07.2016, 13:27 4
Отличный код для светофора на ЖД переезде.
0
02.07.2016, 13:27
liv
1166 / 971 / 199
Регистрация: 07.10.2015
Сообщений: 3,106
Завершенные тесты: 1
02.07.2016, 13:37 5
Anastasiya22, так программы не пишутся...
Какой контроллер? Алгоритм работы? Какими портами управлять?
Иначе рискуете получить совсем не то, что надо.
0
Anastasiya22
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 9
02.07.2016, 14:40  [ТС] 6
контроллер Atiny2313, работа светофора на языке Ассемблер 6.0. Портами B.
0
Rom_Left
3 / 3 / 1
Регистрация: 28.05.2016
Сообщений: 18
02.07.2016, 16:34 7
Anastasiya22, у меня для вас есть готовое решение, но придется поработать руками. Вы готовы ?
0
liv
1166 / 971 / 199
Регистрация: 07.10.2015
Сообщений: 3,106
Завершенные тесты: 1
02.07.2016, 17:04 8
Вот, нарисовал на скорую руку
Предполагается использование tiny2313 на внутреннем осцилляторе с делителем на 8 (режим по-умолчанию)
Т.е., программа рассчитана на частоту 1 МГц
Вся работа ведется в прерывании таймера.
Зеленый фонарь светофора в течение последних секунд времени будет моргать три раза (все по-настоящему!)
Время свечения красного, желтого и зеленого в секундах задается константами.
В общем, смотрите комментарии...

PS Программа писалась в AVRStudio
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
.include    "tn2313def.inc"
 
.equ    F_CPU               = 1000000           ;внутренняя частота tiny2323 с делителем на 8
 
.equ    CTCNT1              = (F_CPU/64)        ;константа для формирования интервала времени 1 сек
 
;----------------------
.equ    PORT_LIGHTS         = PORTB
.equ    DDR_LIGHTS          = DDRB
.equ    PIN_LIGHTS          = PINB
.equ    b_Red               = PB0
.equ    b_Yellow            = PB1
.equ    b_Green             = PB2
 
;----------------------
.equ    RED_COUNT           = 15                ;15 sec - время красного
.equ    YELLOW_COUNT        = 5                 ;5 sec - желтого
.equ    GREEN_COUNT         = 15                ;15 sec - зеленого
 
.equ    GREEN_WINK          = 6                 ;для моргания зеленого на последних секундах
 
;----------------------
.def    CR0                 = r2                ;регистр для хранения нуля
.def    mode                = r16               ;режим работы
.def    temp                = r17               ;временный регистр
 
.def    count               = r18               ;счетчик секунд
 
.CSEG
    .org    0
rjmp    begin
    .org    INT0addr    ;External Interrupt Request 0
    reti
    .org    INT1addr    ;External Interrupt Request 1
    reti
    .org    ICP1addr    ;Input Capture1 Interrupt
    reti
    .org    OC1Aaddr    ;Timer/Counter1 Compare Match A
rjmp    OV1A_routine                            ;вся работа в таймере 1
    .org    OVF1addr    ;Overflow1 Interrupt
    reti
    .org    OVF0addr    ;Overflow0 Interrupt
    reti
    .org    URXC0addr   ;USORT0 Receive Complete Interrupt
    reti
    .org    UDRE0addr   ;USORT0 Data Register Empty Interrupt
    reti
    .org    UTXC0addr   ;USORT0 Transmit Complete Interrupt
    reti
    .org    ACIaddr     ;Analog Comparator Interrupt
    reti
    .org    PCIaddr     ;Pin Change Interrupt
    reti
    .org    OC1Baddr    ;Timer/Counter1 Compare Match B
    reti
    .org    OC0Aaddr    ;Timer/Counter0 Compare Match A
    reti
    .org    OC0Baddr    ;Timer/Counter0 Compare Match B
    reti
    .org    USI_STARTaddr   ;USI start interrupt
    reti
    .org    USI_OVFaddr ;USI overflow interrupt
    reti
    .org    ERDYaddr    ;EEPROM write complete
    reti
    .org    WDTaddr     ;Watchdog Timer Interrupt
    reti
 
begin:
    ldi     temp, low(RAMEND)
    out     SPL, temp                       ;вершина стека
 
    rcall   Init                            ;настройка параметров
 
    sei                                     ;глобальное разрешение прерываний
 
main_loop:                                  ;основной цикл
    wdr                                     ;он пустой, только сбрасываем watchdog
    rjmp    main_loop
 
;---------------------
Init:                                       ;настройка параметров
    clr     CR0                             ;обнулим регистр
 
    ldi     temp, (1<<b_Red)|(1<<b_Yellow)|(1<<b_Green)
    out     DDR_LIGHTS, temp                ;управление цетами настраиваем на выход
    out     PORT_LIGHTS, CR0                ;тушим все
 
; Timer1, CTC mode, делитель 1/64
    ldi     temp, (1<<WGM12)|(1<<CS11)|(1<<CS10)
    out     TCCR1B, temp                    ;делитель на 1/64, режим CTC
    ldi     temp, high(CTCNT1)
    out     OCR1AH, temp                    ;настраиваем регистры OCR1A
    ldi     temp, low(CTCNT1)
    out     OCR1AL, temp
 
    ldi     temp, (1<<OCIE1A)               ;разрешаем прерывание от сравнения А таймера 1
    out     TIMSK, temp
 
    clr     mode                            ;режим = 0 (начинаем с красного цвета)
    ldi     count, RED_COUNT                ;счетчик красного
    ret
 
;---------------------
OV1A_routine:                               ;вся работа здесь, в прерывании
                                            ;т.к. основной цикл пустой, то используемые регистры
                                            ;мы не будем сохранять. Они используются только здесь!
    ldi     ZL, low(mode_routines)
    ldi     ZH, high(mode_routines)         ;адрес тавлицы подпрограмм
    add     ZL, mode                        ;режим
    adc     ZH, CR0
    icall                                   ;косвенный вызов по адресу [Z]
    reti                                    ;выход из прерывания
 
mode_routines:                              ;таблица отработки режимов
    rjmp    red_routine
    rjmp    yellow1_routine
    rjmp    green_routine
    rjmp    yellow2_routine
 
red_routine:                                ;красный цвет
    dec     count                           ;уменьшаем счетчик
 
    ldi     temp, (1<<b_Red)
    out     PORT_LIGHTS, temp               ;включаем красный, остальные гасим
 
    brne    red_routine_ret                 ;счетчик не 0 - выходим
 
    inc     mode                            ;дошли до 0, меняем режим на 1 - желтый (засветится через 1 сек)
    ldi     count, YELLOW_COUNT             ;новый счетчик
red_routine_ret:
    ret
 
yellow1_routine:                            ;желтый - аналогично красному
    dec     count
 
    ldi     temp, (1<<b_Yellow)             ;включаем желтый
    out     PORT_LIGHTS, temp
 
    brne    yellow1_routine_ret
 
    inc     mode                            ;переходим на зеленый
    ldi     count, GREEN_COUNT
yellow1_routine_ret:
    ret
 
green_routine:                              ;зеленый. последние секунды поморгаем фонарем!
    dec     count                           ;уменьшаем счетчик
 
    cpi     count, GREEN_WINK               ;если больше или равно 6, то просто на зажигание зеленого фонаря
    brge    green_set
 
    sbi     PIN_LIGHTS, b_Green             ;начиная с этого момента и до 0, меняем portB.Green на противоподожный!
                                            ;это можно сделать указанной командой!!!
    tst     count                           ;дошли до конца?
    brne    green_routine_ret               ;нет - продолжаем
 
    inc     mode                            ;да - меняем режим на второго желтого
    ldi     count, YELLOW_COUNT
green_routine_ret:
    ret
 
green_set:                                  ;включение зеленого фонаря
    ldi     temp, (1<<b_Green)
    out     PORT_LIGHTS, temp
    ret
 
yellow2_routine:                            ;желтый между зеленым и красным - аналогично красному и первому желтому 
    dec     count
 
    ldi     temp, (1<<b_Yellow)
    out     PORT_LIGHTS, temp
 
    brne    yellow2_routine_ret
 
    clr     mode
    ldi     count, RED_COUNT
yellow2_routine_ret:
    ret
1
Rom_Left
3 / 3 / 1
Регистрация: 28.05.2016
Сообщений: 18
02.07.2016, 20:24 9
Цитата Сообщение от _liv_ Посмотреть сообщение
icall * * * * * * * * * * * * * * * * * ;косвенный вызов по адресу [Z]
в tiny2313 нет такой команды (по-моему)
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
02.07.2016, 20:45 10
Цитата Сообщение от Rom_Left Посмотреть сообщение
в tiny2313 нет такой команды
а где написано что нужно 2313?
0
Rom_Left
3 / 3 / 1
Регистрация: 28.05.2016
Сообщений: 18
02.07.2016, 22:23 11
Витальич, пост №6

Добавлено через 1 час 34 минуты
Нет, я ошибся, комманда icall в attiny2313 таки есть.
1
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,533
04.07.2016, 17:38 12
adc ZH, CR0 <== вот с этим я не согласный.
Во-первых, честно признаться, я немного удивлен, что есть команда сложения с carry-флагом. Во-вторых, надо написать "adc ZH, 0". Иначе при выставленном флаге переноса вашей командой прибавится 2, а не 1, как предполагалось. Либо использовать команду ADD.

PS: перечитал, ем свою шляпу . Все ОК. Можете не объяснять.
0
liv
1166 / 971 / 199
Регистрация: 07.10.2015
Сообщений: 3,106
Завершенные тесты: 1
04.07.2016, 17:52 13
Voland_,
0
04.07.2016, 17:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2016, 17:52

Помощь с Atmel Studio 7
Доброе время суток. У меня такая ситуация с Atmel Studyo 7: перестала видеть хиадеры. полез в...

Atmel Studio 6.1 прерывания
Здравствуйте! Недавно приступил к изучению Atmel Studyo 6.1! Пока пишу на Assemdlere.Возникла такая...

Atmel Studio 7 и Arduino
Добрый день! Раньше у меня была установлена Atmel Studyo 6.2 и плагин Visual Micro и можно было...


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

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

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