Форум по микроконтроллерам: Программирование c нуля в AVRStudio 5 - Форум по микроконтроллерам

Перейти к содержимому

  • 13 Страниц +
  • « Первая
  • 9
  • 10
  • 11
  • 12
  • 13
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Программирование c нуля в AVRStudio 5 основы и основные понятия

#201 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 10 Сентябрь 2013 - 15:45

Просмотр сообщенияTurneps (09 Сентябрь 2013 - 21:14) писал:

отладка не будет рулиться из студии, как из MPLAB.

Отладка работает, если в протеусе указать расположение файлов .hex и .asm или .c
0

#202 Пользователь офлайн   vik1977ck 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 2
  • Регистрация: 19 Сентябрь 13

Отправлено 19 Сентябрь 2013 - 16:51

Огромное спасибо уважаемому galrad за столь хорошее и простое освещение программы и команд...Много пелелопатил информации в инете- но у Вас тут все просто,понятно,доступно. :drinks:
0

#203 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 13 Октябрь 2013 - 17:10

Теперь попробуем осилить жидкокристаллический знакосинтезирующий дисплей. Выглядит дисплей таким образом:

Прикрепленное изображение: 1361731142_hd44780_breadboard_02_lrg.jpg

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

Здесь я выложил даташит на русском языке на дисплеии компании МЭЛТ, он полностью совместим с известными дисплеями HD44780, которые дефакто стали стандартом знакосинтезирующих жидкокристаллических индикаторов:
Прикрепленный файл  MT-16S2H.rar (548,2К)
Количество загрузок:: 274

На chipmk.ru есть программа написанная RW1ZK в вариантах на ассемблере и СИ, с понятными комментариями, подключение ЖКИ 2х16 HD44780 по 4-х битной шине к микроконтроллеру ATMega8.

http://forum.chipmk....findpost__p__39

Здесь показан пример применения в качестве анализатора спектра:
http://www.youtube.c...UYPmN5fJhY#t=27

А дальше мы попробуем адаптировать ЖКИ 2х16 HD44780 к нашей конструкции, заменив им семисегментный индикатор...

Сообщение отредактировал galrad: 13 Октябрь 2013 - 17:57

0

#204 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 14 Октябрь 2013 - 20:17

Предлогаю на досуге просмотреть обучающее видео по Atmel Studio 6, выложенное Александром Писанец. Хоть и проект создается для программирования на СИ, но принципы работы программы в ассемблере ни чем не отличаюся. Будет для многих весьма познавательным! Вот ссылочка: http://www.youtube.c...EfWJUoJ6VJ2MEzF

Сообщение отредактировал galrad: 14 Октябрь 2013 - 22:05

0

#205 Пользователь офлайн   vik1977ck 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 2
  • Регистрация: 19 Сентябрь 13

Отправлено 15 Октябрь 2013 - 12:49

Прошу помощи более опытных товарищей...Суть такова- пишу свою вторую второю программу - декриптор кодировок keyloq и starline. И вот столкнулся с двумя засадами- программа AVR studio 6 - при установке пина 2 порта д- не работает прерывание по высокому фронту- хотя в студии 4.19 все срабатывает -но там не считывается правильно регист TCNT0 - хотел попробовать отладить в 6-й Студии.. и вот тут такая засада..))

SETB PORTD,2,R16 ; Вывод PD6 на вход с подтягом
CLRB DDRD,2,R16 ; Чтобы считать кнопку
NOP
ldi temp,0b00000011 ; Разрешаем прерывание по INT0
out MCUCR,temp
ldi temp,0b01000000
out GICR,temp
SEI
И после нет срабатывания прерывания по высокому фронту на ИНТ0 МЕГИ 8 - устанавливаю вручную пин 2 порта д ефект тот же.

Прикрепленные файлы


Сообщение отредактировал vik1977ck: 15 Октябрь 2013 - 13:18

0

#206 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 16 Октябрь 2013 - 14:41

Еслы Вы только учитесь программировать, то рекомендую в начале не пользоваться макросами, или по возможности их расписывать в самой программе, чтобы не возникало досадных недорозумений. О прерываниях я подробно рассказал в одном из постов и мне кажется вполне доступно, просмотрите их еще раз. Рекомендую, перед тем как начать писать программу, составить её алгоритм в виде схемы или простых пунктов, а затем каждый пункт заменить командами микроконтроллера, так очень легко писать программу и в дальнейшем её отлаживать. Если есть как Вам кажется, неразрешимые вопросы, пишите в личку, попробуем разобраться...

Сообщение отредактировал galrad: 20 Октябрь 2013 - 08:49

0

#207 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 16 Октябрь 2013 - 18:40

Непонятные для меня моменты:

Что касается макросов, то их применение очень даже удобно для быстрого создания различных программ, но очень неудобно для начинающих программистов, когда требуется понимание происходящего процесса, а оно написано одной строкой, да еще у разных программистов выглядит по разному, а об унификации и речи быть не может! И начинающие вообще теряются; где команда, а где макрос?

Что касается инициализации программы:
; RAM ========================================================

		.DSEG
.def minprekeyloq=r0
.def maxprekeyloq=r1
.def minprestarline=r2
.def maxprestarline=r3
.def preambulkeyloq=r4
.def preambulstarline=r5
.def temp=r18
.def lenhigh=r19
.def lenlow=r20
.def bufer =r21
.def flag= r22


CCNT:	.byte	4
TCNT:	.byte	4


Я бы исправил

; RAM ========================================================
.def minprekeyloq=r0
.def maxprekeyloq=r1
.def minprestarline=r2
.def maxprestarline=r3
.def preambulkeyloq=r4
.def preambulstarline=r5
.def temp=r18
.def lenhigh=r19
.def lenlow=r20
.def bufer =r21
.def flag= r22

		.DSEG
CCNT:	.byte	4
TCNT:	.byte	4


Не стал бы создавать переменные, которые уже существуют по умолчанию. В разделе памяти .dseg создаются переменные с обозначением их размера в байтах, названия этих переменных произвольные как Вам захочется. Обычно, если программа небольшая и пользовательских переменных не много их прописывают в области регистров общего назначения r0-r31, или даже r16-r31, тогда обращение к этим регистам будет очень простым, как сделано в наших программах Когда, переменные созданы в области .dseg, обращение к ним осуществляется через регистры общего назначения, т.е занимает несколько команд, в этом есть некоторое неудобство. Эти моменты я не рассмативал в предыдущих постах...

Программа зациклена на участке:

 OUTI	TCCR0,11<<CS00 ; Запускаем таймер. Предделитель=8
			SEI
			ldi temp,0x00
			out TCNT0,temp
			nop
            rjmp PC-0x02


А бесконечный цикл написан неправильно:

; Main =========================================================
Main:		SBIC	PIND,2			; Если кнопка нажата - переход
            nop
            rjmp PC-0x03


По крайней мере нужно:
; Main =========================================================
Main:		SBIC	PIND,2			; Если кнопка нажата - переход
            nop
            rjmp PC-0x02
Здесь предполагается опрос кнопки, что в принципе совершенно не нужно, ведь нажание на кнопку вызывает процедуру прерывания и программа должна уйти в подпрограмму поэтому

Main: rjmp Main


Непонятны "вечные циклы" в прерывании... Как только Вы нажмете на кнопку, сработает прерывание и программа окажется в этих циклах, и из них уже никогда не выйдет...

CHECFORVANSTAR:
nop
rjmp PC-0x01

CHECFORNULSTAR:

nop
rjmp PC-0x01


Нужно убрать команды возврата на 1строку назад и вставить команды возврата ret или reti..

В общем это только то, что бросается в глаза...

Сообщение отредактировал galrad: 20 Октябрь 2013 - 07:38

0

#208 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 20 Октябрь 2013 - 11:28

Статей, как подключить дисплей к микроконтроллеру, в сети нашел великое множество, как на Си так и в ассемблере. Чтобы не повторяться рекомендую почитать статью по ссылке: http://cxem.net/mc/book52.php

Примеры очень понятные и весьма рациональные, думаю проблем у вас не возникнет.

Здесь прилагаю файлы из этой статьи:

Прикрепленный файл  utilita_HD44780.rar (184,73К)
Количество загрузок:: 169

Прикрепленный файл  Подпрограммы для HD44780 .rar (2,17К)
Количество загрузок:: 175


Чтобы как обычно все можно было сделать в Proteus, нужно дисплей руссифицировать, иначе на дисплее будут непонятные символы. Для этого используется небольшая утилита. Распакуйте её и просто стартуйте. Естественно Proteus нужно закрыть.После окончания установки, все надписи будут на русском. Но, учтите, что в реальной конструкции дисплей должен быть с русской кириллицой, если не так, то символы будут или китайскими или вполне возможно и еврейскими, это уже под кого заточен сам дисплей...

Прикрепленный файл  LCDALPHA.rar (82,91К)
Количество загрузок:: 146

Для проверки, проект в Proteus:

Прикрепленный файл  Mega8+LCD.rar (31,78К)
Количество загрузок:: 178

Далее попробуем адаптировать эти подпрограммы к ATtiny 2313 и как обещал заменить сегментные индикаторы на ЖКИ дисплей...

Сообщение отредактировал galrad: 20 Октябрь 2013 - 15:01

0

#209 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 09 Ноябрь 2013 - 07:31

На досуге решил просмотреть все скаченные в разное время библиотеки для работы с ЖКИ на базе контроллера hd44780. Оказалось, что полнофункциональные, драйвера имеют очень приличный размер кода, и написаны в виде блоков подпрограмм и макросов, что требуют некоторых усилий для понимания, особенно начинающих. Ещё одна проблема – это совместимость между разными семействами микроконтроллеров. Нередко, изящно написанный драйвер затруднительно адаптировать для другого семейства. Как правило, это связано с использованием аппаратных ресурсов конкретного кристалла. В этом случае использование драйвера ограничивается только однотипными чипами.

А как быть тем, кто впервые держит в руках ЖК дисплей, с огромным желанием заставить его что то показывать, и возможностью эмулировать работу дисплея вПротеусе ?

Конечно, порекомендовал бы драйвер созданный DIHALT-ом, простой, всего два файла, с возможностью подключения на 8 или 4 вывода процессора, достаточно “быстрый” но, Протеус его игнорирует, и проверить его работу можно только на отладочной плате. Вот ссылки.

http://easyelectroni...ya-hd44780.html

http://easyelectroni...ze-hd44780.html

Раньше для работы в Протеусе многие пользовались простым и удобным драйвером по ссылке:

http://en.radzio.dxp...bly-driver.html

как его адаптировать, очень хорошо написано здесь:

http://meandr.org/archives/5130

Этот драйвер, к сожалению перестал компилироваться программой AtmelStudio т.к. в нем не используется директива #define, но с AVRStudio 4 работает без проблем


Есть и другие программы, но порой бывает быстрее написать небольшое приложение самому, чем переделывать чужие...

И еще видео: http://www.youtube.c...e&v=YLBF9YJAgaI

Сообщение отредактировал galrad: 19 Апрель 2015 - 08:45

0

#210 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 11 Ноябрь 2013 - 18:02

Чтобы вы не ломали голову, где найти рабочую библиотеку, я её выкладываю сюда, уже исправленную. Проверить можете в Протеусе, должна получится такая картинка:

Прикрепленное изображение: disply.jpg

Я изменил только название сайта и исправил библиотеку задержек, в остальном автору - респект, саму структуру драйвера не переделывал, поэтому все старые программки компилируются без проблем.

Здесь рабочий проект в Протеусе:

Прикрепленный файл  Project_LCD_HD44780.rar (35,01К)
Количество загрузок:: 163

А тут проект в AtmelStudio6.0:

Прикрепленный файл  Test.rar (22,68К)
Количество загрузок:: 190

Сам драйвер LCD_HD44780:

Прикрепленный файл  hd44780.rar (1,81К)
Количество загрузок:: 164

Команды с которыми работает драйвер:

LCD_WriteData

LCD_WriteCommand

LCD_WriteString

LCD_WriteHexDigit

LCD_WriteHex8

LCD_WriteDecimal

LCD_SetAddressDD

LCD_SetAddressCG

По названию в принципе понятно. Драйвер задействует черыре регистра общего назначения, r16, r17, r18, r19, имейте это в виду, когда будете адаптировать под свои разработки.

Старайтесь создавать переменные в области памяти dseg, например:

.dseg
digit_2: .byte 1
pow_pwm: .byte 1

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

прямое обращение выполняется с помощью команд: lds и sts:

lds r16, digit_2 ; перенести в регистр r16 содержимое переменной digit_2

sts pow_pwm, r16 ; записать в переменную pow_pwm значение регистра r16

Названия переменных - произвольные, какие хотите, как вам нравиться, количество переменных в принципе, не ограничено.

Так, что пробуйте! Пользуйтесь!

Сообщение отредактировал galrad: 11 Ноябрь 2013 - 18:03

0

#211 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 18 Ноябрь 2013 - 21:20

После того, как поменял светодиодные сегментные индикаторы на LCD дисплей, получилась вот такая система управления яркостью светодиода. Программа не оптимизировалась, но в ней заложены основные принципы обработки данных, даже есть участок линейной аппроксимации. Достаточно простой получилась подпрограмма выведения столбиковой диаграммы, да и сложных, закрученных алгоритмов, тоже нет. Итак, вот картинка схемы в Протеусе::

Прикрепленное изображение: LCD_power.jpg

а здесь файлы для эмуляции:

Прикрепленный файл  LED.rar (62,86К)
Количество загрузок:: 156

В архиве библиотека управления LCD дисплеем, сам исходник программы, и .hex файл. Комментариев в некоторых местах нет, (было лень писать....)))) , ну а если не понятно - спрашивайте...

Проверил программу в "железе". Оказалось, что не сохраняет данные в EEPROM, и действитльно, несколько строк недописаны, кроме того, слишком часто происходит опрос энкодера, и появляется реакция на дребезг контактов, поэтому добавил программную задержку. Сделал исправления, теперь все заработало как предполагалось. Теперь, чтобы окончательно связать все основные этапы программирования микроконтроллеров, нужно освоить совсем немного, несколько протоколов последовательной передачи данных, и можно будет делать весьма серьезные вещи. Кроме того, писать программы покомандно, очень утомительно, поэтому большинство программистов создают небольшие макросы или по другому макроопределения, макрокоманды, и пишут программы уже используя их, это во много раз упорщает процесс сотворения программы, но сильно затрудняет чтение программы другими специалистами, ну я уже говорил об этом. Именно из этих соображений, все программы без макросов. Если вам интересны эти статейки - пишите отзывы, рекомендации, свои идеи...

Сообщение отредактировал galrad: 21 Ноябрь 2013 - 18:57

0

#212 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 09 Январь 2014 - 18:14

Уже несколько раз поднимался вопрос о руссификации программы AVR и Atmel Studio. Частично руссифицировать меню вполне возможно. Для этого необходимо скачать русские версии Visual Studio 2010, например ru_visual_studio_2010_ultimate_x86_528427 и обновление mu_visual_studio_2010_sp1_x86_x64_dvd_651704.

После установки Visual Studio 2010, нужно запустить программу AVR или Atmel Studio. В настройках установить: Tools -> Options -> Environment -> International Settings -> русский

Прикрепленное изображение: Tools.jpg

Прикрепленное изображение: International Settings.jpg

В итоге получается руссифицированное меню (отдельные опции остаются англоязычными)

Прикрепленное изображение: русский.jpg

Но, если вы будите давать проектам русские названия программа будет "ругаться". Названия проектов должны быть на латинской транскрипции.




0

#213 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 03 Ноябрь 2014 - 14:53

Практически каждый радиолюбитель начинающий программировать микроконтроллеры, после того как наморгается светодиодами, рано или поздно начинает делать часы. Не знаю, но так уж получается, что большинство программеров проходят этот путь, кто то раньше, а кто-то позже. В нете можно найти множество различных схем и программных решений, но найти очень простые часики бывает не просто, а тем более с исходниками на ассемблере. В свое время я то-же писал программу, но исходники потерялись среди десятков терабайтов информации и чтобы её найти нужно потратить не один день. Конечно, можно было сесть и написать, но зачем, когда я нашел очень оптимальное решение. Итак часики выложены по ссылке: http://radiokot.ru/c...igital/home/33/ автором FrodoB 30.10.88г.
Я сделал минимальные поправки и убрал два резистора, сделав их подтягивающими программно. Схема настолько простая, что собрать её можно буквально за несколько минут.

Прикрепленное изображение: часы_2.jpg

Прикрепленное изображение: часы_3.jpg

Исходники с минимальными исправлениями:

.def Temp1=R16
.def Temp2=R17
.def Chsec=R18				; секунды
.def Presskey=R19			; флаг кнопок
.def Ddp=R20				; запятая

.dseg
Digit: .byte 4

.cseg
.org 0

rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP

;Reset:						; сброс по питанию
INT_0:
INT_1:
Timer1_capt1:

;Timer1_comp1:				; счетчик
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
;************************************Инициализация****************************************
Reset:
ldi Temp1,0b11111111
out ddrb, Temp1				; настройка порта b

ldi Temp1,0b01101100
out ddrd, Temp1				; настройка порта d

ldi Temp1,0b00000011
out Portd, Temp1			; подключение подтягивающих резисторов порта d

ldi Temp1,RamEnd
out SPL,Temp1				; инициализация стека

ldi Temp1,0b01000000
out Timsk,Temp1				; разрешить прерывание компаратора

ldi Temp1,0b00000100
out Tccr1b,Temp1			; тактовый сигнал /256

ldi Temp1,0x3d
out Ocr1ah,Temp1
ldi Temp1,0x09
out Ocr1al,Temp1			; запись числа сравнения 15625 (0.4сек. при 10мгц)

ldi Temp1,0					; установка нуля 
sts Digit,Temp1
sts Digit+1,Temp1
sts Digit+2,Temp1
sts Digit+3,Temp1

ldi Chsec,0					; обнуление счетчика секунд

ldi Presskey,0				; обнуление индикатора кнопок

ldi Ddp,0					; обнуление запятой

ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1			; обнуление счетчика

sei							; разрешение глобальных прерываний


;******************** Программа *********************************************************

Cycle:
rcall Display
rcall Press
rjmp Cycle
;*******************Индикация***********************
Display:

ldi Temp1, 0b00101111
out PortD,Temp1
lds Temp1,Digit
rcall Decoder
out PortB,Temp1
rcall Delay					; индикация 1-ого разряда (мл.)

ldi Temp1, 0b01001111
out PortD,Temp1
lds Temp1,Digit+1
rcall Decoder
out PortB,Temp1
rcall Delay					; индикация 2-ого разряда

ldi Temp1, 0b01100111
out PortD,Temp1
lds Temp1,Digit+2
rcall Decoder
andi Ddp,0b00000001			; обрезка по маске
cpi Ddp,1					; разность 
breq Indicout				; если ноль то индикация без запятой
ldi Temp2,0b00100000
add Temp1,Temp2				; добавление сегмента h запятая
Indicout: out PortB,Temp1
rcall Delay					; индикация 3-ого разряда

ldi Temp1, 0b01101011
out PortD,Temp1
lds Temp1,Digit+3
rcall Decoder
out PortB,Temp1
rcall Delay					; индикация 4-ого разряда

ret

;***********************************Подпрограммы*****************************************

;***********дешифратор*********************************
Decoder:

ldi ZL,Low(Matrix*2)
ldi ZH,High(Matrix*2)
ldi Temp2,0
add ZL,Temp1
adc ZH,Temp2
lpm
mov Temp1,r0

ret
;**********************************************************

;***********массив*****************************************
Matrix:
; 	edhcgafb   edhcgafb
.db 0b11010111,0b00010001	; 0,1
.db 0b11001101,0b01011101	; 2,3
.db 0b00011011,0b01011110	; 4,5
.db 0b11011110,0b00010101	; 6,7
.db 0b11011111,0b01011111	; 8,9
;**********************************************************

;***********задержка***************************************
Delay:
ldi Temp1,0
ldi Temp2,5
dll: dec Temp1
brne dll
dec Temp2
brne dll
ret
;**********************************************************

;***************Обработчик прерывания**********************
Timer1_comp1:

ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1			; обнуление счетчика

inc Ddp						; увелечение запятой

inc Chsec					; увелечение секунд
cpi Chsec,150				; разность 150*0.4c=60c=1мин
brne Output2				; если не ноль то выход

;================================

ldi Chsec,0					; обнуление счетчика секунд

;================================

lds Temp1,Digit				; чтение 1-ого разряда
inc Temp1					; увелечение 1-ого разряда

cpi Temp1,10				; разность
breq Test2					; если  ноль тест2

sts Digit,Temp1				; запись числа 1-ого разряда
rjmp Output2				; выход2

;=================================

Test2:

ldi Temp1,0					; установка нуля 
sts Digit,Temp1				; запись нуля 1-ого разряда

lds Temp1,Digit+1			; чтение 2-ого разряда
inc Temp1					; увелечение 2-ого разряда

cpi Temp1,6					; разность
breq Test3					; если  ноль тест3

sts Digit+1,Temp1			; запись числа 2-ого разряда
rjmp Output2				; выход2


;=================================

Test3:

ldi Temp1,0					; установка нуля 
sts Digit+1,Temp1			; запись нуля 2-ого разряда

lds Temp1,Digit+2			; чтение 3-ого разряда
inc Temp1					; увелечение 3-ого разряда

cpi Temp1,10				; разность
breq Test4					; если  ноль тест4

sts Digit+2,Temp1			; запись числа 3-ого разряда
rjmp Output1				; выход1

;=================================

Test4:

ldi Temp1,0					; установка нуля 
sts Digit+2,Temp1			; запись нуля 3-ого разряда

lds Temp1,Digit+3			; чтение 4-ого разряда
inc Temp1					; увелечение 4-ого разряда

sts Digit+3,Temp1			; запись числа 4-ого разряда
rjmp Output1				; выход 1

;=================================

Output1:

lds Temp1,Digit+3			; чтение 4-ого разряда
cpi Temp1,2					; разность
brne Output2				; если не ноль выход

lds Temp1,Digit+2			; чтение 4-ого разряда
cpi Temp1,4					; разность
brne Output2				; если не ноль выход

ldi Temp1,0
sts Digit+2,Temp1
sts Digit+3,Temp1			; обнуление 3-ого и 4-ого разрядов

Output2:
reti
;**********************************************************

;**************************Обработчик конопок**************
Press:
in Temp1,PinD				; чтение порта d
andi Temp1,0b00000011		; обрезка по маске
cpi Temp1,0b00000011		; разность
breq Nobut					; если ноль (нет нажатых) выход 

;===================================

cpi Temp1,0b00000010
brne Press_hour				; если не ноль то нажата кнопка ред. часов

sub Temp1,Presskey			; разность
breq Outpress				; если ноль, нажата та же кнопка то выход
ldi Presskey,0b00000010		; запись индикатора кнопок


lds Temp1,Digit				; чтение 1-ого разряда
inc Temp1					; увелечение 1-ого разряда

cpi Temp1,10				; разность
breq Tst2					; если  ноль тест2

sts Digit,Temp1				; запись числа 1-ого разряда
rjmp Outpress				; выход

;=================================

Tst2:

ldi Temp1,0					; установка нуля 
sts Digit,Temp1				; запись нуля 1-ого разряда

lds Temp1,Digit+1			; чтение 2-ого разряда
inc Temp1					; увелечение 2-ого разряда

cpi Temp1,6					; разность
breq Tst3					; если  ноль тест3

sts Digit+1,Temp1			; запись числа 2-ого разряда
rjmp Outpress				; выход

;=================================

Tst3:
ldi Temp1,0					; установка нуля 
sts Digit+1,Temp1			; запись нуля 2-ого разряда
rjmp Outpress				; выход
;******************
Press_hour:

sub Temp1,Presskey			; разность
breq Outpress				; если ноль, нажата та же кнопка то выход
ldi Presskey,0b00000001		; запись индикатора кнопок

lds Temp1,Digit+2			; чтение 3-ого разряда
inc Temp1					; увелечение 3-ого разряда
cpi Temp1,10				; разность
breq Tst4					; если  ноль тест4
sts Digit+2,Temp1			; запись числа 3-ого разряда
rjmp Tst24					; проверка на 24

;============================

Tst4:
ldi Temp1,0					; установка нуля 
sts Digit+2,Temp1			; запись нуля 3-ого разряда

lds Temp1,Digit+3			; чтение 4-ого разряда
inc Temp1					; увелечение 4-ого разряда
sts Digit+3,Temp1			; запись числа 4-ого разряда
rjmp Outpress				; выход

Tst24:

lds Temp1,Digit+3			; чтение 4-ого разряда
cpi Temp1,2					; разность
brne Outpress				; если не ноль выход

lds Temp1,Digit+2			; чтение 4-ого разряда
cpi Temp1,4					; разность
brne Outpress				; если не ноль выход

ldi Temp1,0
sts Digit+2,Temp1
sts Digit+3,Temp1			; обнуление 3-ого и 4-ого разрядов

rjmp Outpress				; выход

Nobut:
ldi Presskey,0				; обнуление индикатора кнопок
Outpress:
ret
;**********************************************************



Прикрепленный файл  Proteus.rar (30,89К)
Количество загрузок:: 94


При желании можно поставить кварцевые резонаторы от 1 до 20МГц, пересчитав значения в таймере и время программной задержки

Сообщение отредактировал galrad: 04 Ноябрь 2014 - 06:16

0

#214 Пользователь офлайн   grayling3000 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 20
  • Регистрация: 05 Сентябрь 14

Отправлено 24 Ноябрь 2014 - 23:57

Здравствуйте! У меня вылазеют 3 ошибки:1-Invalid character:'я'(0xef) 2-Invalid character:'кубик нарисован'(0xbf) 3-Invalid character:'кубик'(oxbb) и не получается от них избавиться :unknw:
0

#215 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 29 Ноябрь 2014 - 11:44

Просмотр сообщенияgrayling3000 (24 Ноябрь 2014 - 23:57) писал:

Здравствуйте! У меня вылазеют 3 ошибки:1-Invalid character:'я'(0xef) 2-Invalid character:'кубик нарисован'(0xbf) 3-Invalid character:'кубик'(oxbb) и не получается от них избавиться :unknw:


Если не ошибаюсь во время эмуляции часов, или напишите поподробнее, какая программа в какой ситуации (в программе Proteus или Atmel Studio). Если Proteus, то я моделировал в v7.7, а компилировал в Studio v6.2
0

#216 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 29 Ноябрь 2014 - 12:06

Память задействована лишь на 23%, свободными остаются ноги PD4, PA0, PA1 поэтому в принципе можно дописать функцию будильника и режимы коррекции времени, сделать более разветвленное меню, добавить другие функции... например термометр. Можно освободить еще одну ногу PD1:
Прикрепленное изображение: scr.jpg
Прикрепленный файл  Project_1_clock.rar (31,16К)
Количество загрузок:: 101

Сообщение отредактировал galrad: 29 Ноябрь 2014 - 12:15

0

#217 Пользователь офлайн   grayling3000 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 20
  • Регистрация: 05 Сентябрь 14

Отправлено 29 Ноябрь 2014 - 14:41

Я в программировании не силён и решил его немного освоить.Скачал Proteus и AVR Studio 5.Когда в AVR Studio 5 пишешь программу,для любого устройства,в конце после нажатия клавиши F7 вылезают эти 3 ошибки.Хотя я всё делал так как вы написали и несколько раз проверял,написано идентично вашему,но вылезают эти 3 ошибки :(
0

#218 Пользователь офлайн   grayling3000 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 20
  • Регистрация: 05 Сентябрь 14

Отправлено 29 Ноябрь 2014 - 14:44

Пробовал писать для разных устройств,но во всех случаях появляются эти ошибки!
0

#219 Пользователь офлайн   galrad 

  • Завсегдатай
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 240
  • Регистрация: 26 Февраль 11

Отправлено 30 Ноябрь 2014 - 12:06

Возможно, были ошибки при инсталляции программы AVR Studio 5, я перепроверил - все работает без проблем!
Прикрепленное изображение: компл.jpg
0

#220 Пользователь офлайн   srqemiko 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 2
  • Регистрация: 12 Январь 15

Отправлено 12 Январь 2015 - 23:39

Доброго времени суток! Помогите советом! Пытаюсь написать программу суточного таймера на ATTiny2313 которая будет работать от 8-ми битного таймера счетчика и внешнего генератора на частоте 32Гц подключенного к порту РА2(ХTAL1). И в связи с нехваткой портов хочу использовать порт РА1(ХTAL2)для секундной мигающей точки, так вот проблема в следующем нимогу никак заставить работать порт РА1(ХTAL2)на вывод информации. Фьюзы выставлены следующим образом CKSEL3…0 = 0000 – Внешний тактовый сигнал. Подскажите как правильно сконфигурировать данный порт?
0

Поделиться темой:


  • 13 Страниц +
  • « Первая
  • 9
  • 10
  • 11
  • 12
  • 13
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей