Микроконтроллер AT90S2313




Содержание

1. Введение 3

2. Микроконтроллер AT90S2313 4

3. Описание регулятора 8

4. Текст программы 14

5. Вывод 22

6. Список используемых источников 23

 

 

Введение

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

Микроконтроллер AT90S2313

 

Отличительные особенности:

  • AVR® - высокая производительность и RISC архитектура с низким энергопотреблением
  • 118 мощных инструкций - большинство из них выполняются за один такт
  • 2 Кбайт Flash- памяти с поддержкой внутрисистемного программирования SPI- последовательный интерфейс для загрузки программного кода Ресурс: 1000 циклов записи/ стирания
  • 128 байта EEPROM: Ресурс: 100 000 циклов запись/ стирание
  • Рабочие регистры общего назначения 32 х 8
  • 15 программируемых линий I/O
  • Питание VCC: от 2.7 В до 6.0 В
  • Полностью статический режим работы: От 0 до 10 МГц, при питании от 4.0 В до 6.0 В От 0 до 4 МГц, при питании от 2.7 В до 6.0 В
  • Производительность, вплоть до 10 MIPS при 10 МГц
  • Один 8-ми разрядный таймер/ счетчик с отдельным предварительным делителем частоты
  • Один 16-ти разрядный таймер/ счетчик с отдельным предварительным делителем частоты с режимами сравнения и захвата
  • Полнодуплексный UART
  • Выбираемые 8, 9, или 10-ти разрядные режимы широтно- импульсной модуляции (ШИМ)
  • Внешние и внутренние источники прерывания
  • Программируемый следящий таймер с встроенным тактовым генератором
  • Встроенный аналоговый компаратор
  • Экономичные режимы ожидания и пониженного энергопотребления
  • Программируемая блокировка для безопасности программного обеспечения
  • 20 выводов

Блок- схема:

 

Расположение выводов:

Описание:

AT90S2313 является 8-ми разрядным CMOS микроконтроллером с низким энергопотреблением, основанным на усовершенствованной AVR RISC архитектуре. Благодаря выполнению высокопроизводительных инструкций за один период тактового сигнала, AT90S2313 достигает производительности, приближающейся к уровню 1 MIPS на МГц, обеспечивая разработчику возможность оптимизировать уровень энергопотребления в соответствии с необходимой вычислительной производительностью.

Ядро AVR содержит мощный набор инструкций и 32 рабочих регистра общего назначения. Все 32 регистра напрямую подключены к арифметико - логическому устройству (АЛУ), что обеспечивает доступ к двум независимым регистрам при выполнении одной инструкции за один такт. В результате, данная архитектура имеет более высокую эффективность кода, при повышении пропускной способности, вплоть до 10 раз, по сравнению со стандартными микроконтроллерами CISC.

AT90S2313 имеет: 2 Кбайт Flash - памяти с поддержкой внутрисистемного программирования, 128 байт EEPROM, 15 линий I/O общего назначения, 32 рабочих регистра общего назначения, универсальные таймеры/ счетчики с режимами сравнения, внутренние и внешние прерывания, программируемый UART последовательного типа, программируемый следящий таймер с встроенным тактовым генератором и программируемый последовательный порт SPI для загрузки программ в Flash память, а также, два программно выбираемых режима экономии энергопотребления. Режим ожидания «Idle Mode» останавливает CPU, но позволяет функционировать SRAM, таймеру/ счетчикам, SPI порту и системе прерываний. Режим экономии энергопотребления «Power Down» сохраняет значения регистров, но останавливает тактовый генератор, отключая все остальные функции микроконтроллера, вплоть до следующего внешнего прерывания, или до аппаратной инициализации.

Устройство производится с применением технологи энергонезависимой памяти с высокой плотностью размещения, разработанной в корпорации Atmel. Встроенная Flash - память с поддержкой внутрисистемного программирования обеспечивает возможность перепрограммирования программного кода в составе системы, посредством SPI последовательного интерфейса, или с помощью стандартного программатора энергонезависимой памяти. Благодаря совмещению усовершенствованного 8-ми разрядного RISC CPU с Flash- памятью с поддержкой внутрисистемного программирования на одном кристалле получился высокопроизводительный микроконтроллер AT90S2313, обеспечивающий гибкое и экономически- высокоэффективное решение для многих приложений встраиваемых систем управления.

AVR AT90S2313 поддерживается полным набором программ и пакетов для разработки, включая: компиляторы С, макроассемблеры, отладчики/ симуляторы программ, внутрисхемные эмуляторы и наборы для макетирования.

 

 

Описание регулятора

Электронный счетчик, разрабатываемый на замену механическому, получается слишком сложным, если строить его на микросхемах малой и средней степени интеграции (например, серий К176, К561), особенно если необходим реверсивный счет. А чтобы сохранить результат при выключенном питании, необходимо предусмотреть резервную батарею питания.

Но можно построить счетчик всего на одной микросхеме — универсальном программируемом микроконтроллере, имеющем в своем составе разнообразные периферийные устройства и способном решать очень широкий круг задач. Многие микроконтроллеры имеют особую область памяти — EEPROM. Записанные в нее (в том числе во время исполнения программы) данные, например, текущий результат счета, сохраняются и после отключения питания.

В предлагаемом счетчике применен микроконтроллер AT90S2313 из семейства AVR фирмы Almel Подробнее о микроконтроллерах этого семейства можно прочитать в [1]. В приборе реализован реверсивный счет, вывод результата с гашением незначащих нулей на четырехразрядный светодиодный индикатор, хранение результата в EEPROM при выключенном питании. Встроенный в микроконтроллер аналоговый компаратор использован для своевременного обнаружения уменьшения напряжения питания. От аналогичного счетчика на микроконтроллере PIC16FB4 [2] рассматриваемый отличается меньшим числом микросхем и некоторыми дополнительными функциями. Например, он запоминает результат счета при отключении питания, восстанавливая его при включении, и аналогично механическому счетчику снабжен кнопкой обнуления показаний.

Схема счетчика представлена на рис. 1. Шесть линий порта В (РВ2— РВ7) и пять линий порта D (PDO, PD1, PD4—PD6) использованы для организации динамической индикации результата счета на четырех одноразрядных семисегментных светодиодных индикаторах HG1—HG4. Коллекторными нагрузками фототранзисторов VT1 и VT2 служат встроенные в микроконтроллер и включенные программно резисторы, соединяющие соответствующие выводы микроконтроллера с цепью его питания.

Счетчик работает согласно диаграмме, изображенной на рис. 2. Увеличение результата счета N на единицу происходит в момент прерывания оптической связи между излучающим диодом VD1 и фототранзистором VT1, что создает нарастающий перепад уровня на входе INT0 микроконтроллера. При этом уровень на входе INT1 должен быть низким, т. е. фототранзистор VT2 должен быть освещен излучающим диодом VD2. В момент нарастающего перепада на входе INT1 при низком уровне на входе INT0 результат уменьшится на единицу. Другие комбинации уровней и их перепадов на входах INT0 и INT1 результат счета не изменяют.
По достижении максимального значения 9999 счет продолжается с нуля. Вычитание единицы из нулевого значения дает результат 9999. Если обратный счет не нужен, можно исключить из счетчика излучающий диод VD2 и фототранзистор VT2 и соединить вход INT1 микроконтроллера с общим проводом. Счет будет идти только на увеличение.
Как уже сказано, детектором снижения напряжения питания служит встроенный в микроконтроллер аналоговый компаратор. Он сравнивает нестабилизированное напряжение на выходе выпрямителя (диодного моста VD3) со стабилизированным на выходе интегрального стабилизатора DA1. Программа циклически проверяет состояние компаратора. После отключения счетчика от сети напряжение на конденсаторе фильтра выпрямителя С1 спадает, а стабилизированное еще некоторое время остается неизменным. Резисторы R2—R4 подобраны так. что состояние компаратора в этой ситуации изменяется на противоположное. Обнаружив это, программа успевает записать текущий результат счета в EEPROM микроконтроллера еще до прекращения его функционирования по причине выключения питания. При последующем включении программа прочитает число, записанное в ЕЕРРОМ, и выведет его на индикатор. Счет будет продолжен с этого значения.

Ввиду ограниченного числа выводов микроконтроллера для подключения кнопки SB1, обнуляющей счетчик, использован вывод 13, служащий инвертирующим аналоговым входом компаратора (AIM) и одновременно — "цифровым" входом РВ1. Делителем напряжения {резисторы R4, R5) здесь задан уровень, воспринимаемый микроконтроллером как высокий логический При нажатии на кнопку SB1 он станет низким. На состояние компаратора это не повлияет, так как напряжение на входе AIN0 по-прежнему больше, чем на AIN1.

При нажатой кнопке SB1 программа выводит во всех разрядах индикатора знак "минус", а после ее отпускания начинает счет с нуля. Если при нажатой кнопке выключить питание счетчика, текущий результат не будет записан в EEPROM, а хранящееся там значение останется прежним.
Коды, которые необходимо загрузить в программную память микроконтроллера, приведены в таблице. Исходный текст программы написан на языке ассемблера AVR Assembler версии 1.3. Программа построена таким образом, что ее легко адаптировать к счетчику с другими индикаторами (например, с общими катодами), с другой разводкой печатной платы и т. п. Небольшая коррекция программы потребуется и при использовании кварцевого резонатора на частоту, отличающуюся более чем на 1 МГц от указанной.

Счетчик собран на двух односторонних печатных платах одинакового размера из фольгированного стеклотекстолита. Их чертежи приведены на рис. 3. На одной из плат установлены индикаторы HG1—HG4 и кнопка SB1, на другой — остальные детали счетчика, за исключением трансформатора Т1 с плавкой вставкой FU1, излучающих диодов VD1, VD2 и фототранзисторов VT1, VT2, размещенных отдельно.

Контактные площадки Х2.1—Х2.14 одной платы соединены с соответствующими площадками другой отрезками гибкого провода такой длины, чтобы при проверке и налаживании изготовленного прибора платы можно было положить рядом. По окончании налаживания платы складывают печатными проводниками внутрь и соединяют винтами МЗ через изолирующие шайбы.

К контактным площадкам Х1.1—Х1.6 подключают вторичную обмотку трансформатора, фототранзисторы и соединенные последовательно излучающие диоды. Расстояние между оптическими окнами излучающего диода и соответствующего ему фототранзистора не должно превышать 50 мм. Если по условиям применения счетчика этого недостаточно, нужно установить более мощные излучающие диоды, например, АЛ 106А или АЛ123А, и уменьшить номинал резистора R1.

Трансформатор Т1 — ТВК-70-Л2 от лампового телевизора. Подойдет и другой маломощный трансформатор с напряжением на вторичной обмотке 10...20 В.

Налаживание счетчика начинают, не устанавливая микроконтроллер в панель на плате. К контактным площадкам Х1.2, XI.5 вместо вторичной обмотки трансформатора временно подключают регулируемый источник постоянного напряжения.

При напряжении источника 15 В измеряют напряжение на контактах 12 и 13 панели микроконтроллера относительно общего провода (конт.10). Первое должно находиться в интервале 4...4.5 В, а второе — быть больше 3,5 В, но меньше первого. Далее постепенно уменьшают напряжение источника. Когда оно упадет до 9... 10 В, разность значений напряжения на контактах 12 и 13 должна стать кулевой, а затем поменять знак.

Теперь можно установить в панель запрограммированный микроконтроллер, подключить трансформатор и подать на него сетевое напряжение. Спустя 1,5...2 с нужно нажать на кнопку SB1. На индикатор счетчика будет выведена цифра 0. Если на индикатор ничего не выведено, еще раз проверьте значения напряжения на входах AIN0.AIN1 микроконтроллера. Первое должно быть больше второго.

Когда счетчик успешно запущен, остается проверить правильность счета, поочередно затеняя фототранзисторы непрозрачной для ИК лучей пластиной. Для большей контрастности индикаторы желательно закрыть светофильтром из красного органического стекла.

 

Текст программы

; ПРОГРАММА - счетчик электронный (псевдомеханический)

; Автор Рычихин Сергей Александрович

; 19.11.2004 Кварц - 4 МГц

 

.include "2313def.inc"; используемое устройство

 

.def sreg =r0;-> Для хранения регистра SREG

 

.def dataB0 =r1;-> Разряд единиц

.def dataD0 =r16

.def dataB1 =r3;-> Разряд десятков

.def dataD1 =r17

.def dataB2 =r5;-> Разряд сотен

.def dataD2 =r18

.def dataB3 =r7;-> Разряд тысяч

.def dataD3 =r19

 

.def data =r20; -> Вспомогательные регистры

.def temp =r21

 

.def indecod =r22;-> входные данные на декодирование

.def oudecodB =r23;-> выходные декодированные данные для порта B

.def oudecodD =r24;-> выходные декодированные данные для порта D

 

.def count =r25;-> младший байт счетчика

.def count2 =r26;-> старший байт счетчика

 

.CSEG

.org 0

rjmp START; На основную программу

 

.org INT0addr

rjmp Forward;Oбработкa прерывания по INT0 (инкремент)

.org INT1addr

rjmp Back;Oбработкa прерывания по INT1 (декремент)

 

Forward:

sbic PinD,3;если вывод PD3 не 0, то нет инкремента

reti

 

push sreg;записать SREG

inc count;увеличить счетчик на 1

 

mov data,count;младший байт счетчика

andi data,$0F;маска на младшую тетраду

cpi data,$0A;сравним со значением 10

brlo EndInt;если значение меньше 10, то на выход

 

 

andi count,$F0;единицы в ноль

ldi data,$10

add count,data;увеличить десятки на 1

cpi count,$A0

brlo EndInt;если значение меньше 100

 

clr count;очистить младший байт счетчика

inc count2;увеличить сотни на 1

 

mov data,count2

andi data,$0F;маска на младшую тетраду(сотни)

cpi data,$0A;сравним с 10

brlo EndInt;меньше 10

 

andi count2,$F0

ldi data,$10

add count2,data;увеличить тысячи на 1, сотни в 0

cpi count2,$A0

brlo EndInt;если тысячи меньше 10, то на выход

 

clr count;все обнулить

clr count2

rjmp EndInt

 

Back:

sbic PinD,2;если вывод PD2 не 0, то нет инкремента

reti

push sreg;записать SREG

dec count;уменьшить счетчик на 1

 

mov data,count

andi data,$0F

cpi data,$0A;сравним с 10

brlo EndInt;если меньше 10 то на выход

 

 

andi count,$F0

ori count,9;единицы в 9

 

cpi count,$A0

brlo EndInt;если меньше 100, то на выход

 

ldi count,$99;младший байт в 99

dec count2;уменьшить сотни на 1

 

mov data,count2

andi data,$0F

cpi data,$0A;сравним с 10

brlo EndInt;если меньше 10 то на выход

 

andi count2,$F0

ori count2,9;сотни в 9

 

cpi count2,$A0

brlo EndInt;если меньше 10000, то на выход

 

ldi count,$99;счетчик в 9999

ldi count2,$99

 

EndInt:

rcall LeDdecoding;на дешифровку

pop sreg; восстановить SREG

wdr;сбросить стор. таймер

reti

;*************************************************************************

; Начальные установки

;*************************************************************************

START:

ldi temp,$0F

out WDTCR,temp;Включение сторожевого таймера 1,9 секунды.

 

ldi temp,$DF

out SPL,temp;установка указателя стека

ldi temp,0b01001100;выключить индикатор и

out portD,temp;включить подтягивающие резисторы порта D

ldi temp,0b01110011

out DDRD,temp;Направление данных PortD (1)-выходы

ldi temp,0b11111100

out DDRB,temp;Направление данных порта B на вывод,В.1,2 -как входы

out PortB,temp;Выдать данные на порт В

 

rcall LongDelay;программная задержка при включении

wdr;сбросить стор. таймер

 

;**************************************************************************

; Сначала загрузим данные из EEPROM памяти и декодируем их

EEread:

sbic EECR,EEWE;ждем разрешения доступа к EEPROM

rjmp EERead

ldi temp,0

out EEAR,temp;загрузить адрес

sbi EECR,EERE;выдать строб чтения

in count,EEDR;прочитать байт из EEPROM

EEread2:

sbic EECR,EEWE;ждем разрешения доступа к EEPROM

rjmp EERead2

ldi temp,1

out EEAR,temp;загрузить адрес

sbi EECR,EERE;выдать строб чтения

in count2,EEDR;прочитать байт из EEPROM

 

rcall LeDdecoding;дешифровать

 

ldi temp,$C0

out GIMSK,temp;Разрешение прерываний INT0-1 GIMSK

ldi temp,$F

out MCUCR,temp;MCUCR режим прерываний INT0-1 по нарастанию

ldi temp,$C0

out GIFR,temp;предварительный сброс флагов прерываний

sei;Разрешение прерываний

 

; Основная Программа

 

MAIN:

wdr;сбросить стор. таймер

ldi temp,0b01001100

out PortD,temp; выключить знакоместа

out PortB,dataB3;вывести данные на портВ

out PortD,dataD3;вывести данные на портD - индикация тысяч

 

rcall Delay;задержка

 

out PortD,temp

out PortB,dataB2

out PortD,dataD2;индикация сотен

 

rcall Delay

 

out PortD,temp

out PortB,dataB1

out PortD,dataD1;индикация десятков

 

rcall Delay

 

out PortD,temp

out PortB,dataB0

out PortD,dataD0;индикация единиц

 

rcall Delay

 

ButtonRes:

sbic PinB,1;- нажата ли кнопка сброс?

rjmp Dalee;если нет то на метку Dalee

ldi temp,0b11101100; - отобразить знак '-' на всех знакоместах

out portB,temp

ldi temp,0b01101100

out portD,temp

rcall Delay

ldi temp,0b01011100

out portD,temp

rcall Delay

ldi temp,0b01001110

out portD,temp

rcall Delay

ldi temp,0b01001101

out portD,temp

rcall Delay

wdr

sbis PinB,1;- кнопка сброс отпущена?

rjmp ButtonRes;если нет то на метку ButtonRes

 

clr count;обнулить cчетчик

clr count2

rcall LeDdecoding;дешифровать

 

Dalee:

sbic ACSR,ACO;-если питание снято (компаратор в 0)

rjmp MAIN, то пропустить команду

cli; запретить прерывания

ldi temp,0b01001100

out PortD,temp

ldi temp,0b11111100; Выключить индикатор

out PortB,temp

wdr;сбросить стор. таймер

 

EEWrite:;- сохранение данных в EEPROM

sbic EECR,EEWE;ждем разрешения доступа к EEPROM

rjmp EEWrite

ldi temp,0

out EEAR,temp;загрузить адрес в EEPROM

out EEDR,count;загрузить значение мл.байта счетчика

ldi temp,4

out EECR,temp;установить флаги EEMWE в 1, EEWE в 0

sbi EECR,EEWE;выдать строб записи

EEWrite2:

sbic EECR,EEWE; аналогично для старшего байта

rjmp EEWrite2

ldi temp,1

out EEAR,temp

out EEDR,count2

ldi temp,4

out EECR,temp

sbi EECR,EEWE

wdr;сбросить стор. таймер

 

Cykl: sbis ACSR,ACO;проверим детектор наличия U питания

rjmp Cykl

rcall LongDelay;задержка в 0,5 сек

wdr;сбросить стор. таймер

sbis ACSR,ACO

rjmp Cykl

rcall LongDelay;задержка в 0,5 сек

wdr;сбросить стор. таймер

sbis ACSR,ACO

rjmp Cykl

 

;------питание 1 сек. в норме выйти в основной режим

ldi r20,$C0;предварительный сброс флагов

out GIFR,r20

sei;разрешить прерывания

rjmp MAIN;в основной цикл

 

 

;********************* ПОДПРОГРАММЫ*******************************

;дешифровка значения счетчика в 7и сегментные коды

LeDdecoding:

mov indecod,count2

swap indecod

rcall Decod

mov dataB3,oudecodB;тысячи

mov dataD3,oudecodD

cpi indecod,0

breq M100

sbr dataD3,0b000100000

 

M100: mov indecod,count2

rcall Decod

mov dataB2,oudecodB;сотни

mov dataD2,oudecodD

cpi count2,0

breq M10

sbr dataD2,0b000010000

 

M10: mov indecod,count

swap indecod

rcall Decod

mov dataB1,oudecodB;десятки

mov dataD1,oudecodD

cpi count2,0

brne N1

cpi indecod,0

breq M1

N1: sbr dataD1,0b000000010

 

M1: mov indecod,count

rcall Decod

mov dataB0,oudecodB;единицы

mov dataD0,oudecodD

sbr dataD0,0b000000001

 

ret

 

 

; Подпрограмма декодирования шестнадцатиричного значения в семисегментное.

 

Decod:

andi indecod,$F;выделить младшую тетраду декод. байта

cpi indecod,0

breq S0

cpi indecod,1

breq S1

cpi indecod,2

breq S2

cpi indecod,3

breq S3

cpi indecod,4

breq S4

cpi indecod,5

breq S5

cpi indecod,6

breq S6

cpi indecod,7

breq S7

cpi indecod,8

breq S8

cpi indecod,9

breq S9

Blank:

ldi oudecodB,0b11111100;если ничего не совпало, ничего не высвечивать

ldi oudecodD,0b01001100

ret

 

;биты 2 и 3 должны быть всегда в 1, т.к. они включают подтягивающий резистор

;на фототранзисторы

;чтобы определить какому сегменту индикатора соответствует тот или иной бит

;достаточно наложить следующие две строки на соответствующие строки, начина-

;ющиеся с S0 по S9.

; abcdeg__ - сегменты индикатора (порт В)

; f - сегменты индикатора (порт D)

; 76543210 - разряды порта

S0: ldi oudecodB,0b00010000; - 0

ldi oudecodD,0b00001100

ret

S1: ldi oudecodB,0b10110100; - 1

ldi oudecodD,0b01001100

ret

S2: ldi oudecodB,0b00101000; - 2

ldi oudecodD,0b00001100

ret

S3: ldi oudecodB,0b00100000; - 3

ldi oudecodD,0b01001100

ret

S4: ldi oudecodB,0b10000100; - 4

ldi oudecodD,0b01001100

ret

S5: ldi oudecodB,0b01000000; - 5

ldi oudecodD,0b01001100

ret

S6: ldi oudecodB,0b01000000; - 6

ldi oudecodD,0b00001100

ret

S7: ldi oudecodB,0b00110100; - 7

ldi oudecodD,0b01001100

ret

S8: ldi oudecodB,0b00000000; - 8

ldi oudecodD,0b00001100

ret

S9: ldi oudecodB,0b00000000; - 9

ldi oudecodD,0b01001100

ret

 

; Подпрограммы выдержек времени (0,5 сек и 2,5 миллисекунды)

 

LongDelay:;Задержка 0,5 сек

push temp

ldi temp,$85

out TCNT1H,temp;загрузим старший байт Т1

ldi temp,$EE

out TCNT1L,temp;загрузим младший байт Т1

rjmp PUSK

 

Delay:;Задержка 2,5 мсек

push temp

ldi temp,$FF

out TCNT1H,temp;загрузим старший байт Т1

ldi temp,$64

out TCNT1L,temp;загрузим младший байт Т1

 

PUSK:;запуск таймера

ldi temp,3

out TCCR1B,temp;загрузим к-т предделителя Т1 и запустим его

 

LooP:;цикл

in temp,TIFR

sbrs temp,7;таймер-счетчик переполнен?

rjmp LooP

ldi temp,0

out TCCR1B,temp;остановить счетчик таймера

ldi temp,$80

out TIFR,temp;сбросить флаг переполнения таймера

pop temp

ret

 

Вывод

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-07-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: