Site Loader

Содержание

AVR. Учебный курс. Скелет программы

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

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

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

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

Структура же программы при этом следующая:

  • Макросы и макроопредения
  • Сегмент ОЗУ
  • Точка входа — ORG 0000
  • Таблица векторов — и вектора, ведущие в секцию обработчиков прерываний
  • Обработчики прерываний — тела обработчиков, возврат отсюда только по RETI
  • Инициализация памяти — а вот уже отсюда начинается активная часть программы
  • Инициализация стека
  • Инициализация внутренней периферии — программирование и запуск в работу всяких таймеров, интерфейсов, выставление портов ввода-вывода в нужные уровни. Разрешение прерываний.
  • Инициализация внешней периферии — инициализация дисплеев, внешней памяти, разных аппаратных примочек, что подключены к микроконтроллеру извне.
  • Запуск фоновых процессов — процессы работающие непрерывно, вне зависимости от условий. Такие как сканирование клавиатуры, обновление экрана и так далее.
  • Главный цикл — тут уже идет вся управляющая логика программы.
  • Сегмент ЕЕПРОМ


Начинается все с макросов, их пока не много, если что по ходу добавим.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
	.include "m16def.inc"   ; Используем ATMega16
 
;= Start macro.inc ========================================
   	.macro    OUTI          	
      	LDI    R16,@1
   	.if @0 < 0x40
      	OUT    @0,R16       
   	.else
      	STS      @0,R16
   	.endif
   	.endm
 
   	.macro    UOUT        
   	.if	@0 < 0x40
      	OUT	@0,@1         
	.else
      	STS	@0,@1
   	.endif
   	.endm
;= End 	macro.inc =======================================

.include «m16def.inc» ; Используем ATMega16 ;= Start macro.inc ======================================== .macro OUTI LDI R16,@1 .if @0 < 0x40 OUT @0,R16 .else STS @0,R16 .endif .endm .macro UOUT .if @0 < 0x40 OUT @0,@1 .else STS @0,@1 .endif .endm ;= End macro.inc =======================================

В оперативке пока ничего не размечаем. Нечего.

1
2
3
; RAM ===================================================
		.DSEG
; END RAM ===============================================

; RAM =================================================== .DSEG ; END RAM ===============================================

С точкой входа и таблицей векторов все понятно, следуя нашему давнему шаблону, берем его оттуда:

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
; FLASH ======================================================
         .CSEG
         .ORG $000      ; (RESET) 
         RJMP   Reset
         .ORG $002
         RETI             ; (INT0) External Interrupt Request 0
         .ORG $004
         RETI             ; (INT1) External Interrupt Request 1
         .ORG $006
         RETI	      ; (TIMER2 COMP) Timer/Counter2 Compare Match
         .ORG $008
         RETI             ; (TIMER2 OVF) Timer/Counter2 Overflow
         .ORG $00A
         RETI	     ; (TIMER1 CAPT) Timer/Counter1 Capture Event
         .ORG $00C 
         RETI             ; (TIMER1 COMPA) Timer/Counter1 Compare Match A
         .ORG $00E
         RETI             ; (TIMER1 COMPB) Timer/Counter1 Compare Match B
         .ORG $010
         RETI             ; (TIMER1 OVF) Timer/Counter1 Overflow
         .ORG $012
         RETI             ; (TIMER0 OVF) Timer/Counter0 Overflow
         .ORG $014
         RETI             ; (SPI,STC) Serial Transfer Complete
         .ORG $016
         RETI    	     ; (USART,RXC) USART, Rx Complete
         .ORG $018
         RETI             ; (USART,UDRE) USART Data Register Empty
         .ORG $01A
         RETI             ; (USART,TXC) USART, Tx Complete
         .ORG $01C
         RETI	     ; (ADC) ADC Conversion Complete
         .ORG $01E
         RETI             ; (EE_RDY) EEPROM Ready
         .ORG $020
         RETI             ; (ANA_COMP) Analog Comparator
         .ORG $022
         RETI             ; (TWI) 2-wire Serial Interface
         .ORG $024
         RETI             ; (INT2) External Interrupt Request 2
         .ORG $026
         RETI             ; (TIMER0 COMP) Timer/Counter0 Compare Match
         .ORG $028
         RETI             ; (SPM_RDY) Store Program Memory Ready
 
	 .ORG   INT_VECTORS_SIZE      	; Конец таблицы прерываний

; FLASH ====================================================== .CSEG .ORG $000 ; (RESET) RJMP Reset .ORG $002 RETI ; (INT0) External Interrupt Request 0 .ORG $004 RETI ; (INT1) External Interrupt Request 1 .ORG $006 RETI ; (TIMER2 COMP) Timer/Counter2 Compare Match .ORG $008 RETI ; (TIMER2 OVF) Timer/Counter2 Overflow .ORG $00A RETI ; (TIMER1 CAPT) Timer/Counter1 Capture Event .ORG $00C RETI ; (TIMER1 COMPA) Timer/Counter1 Compare Match A .ORG $00E RETI ; (TIMER1 COMPB) Timer/Counter1 Compare Match B .ORG $010 RETI ; (TIMER1 OVF) Timer/Counter1 Overflow .ORG $012 RETI ; (TIMER0 OVF) Timer/Counter0 Overflow .ORG $014 RETI ; (SPI,STC) Serial Transfer Complete .ORG $016 RETI ; (USART,RXC) USART, Rx Complete .ORG $018 RETI ; (USART,UDRE) USART Data Register Empty .ORG $01A RETI ; (USART,TXC) USART, Tx Complete .ORG $01C RETI ; (ADC) ADC Conversion Complete .ORG $01E RETI ; (EE_RDY) EEPROM Ready .ORG $020 RETI ; (ANA_COMP) Analog Comparator .ORG $022 RETI ; (TWI) 2-wire Serial Interface .ORG $024 RETI ; (INT2) External Interrupt Request 2 .ORG $026 RETI ; (TIMER0 COMP) Timer/Counter0 Compare Match .ORG $028 RETI ; (SPM_RDY) Store Program Memory Ready .ORG INT_VECTORS_SIZE ; Конец таблицы прерываний

Обработчики пока тоже пусты, но потом добавим

1
2
; Interrupts ==============================================
; End Interrupts ==========================================

; Interrupts ============================================== ; End Interrupts ==========================================

Инициализация ядра. Память, стек, регистры:

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
Reset:   	LDI R16,Low(RAMEND)		; Инициализация стека
	  	OUT SPL,R16			; Обязательно!!!
 
	  	LDI R16,High(RAMEND)
	  	OUT SPH,R16
 
; Start coreinit.inc
RAM_Flush:	LDI	ZL,Low(SRAM_START)	; Адрес начала ОЗУ в индекс
		LDI	ZH,High(SRAM_START)
		CLR	R16			; Очищаем R16
Flush:		ST 	Z+,R16			; Сохраняем 0 в ячейку памяти
		CPI	ZH,High(RAMEND)		; Достигли конца оперативки?
		BRNE	Flush			; Нет? Крутимся дальше!
 
		CPI	ZL,Low(RAMEND)		; А младший байт достиг конца?
		BRNE	Flush
 
		CLR	ZL			; Очищаем индекс
		CLR	ZH
		CLR	R0
		CLR	R1
		CLR	R2
		CLR	R3
		CLR	R4
		CLR	R5
		CLR	R6
		CLR	R7
		CLR	R8
		CLR	R9
		CLR	R10
		CLR	R11
		CLR	R12
		CLR	R13
		CLR	R14
		CLR	R15
		CLR	R16
		CLR	R17
		CLR	R18
		CLR	R19
		CLR	R20
		CLR	R21
		CLR	R22
		CLR	R23
		CLR	R24
		CLR	R25
		CLR	R26
		CLR	R27
		CLR	R28
		CLR	R29
; End coreinit.inc

Reset: LDI R16,Low(RAMEND) ; Инициализация стека OUT SPL,R16 ; Обязательно!!! LDI R16,High(RAMEND) OUT SPH,R16 ; Start coreinit.inc RAM_Flush: LDI ZL,Low(SRAM_START) ; Адрес начала ОЗУ в индекс LDI ZH,High(SRAM_START) CLR R16 ; Очищаем R16 Flush: ST Z+,R16 ; Сохраняем 0 в ячейку памяти CPI ZH,High(RAMEND) ; Достигли конца оперативки? BRNE Flush ; Нет? Крутимся дальше! CPI ZL,Low(RAMEND) ; А младший байт достиг конца? BRNE Flush CLR ZL ; Очищаем индекс CLR ZH CLR R0 CLR R1 CLR R2 CLR R3 CLR R4 CLR R5 CLR R6 CLR R7 CLR R8 CLR R9 CLR R10 CLR R11 CLR R12 CLR R13 CLR R14 CLR R15 CLR R16 CLR R17 CLR R18 CLR R19 CLR R20 CLR R21 CLR R22 CLR R23 CLR R24 CLR R25 CLR R26 CLR R27 CLR R28 CLR R29 ; End coreinit.inc

Всю эту портянку можно и нужно спрятать в inc файл и больше не трогать.

Секции внешней и внутренней инициализации переферии пока пусты, но ненадолго. Равно как и запуск фоновых программ. Потом я просто буду говорить, что мол добавьте эту ботву в секцию Internal Hardware Init и все 🙂

1
2
3
4
5
6
7
8
9
10
11
; Internal Hardware Init  ======================================
 
; End Internal Hardware Init ===================================
 
; External Hardware Init  ======================================
 
; End Internal Hardware Init ===================================
 
; Run ==========================================================
 
; End Run ======================================================

; Internal Hardware Init ====================================== ; End Internal Hardware Init =================================== ; External Hardware Init ====================================== ; End Internal Hardware Init =================================== ; Run ========================================================== ; End Run ======================================================

А теперь, собственно, сам главный цикл.

1
2
3
4
5
; Main =========================================================
Main:
 
		JMP	Main
; End Main =====================================================

; Main ========================================================= Main: JMP Main ; End Main =====================================================

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

1
2
3
; Procedure ====================================================
 
; End Procedure ================================================

; Procedure ==================================================== ; End Procedure ================================================

Ну и вот тебе файлик с уже готовым проектом под этот шаблон

1.2 Описание интерфейса. Главная панель программы «avr Studio»

На рис. 1.1 показано, как выглядит главная панель программы «AVR Studio». На самом деле «AVR Studio» имеет очень гибкий интерфейс, и внешний вид может сильно отличаться от варианта, показанного на рисунке. Но мы будем рассматривать случай, когда выбраны установки по умолчанию.

Главная панель программы AVR Studio разделена на три основных окна. На рис. 1.1 они обозначены цифрами 1, 2 и 3. Первые два окна — вспомогательные. Окно 1 предоставляет нам полную информацию о текущем проекте. По умолчанию это окно включает в себя три вкладки. «Корешки» этих вкладок вы можете видеть в нижней части окна.

Первая вкладка называется «Info». Она содержит справочную информацию по используемому микроконтроллеру: описание векторов прерываний; описание выводов для разных корпусов и краткое описание регистров.

Следующая вкладка называется «Project». Она содержит информацию по текущему загруженному проекту. Информация представлена в виде дерева. Разные ветви этого дерева описывают все исходные и результирующие файлы проекта, все метки, процедуры и присоединяемые файлы.

Последняя вкладка окна номер 1 называется «I/O View» (просмотр ввода—вывода). Это самая полезная вкладка. На ней в графическом виде показаны все ресурсы микроконтроллера:

Вся информация также представлена в виде дерева. Каждая «ветвь» этого дерева – это отдельный элемент. Если какой-либо элемент cостоит из других элементов, то его можно раскрыть и увидеть эти элементы.

Элементы, появляющиеся в результате раскрытия ветви, также могут быть раскрыты, если они имеют свое содержимое. На рис. 1.2 в увеличенном виде показано дерево ресурсов микроконтроллера ATiny2313. На рисунке несколько ветвей специально раскрыты, чтобы можно было увидеть их состав.

Если какая-либо ветвь может быть раскрыта, то в своем основании она имеет квадратик с плюсиком внутри. Двойной щелчок на этом плюсике раскрывает ветвь. В раскрытой ветви плюсик превращается в минус. Повторный двойной щелчок по квадратику закрывает раскрытую ветвь.

На рис. 1.2 для наглядности раскрыты ветви всех трех портов ввода-вывода и регистры, связанные с EEPROM. Вы можете видеть:

  • полный состав управляющих регистров для каждого из устройств;

  • их названия и адреса;

  • состав и название каждого бита (если биты имеют свои названия).

Также для наглядности на рис. 1.2 раскрыта ветвь, соответствующая регистру EECR, и можно видеть все его биты.

Рис. 1.2 – Окно ресурсов микроконтроллера

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

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

В нижней части главной панели находится второе вспомогательное окно (окно 2 на рис. 1.1). Это окно служит, в основном, для вывода различных сообщений. Оно также содержит ряд вкладок. По умолчанию их четыре. Первая вкладка называется «Build». На вкладке «Build» отражается процесс трансляции. На эту вкладку выводятся сообщения об различных этапах трансляции, сообщения о синтаксических ошибках и различные предупреждения (Warnings).

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

ATtiny2313 memory use summary [bytes]:

Segment Begin End Code Data Used Size Use%

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

[.cseg] 0x000000 0x0004f2 508 758 1266 2048 61.8%

[.dseg] 0x000060 0x00009d 0 61 61 128 47.7%

[.eseg] 0x000008 0x000045 0 61 61 128 47.7%

Assembly complete, 0 errors. 0 warnings

Сообщение означает, что в программном сегменте использованы ячейки с адреса 0x000000 по адрес 0x0004f2. При этом собственно код программы занимает 508 байт. Данные в программной памяти занимают 758 байт. Всего использовано в программной памяти 1266 байт (сумма предыдущих двух чисел). Размер программной памяти для этого микроконтроллера составляет 2048 байт. Процент использования программной памяти 61,8%.

Точно такие же сведения приведены для памяти данных (ОЗУ) и для EEPROM. Естественно, что два последних вида памяти не содержат программного кода. Поэтому в соответствующем столбике стоят нули. Последняя строка содержит сообщения об ошибках. В данном случае сообщение переводится так: «Ассемблирование прошло успешно, 0 ошибок, 0 предупреждений».

Другая вкладка второго окна называется «Message». Здесь выводятся разные системные сообщения о загрузке модулей программы и т.п.

Третья вкладка второго окна называется «Find in Files» (поиск в файлах). В этом окне отражаются результаты выполнения команды «Поиск в Файлах». Эта команда позволяет производить поиск заданной последовательности символов сразу во всех файлах проекта. По окончании поиска во вкладке «Find in Files» отражаются все найденные вхождения с указанием имени файла и строки, где найдена искомая последовательность.

Последняя вкладка называется «Breakpoints and Tracepoints»

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

Точки останова используются для того, чтобы приостановить выполнение программы в том или ином месте программы, чтобы убедиться, что программа выполняется правильно. При создании точки останова в тексте программы она автоматически появляется во вкладке «Breakpoints and Tracepoints».

Вкладка позволяет увидеть все точки останова программы в одном месте. Кроме того, на вкладке против каждой записи, описывающей точку останова, автоматически появляется «Check box» (поле выбора), при помощи которого можно в любой момент временно отключить любую точку останова.

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

Определение. Трассировка – это особый вид отладочного процесса, когда программа запускается и выполняется в автоматическом режиме.

Но в процессе работы она оставляет сообщения в специальном окне. Сообщения отражают каждый шаг выполняемой программы. Точки трассировки могут отменить и заново разрешить трассировку на разных участках программы.

Программная среда «AVR Studio» поддерживает трассировку только при работе с отладочной платой ICE50. Это достаточно дорогое устройство. Поэтому мы остановимся лишь на программном отладчике без применения каких-либо аппаратных средств отладки.

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

Любую из вкладок любого вышеописанного окна можно скрыть или, наоборот, превратить в отдельное свободно перемещаемое окно. Для этого достаточно щелкнуть правой клавишей мыши по заголовку соответствующей вкладки и выбрать в открывшемся меню нужный режим. Пункт «Hide» этого меню означает «Скрытое» (невидимое), «Floating» означает «Свободное» (Перемещающееся), «Docking» — «Закрепленное».

Для некоторых пользователей бывает затруднительно вернуть вкладку на место после того, как она превратится в свободно перемещаемое окно. В программе «AVR Studio» используется нестандартный довольно оригинальный механизм управления окнами. Предположим, что мы случайно превратили в плавающее окно вкладку «Breakpoints and Tracepoints» окна номер два. Посмотрим, как можно поставить ее на место.

Если перемещать это окно при помощи мыши (удерживая его за заголовок), то на основной панели программы появляются указатели размещения, как это показано на рис. 1.3. Они представляют собой стилизованные стрелки синего цвета, расположенные по всему полю главного окна программы. Одновременно появляются восемь таких стрелок. Четыре из них объединены в центральный блок, в который включена еще и круглая кнопка посередине.

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

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

Дополнительные окна 1 и 2 позволяют легко изменять свои размеры. Для изменения размера достаточно перетащить границу окна при помощи мыши. Можно даже скрыть любое из этих окон, закрыв все его вкладки. Закрыть вкладку можно двумя способами. Либо щелкнуть по ее «корешку» правой кнопкой мыши, а в появившемся меню выбрать пункт «Hide». Либо щелкнуть мышью в крестик в верхнем правом углу вкладки. Открыть закрытые вкладки можно при помощи меню «View/Toolbars».

Особую роль играет окно 3. Это даже не окно, а оставшаяся часть от главного окна программы. Если закрыть окна 1 и 2, окно 3 займет все пространство программной панели. В окне 3 появляются различные рабочие окна.

Во-первых, это окна с текстами программ на Ассемблере. А, во-вторых, здесь могут появляться окна любых открытых программой файлов. Это могут быть текстовые файлы или файлы других программ. Каждый такой файл по умолчанию открывается в виде отдельного плавающего окна. Для определенности будем называть такие окна текстовыми окнами. Текстовые окна будут «плавать» только внутри окна 3.

Для каждого нового текстового окна в нижней части окна 3 появляется «корешок», при помощи которого можно быстро перейти к нужному окну, если оно не находится на переднем плане. При двойном щелчке левой кнопкой мыши по заголовку любого текстового окна оно раскроется на всю ширину окна 3. Иногда именно так удобно работать с тестами программ.

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

Любое текстовое окно имеет подсветку синтаксиса. Разные части помещенного туда текста программы подсвечиваются разными цветами. Так, все операторы Ассемблера высвечиваются голубым цветом. Комментарии выделяются зеленым. Остальной текст (параметры команд, псевдооператоры, метки, переменные и константы) остается черным. Это очень удобно. Если написанный вами оператор окрасился в голубой цвет, то это значит, что вы не ошиблись в синтаксисе. Если вы написали комментарий, но перед текстом комментария забыли поставить точку с запятой, то этот комментарий не окрасится в зеленый цвет. Таким образом, многие ошибки видны уже в процессе написания программы.

Кроме двух вспомогательных и одного основного окна, главная панель программы имеет строку меню (отмечена цифрой 4 на рис. 1.1), а также несколько инструментальных панелей (отмечены цифрой 5). Как и в любой другой программе под Windows, при помощи меню вызываются все функции программы AVR Studio и переключаются все ее режимы. Панели инструментов дублируют часто используемые функции меню.

AVR-микроконтроллеры

Файл формата PDF размером 1,68 МБ
Курс подробно рассказывает, как сделать самые первые шаги, с чего начать не вообще, а конкретно.
Как сделать нужное вам электронное устройство, печатную плату
Как написать первую, простейшую программу для МК
Как запустить эту программу в программе-симуляторе МК и увидеть, как она работает, не покупая МК и радиодеталей, а значит, без риска спалить что-то или испортить порт вашего ПК!
Как загрузить программу в реальный МК
Как отладить реальное устройство — т. е. найти причины неправильной работы и функционирования в соответствии с поставленной задачей.
Цель курса — помочь вам быстро начать использовать микроконтроллеры семейства AVR с абсолютного нуля знаний о микропроцессорах и о программировании вообще.
В курсе даны кратко ключевые моменты устройства МК, и показано как МК взаимодействует с окружающими его в электронном устройстве компонентами и с другими устройствами, например с ПК. Для использования микроконтроллеров, в том числе и МК AVR, вам не нужно досконально знать электронику и языки программирования. Курс поможет вам научится искать и творчески использовать информацию в объеме, необходимом для реализации конкретного проекта, устройства .
Содержание.
Заглавная страница курса — 123avr.COM — вступление и первые эксперименты.
Что такое МК и AVR в частности. Как работает МК.
Возможности МК. Что и как подключать к МК. Регистры и программа. Прерывания в AVR.
Компиляторы и Симуляторы для МК AVR.
Си для МК — очень малая часть языка достаточна для работы с МК.
Задачи-упражнения по курсу — это практические занятия по работе с МК и необходимые
теоретические сведения и комментарии. Макетные платы, изготовление плат, пайка.
Как и чем прошить (прожечь, загрузить) программу в МК AVR, ATmega.
Как сделать программатор проводков или сложнее.
Дополнительные, полезные материалы
О великолепных МК серии PIC12, PIC16, PIC18 от компании MicroChip

Микроконтроллеры AVR

Микроконтроллеры AVR
Микроконтроллеры AVR

Для ознакомления с AVR стоит посетить соответствующий раздел ATMEL Russian Home — AVR микроконтроллеры

Архитектура

Блок регистров быстрого доступа состоит из 32-х 8-битных регистров общего назначения. Операции с регистрами выполняются за один цикл. В течение цикла два операнда читаются из блока регистров, выполняется инструкция, результат сохраняется в блок регистров.

АЛУ поддерживает арифметические и логические операции между регистрами или между константой и регистром. Также существуют инструкции с одним операндом. AVR использует Гарвардскую архитектуру: у программы и данных раздельные шины и память. Выборка инструкции из памяти программ осуществляется двуступенчатым конвейером. Пока одна инструкция выполняется, следующая инструкция выбирается из памяти программ. Такая концепция позволяет выполнять инструкцию за один цикл. Программная память является памятью типа Flash.

Инструкции относительного перехода и относительного вызова имеют доступ к адресному пространству размером, зависящим от типа процессора (512…8К адресов). Каждый адрес программной памяти содержит одну 16- или 32-битную инструкцию.

Во время прерываний и вызовов процедур, адрес возврата сохраняется в стеке. В процессорах AT90S1200, ATtiny10/11/12, ATtiny28L стек реализован аппаратно, имеет глубину 3 уровня и предназначен для процедур и прерываний. Указатель стека недоступен. В остальных моделях, стек использует память SRAM, и поэтому ограничен только размером SRAM и использованием ячеек SRAM программой. Программы должны инициализировать указатель стека при сбросе. Указатель стека SP доступен для чтения-записи в пространстве ввода-вывода.

Многие модели микроконтроллеров имеют память данных SRAM, которая доступна пятью режимами адресации, поддерживаемыми архитектурой AVR.

Пространство ввода-вывода содержит 64 адреса для периферии: регистры управления, таймеры, счетчики, аналого-цифровые преобразователи, другие функции ввода-вывода.

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

Блок регистров общего назначения

Регистры общего назначения R0
R1
R2
R28
R29
R30 (Z-Register)
R31

Все инструкции работы с регистрами имеют прямой доступ ко всем регистрам. Исключением являются пять арифметических и логических инструкций SBCI, SUBI, CPI, ANDI, ORI, работающих с константой и регистром, и инструкция LDI для загрузки константы в регистр. Эти инструкции работают только с регистрами второй половины блока — R16..R31. Обычные SBC, SUB, CP, AND, OR и все другие операции между двумя регистрами или с одним регистром работают с любыми регистрами блока.

Регистры 26…31 в зависимости от модели процессора могут служить также в качестве указателей для косвенной адресации блока регистров.

АЛУ — арифметико-логическое устройство

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

Набор инструкций AVR

Пример подключения ATtiny

Пример программы:
;***********************************************
;* Пример программы для ATtiny.
;* Версия от 11 марта 2002г.
;***********************************************
; Все, что правее точки с запятой — это комментарии.

; Подключаем файл с определениями «tn12def.inc».


.include «tn12def.inc»
; Для удобства даем регистрам имена.
.def fTEMP =r16
.def fCOUNTER =r17
.def fCOUNTER2 =r18
.cseg ; Сегмент CODE.
.org 0 ; Адрес выполнения первой команды
        rjmp    start ; Переход на команду по адресу ‘start’
; Метка ‘start’ — это адрес следующей за меткой команды.
start:
; Назначаем лапы на вход (0) или выход (1).
        ldi     fTEMP,0b00111110; PB0 — вход, остальные — выход.
        out     DDRB,fTEMP
Loop:
        cbi     PORTB,0 ; Гасим вывод PB0
        ldi     fTEMP,0
        rcall   Big_delay ; Задержка около 200 мс.
        sbi     PORTB,0 ; Устанавливаем в единицу PB0
        ldi     fTEMP,0
        rcall   Big_delay
        rjmp    Loop
;—————————————————————————
Big_delay:
        mov     fCOUNTER2,fTEMP
        clr     fCOUNTER
BD_loop:
        dec     fCOUNTER
        brne    BD_loop
        dec     fCOUNTER2
        brne    BD_loop
        ret
;—————————————————————————

В данной схеме подключения программа заставит светодиод мигать с периодом около 400 миллисекунд.

Продолжение следует…

Начинаем работать с проектом в программе AVR Studio tinyAVR

Для запуска AVR Studio зайдите в меню Windows | Programs | Atmel AVR Tools I AVR Studio 4.

1.             Для создания нового проекта выберите опцию New Project в меню Project (рис. 1.30).

Рис. 1.30. Создание нового проекта в AVR Studio

Рис. 1.31. Настройка проекта в AVR Studio

Рис. 1.32. Выбор контроллера в AVR Studio

1.             Появится всплывающее меню (рис. 1.31). В поле Project Туре выберите либо AVR GCC, либо Atmel AVR Assembler (в зависимости от используемого вами языка). Здесь показаны настройки для проекта на языке С. Установите флажки Create Initial File и Create Folder и дайте проекту подходящее название. Щелкните кнопку Next.

2.             Появится следующее всплывающее меню (рис. 1.32). Выберите пункт AVR Simulator и в разделе Device укажите подходящий контроллер. Щелкните кнопку Finish, и вы увидите, что главный исходный файл открыт и в нем можно писать ваш код.

3.             Обычно для удобства чтения вам потребуется разбивать код на части. В результате программа будет состоять из нескольких файлов. Чтобы присоединить дополнительные исходные файлы, щелкните правой кнопкой мыши пункт Source Files в разделе AVR GCC и выберите опцию либо Add Existing Source File, либо Create New Source File. Если вы используете существующие исходные файлы, убедитесь в том, что они скопированы в тот же каталог, что и ваш главный исходный файл (в тот каталог, который вы создали на шаге 2).

4.             Напишите свой код в главном исходном файле.

5.             В меню Build выберите команду Build (или нажмите клавишу <F7>), чтобы начать компиляцию вашей программы. Если в окне Build появилось сообщение «Build succeeded with 0 Warnings», то ошибок нет и ваш шестнадцатеричный файл создан. Если вы видите сообщение «Build succeeded» и несколько сообщений, то ваш шестнадцатеричный файл создан, но были выданы некие предупреждения. Рекомендуется изучить и по возможности устранить причины их появления. Шестнадцатеричный файл находится в подкаталоге «default» главного каталога проекта.

6.             Для выполнения программы вы можете выбрать команду Build and Run меню Build (или нажать клавиши <CTRL>+<F7>). Пошаговое исполнение кода можно осуществить при помощи клавиши <F11>. После выполнения каждой команды можно отслеживать содержимое регистра контроллера, портов ввода/вывода и памяти.

Источник: Гадре, Д., Занимательные проекты на базе микроконтроллеров tinyAVR / Дхананья Гадре, Нигул Мэлхотра: Пер. с англ. — СПб.: БХВ-Петербург, 2012. — 352 с.: ил. — (Электроника)

AVR109: Самопрограммирование

Характеристики:

  • Код примера применения AVR109 помещается в загрузочном блоке любого AVR микроконтроллера
  • Чтение и запись EEPROM и Flash памяти
  • Использует протокол AVRProg
  • Чтение и запись битов защиты

Введение

В данном примере применения описывается как настроить AVR микроконтроллеры для самопрограммирования при помощи команд сохранения памяти программы (SPM). AVR микроконтроллеры могут связываться через UART с персональными компьютерами, на которых запущена программа программирования AVRprog. Она позволяет программировать микроконтроллеры с Flash и EEPROM памятью без помощи внешнего аппаратного программатора.

Программа загрузчика находится в загрузочной области Flash памяти. Эта программа устанавливает связь с ведущим персональным компьютером и облегчает программирование Flash и EEPROM памяти микроконтроллера. Однажды запрограммированные различные уровни защиты могут быть индивидуально применены для программирования загрузочной памяти и Flash памяти прикладной программы. Таким образом, AVR микроконтроллеры имеют уникальную возможность обеспечения различной степени защиты областей встроенной памяти.

Обсуждение SPM

Ниже приведены различные рассуждения, позволяющие лучше понять способность самопрограммирования AVR микроконтроллеров.

Организация памяти

Flash память AVR микроконтроллеров разделена на две области: секция прикладной программы и секция программы загрузчика. Область прикладной программы содержит код основной прикладной программы, а область загрузчика содержит код программы, позволяющей осуществлять самопрограммирование микроконтроллера. SPM команды могут выполняться только из области загрузчика. (Замечание: тем не менее, область загрузчика может использоваться в качестве обычной памяти прикладной программы).

Flash память разделена на страницы, каждая из которых содержит 32, 64 или 128 слов. Назначение и использование страниц будет объяснено позже. Вся память (и память прикладной программы и память загрузчика) разделена на страницы. Например, микроконтроллер с 8 килобайтами Flash памяти и размером страницы 32 слова (64 байта) будет иметь 128 страниц. Организация памяти показана на рисунке 1.


Рисунок 1. Организация памяти

Размер области памяти загрузчика может быть установлен при помощи двух специальных конфигурационных бит BOOTSZx. Они позволяют выбрать один из четырех возможных размеров области памяти загрузчика. Установить биты BOOTSZx можно при помощи последовательного или параллельного программатора. Более подробно это рассмотрено в технических описаниях AVR микроконтроллеров.

Если загрузчик реализован, то он может быть вызван путем выполнения команд Call или Jump из прикладной программы или путем установки бита специального конфигурационного бита BOOTRST. Если бит BOOTRST установлен, то после каждого сброса микроконтроллер вместо перехода к выполнению программы, начинающейся с нулевого адреса памяти прикладной программы, выполняет программу загрузки, находящуюся в области загрузчика. Изменен бит BOOTRST может быть при помощи параллельного или последовательного программатора.

Возможность «чтения при записи»

В дополнение к выбираемому делению памяти на прикладную и загрузочную, встроенная Flash память также разделена на два раздела с фиксированными размерами. Первый раздел — «читаемый при записи» (RWW) раздел. Второй — «не читаемый при записи» (NRWW) раздел. Размер NRWW раздела всегда равняется размеру наибольшей возможной области памяти загрузчика. Поэтому раздел загрузчика занимает весь NRWW раздел или только его часть. Деление памяти на RWW и NRWW разделы показано на рисунке 2.


Рисунок 2. Деление памяти на RWW и NRWW разделы

Отличие между этими разделами состоит в том, что NRWW секция доступна при обновлении RWW секции. К RWW секции невозможно обратиться при обновлении. Когда NRWW секция обновляется (например, обновляя непосредственно код загрузчика), вычислительное ядро останавливается. Другими словами, невозможно осуществлять чтение при записи NRWW секции, но возможно читать при записи RWW секции. Более подробно это рассмотрено в технических описаниях на микроконтроллеры.

Эти функциональные возможности позволяют продолжить выполнение прикладной программы при обновлении RWW секции. Обратите внимание, что код этой программы должен содержаться в NRWW секции (не обязательно в разделе загрузчика). Более подробно это рассмотрено ниже в разделе описания прерываний.

Микроконтроллеры ATmega163 и ATmega323 не имеют NRWW и RWW секций — у них имеются только деление на память загрузчика и память прикладной программы. Любое обновление Flash памяти этих микроконтроллеров приводит к остановке их вычислительного ядра.

Использование SPM команды

Все действия по самопрограммированию выполняются при помощи SPM команды. Выбор режима осуществляется при помощи регистра SPMCR. Структура этого регистра показана на рисунке 3.


Рисунок 3. Регистр SPMCR

При использовании SPM функции бит SPMEN должен быть установлен не ранее, чем за четыре цикла до выполнения команды SPM. Это необходимо для предотвращения несанкционированного обновления Flash памяти. Прикладная программа должна гарантировать отсутствие вызова подпрограмм обработки прерывания между установкой бита SPMEN и выполнением SPM команды. Другие, выделенные цветом на рисунке, четыре бита осуществляют выбор режима SPM. По окончании режима бит SPMEN автоматически сбрасывается вместе с функциональным битом. SPM функции описаны ниже.

Стирание страницы

Вся Flash память обновляется страницами. Перед записью новых данных страница должна быть стерта.

Для выбора страницы, подлежащей стиранию, используется Z регистр. Он предназначен для указания номера стираемой страницы. Младшие биты, выбирающие слово на странице, игнорируются. Например, в микроконтроллере, имеющем размер страницы 32 слова (64 байта), игнорируются шесть младших бит Z регистра.

Для того чтобы стереть страницу необходимо установить биты PGERS и SPMEN в регистре SPMCR и выполнить команду SPM.

Загрузка буфера страниц

Перед записью новых данных в страницу необходимо сначала стереть буфер страниц. Буфер страниц — это доступный только для чтения отдельный буфер, не относящийся к ОЗУ, который содержит одну временную страницу. Страницы в него должны заноситься последовательно. Перезапись буфера страниц во FLash память происходит за одну операцию.

Для выбора слова, которое будет записано в буфер, используется Z регистр. МЗБ Z регистра игнорируются так как запись всех слов происходит за одну операцию. Таким образом невозможно выбрать только один байт. При записи буфера страниц игнорируются старшие биты Z регистра. Структура Z регистра для микроконтроллера с 32 словными (64 байтовыми) страницами показана на рисунке 4. Микроконтроллеры, имеющие большие размеры страницы для выбора слов используют больше бит.


Рисунок 4. Запись в буфер страниц

Чтобы записать слово в буфер страниц необходимо загрузить его в регистры R1:R0. Для записи необходимо только записать правильное слово и установить бит SPMEN в регистре SPMCR. В течение четырех циклов после этого должна быть выполнена SPM команда.

Запись страницы

Данные после того, как они были загружены в буфер страниц, должны быть записаны во Flash память. Для выполнения этого необходимо, как это было описано выше в пункте описания алгоритма стирании страницы, установить Z регистр. Затем устанавливаются биты PGERS и SPMEN в регистре SPMCR, а потом в течение четырех циклов необходимо запустить SPM команду. Содержимое регистров R1:R0 при этом игнорируется. Использование Z регистра для микроконтроллера с 32 словными (64 байтными) страницами показано на рисунке 5.


Рисунок 5. Запись страницы во Flash память

Для определения готовности микропроцессора к следующему обновлению необходимо опрашивать бит SPMEN. Процедура обновления может быть прервана управляющим прерыванием. Более подробно это рассмотрено ниже в разделе описания прерываний.

RWW секция флагов занятости

При записи и стирании страниц RWW секции аппаратно устанавливается флаг RWWSB, указывая на то, что секция недоступна. Флаг RWWSB должен быть сброшен программно по окончании SPM режима. Это выполняется установкой битов RWWSRE и SPMEN в регистре SPMCR и последующим запуском SPM команды. Также этот флаг может быть сброшен путем запуска загрузки буфера страниц. Флаг RWWSB может использоваться другими частями прикладной программы для контроля доступности RWW секции. Более подробно это рассмотрено в технических описаниях на микроконтроллеры.

Обратите внимание, что содержимое Z регистра и регистров R1:R0 игнорируется при использовании RWWSRE функции.

Также следует заметить, что, если после выполнения операции записи или считывания RWW секция стала доступна без переактивизации, то все адреса в RRW секции считываются как 0xFFFF. Так будет и после считывания Flash памяти при помощи LPM и после выполнения вызова или перехода в RWW секцию. Переход в RWW секцию без предварительной ее переактивизации приведет к тому, что выполнится команда, находящаяся по адресу 0xFFFF, а все предшествующие ей команды, которые должны были быть выполнены, будут пропущены.

Биты блокировки загрузки

Секции прикладной программы и программы-загрузчика могут быть защищены на различных уровнях. Для обоих разделов имеется четыре уровня защиты. Краткое описание этих режимов приведено в таблице 1.

Таблица 1. Режимы блокировки загрузки

РежимБитыОписание
Режим 111Полный доступ для чтения — записи
Режим 210Нет доступа для записи
Режим 300Нет доступа для записи и нет доступа для чтения (данные или обработка прерывания) из других секций
Режим 401Нет доступа для чтения (данные или обработка прерывания) из других секций

Обратите внимание, что все эти биты могут изменяться только при помощи последовательного или параллельного программатора. Например, для микроконтроллера, прикладная программа которого будет обновляться, необходимо установить режим 1 для секции прикладной программы и режим 4 для секции загрузчика. Это препятствует доступу к программе загрузчика из прикладной программы и обеспечивает загрузчику возможность доступа к секции прикладной программы. После обновления загрузчик установит третий режим для прикладной программы, что заблокирует дальнейший доступ к ней.

Для программирования битов блокировки загрузки необходимо загрузить соответствующие данные в регистр R0, установить биты BLBSET и SPMEN в регистре SPMCR и в течение четырех циклов выполнить команду SPM. Содержимое Z регистра при этом игнорируется.

Использование LPM команды вместо SPM команды позволит считать биты.

Прерывание

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

Для выбора двух различных таблиц векторов прерывания прикладная программа должна использовать бит IVSEL регистра GICR. При обновлении RWW секции должна использоваться одна секция прикладной программы и одна секция программы-загрузчика. Это позволяет прикладной программе продолжать критические процессы типа отслеживание политики безопасности при самопрограммировании. Более подробно это рассматривается в технических описаниях на микроконтроллеры в разделе описания прерываний и IVSEL флага.

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

SPM прерывание

У всех микроконтроллеров, поддерживающих режим самопрограммирования, за исключением микроконтроллеров ATmega163 и ATmega323, при помощи прерываний возможно контролировать процесс обновления Flash памяти. Установка бита SPMIE в регистре SPMCR позволит формировать SPM прерывание. Оно может использоваться для отслеживания окончания режима SPM.

Конфликты EEPROM памяти

Обратите внимание, что все операции записи EEPROM должны быть окончены перед выполнением SPM команды и наоборот. Запись/стирание Flash и EEPROM памяти не может происходить одновременно.

Типовые процедуры обновления

На рисунке 6 показаны две стандартные процедуры обновления. Левая блок — схема на этом рисунке описывает алгоритм «считывания-модификации-записи» небольших частей Flash памяти, например, констант, содержащихся во Flash памяти. Правая блок-схема описывает алгоритм записи страницы, использующийся для записи страницы без предварительного считывания ее содержимого, например, запись данных, поступивших от UART.


Рисунок 6. Блок-схемы стандартных процедур обновления

Пример программы-загрузчика

Пример программы- загрузчика, приведенный в данном примере применения, в качестве пользовательского интерфейса использует программу AVRprog, доступную на сайте www.atmel.com. Эта программа-загрузчик позволяет считывать или обновлять Flash и EEPROM память выбранного микроконтроллера. Также она позволяет считывать и обновлять биты Lock и Fuse.

Протокол

Протокол, использованный в примере программы-загрузчика, предназначен для работы с программатором AVRprog, хотя программа-загрузчик и не поддерживает всего набора команд. Перечень поддерживаемых команд приведен в таблице 2. Все команды начинаются с одной буквы. После выполнения команды программатор возвращает значение 13d (возврат каретки) или требуемые данные. Неизвестным командам возвращается значение «?».

Таблица 2. Команды AVRProg

КомандаЗапись ведущимСчитывание ведущим
IDДанныеДанные 
Вход в режим программирования«P»  13d
Автоматическое увеличение адреса«a» dd 
Установка адреса«A»ah al 13d
Запись младшего байта в память программы«c»dd 13d
Запись старшего байта в память программы«C»dd 13d
Окончание записи страницы«m»  13d
Считывание битов Lock«r» dd 
Считывание памяти программы«R» dd (dd) 
Считывание памяти данных«d» dd 
Запись памяти данных«D»dd 13d
Стирание кристалла«e»  13d
Запись битов Lock«l»dd 13d
Запись битов Fuse«f»dd 13d
Считывание битов Fuse«F» dd 
Считывание старших битов Fuse«N» dd 
Выход из режима программирования«L»  13d
Выбор типа микроконтроллера«T»dd 13d
Считывание байтов подписи«s» 3*dd 
Возвращение кода поддерживаемого микроконтроллера«t» n* dd00d
Возвращение идентификатора программы«S» s[7] 
Возвращение версии п

AVR. Начало работы | CUSTOMELECTRONICS.RU

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

Установка AVR Studio

Atmel Studio — официальная среда для программирования AVR-микроконтроллеров. Она распространяется бесплатно на официальном сайте. К сожалению, она работает только под Windows. Скачайте и установите последнюю версию.

Установка драйвера

Для обучения мы предлагаем вам использовать Arduino-совместимую плату. Все примеры мы приводим применительно к нашей плате EduBoard. Достоинство такого подхода в том, что вам не понадобится использование программатора и, тем более, травить платы, паять МК, искать источник питания и т.д.
На плате EduBoard установлен микроконтроллер и в его памяти уже есть одна программа — bootloader. Эта программа находится в конце памяти микроконтроллера. При запуске микроконтроллера она проверяет, не передается ли по необходимому протоколу основная программа. Если это так, то бутлоадер вычитывает данные и записывает их в память. После этого МК снова перезагружается.
Загрузка прошивки при помощи бутлоадера возможна по любому интерфейсу. В EduBoard это COM-порт. Для перезагрузки применяется сигнал RTS, а программа загружает через UART.
В современных компьютерах редко встречается COM-порт, поэтому на плате установлен переходник USB-to-COM на основе микросхемы FT232RL. Эта микросхема определяется в системе как COM-порт. Таким образом можно просто подключить плату к USB-порту и вы получите возможность обновлять программу микроконтроллера.
Производитель FT232RL с некоторых пор стал активно бороться с поддельными микросхемами, которых расплодилось огромное количество и никто не защищен от подделки, покупая даже у надежных поставщиков. Поэтому мы настаиваем на использовании версии 2.08.28 драйвера, который точно работает со всеми чипами. Все свои платы мы проверяем именно с этим драйвером. Скачайте его у нас, а не с сайта производителя! Еще раз: ссылка для скачивания проверенного драйвера ЗДЕСЬ!
После того, как драйвер скачан, установите перемычки так, как показано на рисунке.

Установка перемычек

В таком положении перемычек плата питается от USB-порта, а перепрограммирование разрешено.
Далее подключите плату к USB-порту ПК. Компьютер найдет неизвестное устройство. Просто запустите скачанный файл и он сам все установит. После этого в диспетчере устройств появится новый COM-порт:

Установка утилиты для загрузки программы

В AVR Studio вы будете компилировать программы, бутлоадер будет их принимать. Осталось только установить программу, которая будет передавать скомпилированный машинный код в COM-порт.
Существует много программ. Они не требуют установки. Мы предпочитаем использовать ArduinoUploader. В архиве есть exe-файл. Утилита не требует установки.

Интерфейс этой программы очень прост. Необходимо выбрать номер COM-порта, микроконтроллер (Atmega8) и указать hex-файл для загрузки.

Первая прошивка

На плате EduBoard (как и на большинстве Arduino-совместимых плат) установлен пользовательский светодиод, подключенный к 13му выводу. Для проверки того, что все настроено и работает корректно напишем программу, мигающую этим светодиодом.
Запустите Atmel Studio и на стартовой странице выберите пункт меню New Project:

В следующем окне выберите тип проекта GCC C Executable Project. Задайте имя проекта — Blink, выберите расположение — C:\AVRProject\FirstProject и снимите галочку Create directory for solution.

Далее выберите тип микроконтроллера. У нас это Atmega8A.

В окне редактора кода введите следующую программу:

#include <avr/io.h>
#define F_CPU 16000000UL //16MHz
#include <util/delay.h>

int main(void) {
	DDRB  |= 1<<5;
	PORTB &= ~1<<5;
	while(1) {
		PORTB |= 1<<5;
		_delay_ms(100);
		PORTB &= ~1<<5;
		_delay_ms(100);
	}
}

… и нажмите Build->Build Solution.

Вы увидите, что в папке C:\AVRProject\FirstProject\Blink\Debug будет создан набор выходных файлов, в том числе Blink.hex.
Запустите ArduinoUploader, укажите ему этот файл, выберите COM-порт к которому подключена плата и микроконтроллер (у нас Atmega8). Нажмите кнопку «Upload». Если все сделано правильно, то ваша программа будет загружена в память МК и он начнет мигать светодиодом с частотой 5Гц:

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

AVR Tutorial — Как работает программирование

Итак, у вас есть этот чип и его программируемый. Но как разместить свою программу на этом чипе?

комментариев? Предложения? Напишите на форум!

Когда код компилируется в программу Windows, он превращается в «двоичный», что означает, что он не читается человеком (что трудно понять машинам), вместо этого он машиночитаемый. В Windows эти программы (часто называемые приложениями или исполняемыми файлами ) часто называются, оканчиваясь на .exe (например, notepad.exe или winword.exe ), на компьютерах Mac их имена часто заканчиваются на .App (хотя Finder это скрывает).

Для микроконтроллеров двоичные файлы заканчиваются на .hex (сокращение от Intel Hex Format ). Возможны и другие форматы, но это в значительной степени стандартно.

Ваш компилятор сгенерирует файл .hex из кода, а затем все, что вам нужно сделать, это передать этот .шестнадцатеричная программа на чип!

Как обсуждалось в разделе «Что это такое?», Микросхема AVR имеет небольшой объем флэш-памяти. В этой памяти хранится программа. Когда чип запускается (вы даете ему питание), он запускает любую программу во флеш-памяти. Итак, все, что нам нужно сделать, это выяснить, как записать на флэш-память

.

Хороший способ подумать о вспышке — это изучить ее так, как вы, вероятно, знакомы с ней. Флэш-память также используется в картах MMC / SD, которые обычно используются в MP3-плеерах или цифровых камерах.Если вы посмотрите на нижнюю часть карточки, вы увидите маленькие золотые пальчики. Это контактные площадки.


Задняя часть мультимедийной карты. Анджей Барабаш.

Если вы посмотрите в спецификации карты MMC, вы обнаружите, что это то, для чего предназначены 7 контактов. (SD / высокоскоростные карты могут иметь дополнительные прокладки, но этот стандарт был добавлен позже, поскольку существующий стандарт считался слишком медленным для больших мегапиксельных камер)

Штифт # Имя контакта Функция контактов
1 #CS Выбор микросхемы (активировать)
2 SI Серийный вход
3 ЗЕМЛЯ Земля
4 VCC Мощность
5 SCK

Часы данных

6 Не подключен Не подключен
7

СО

Последовательный выход

Контакты питания и заземления используются для подключения питания к микросхеме.Вывод Chip Select используется для того, чтобы сообщить микросхеме, что он должен проснуться, вывод Serial In используется для отправки данных на карту, Serial Out — как данные отправляются с карты, а Data Clock — как мы сообщаем карте, насколько быстро мы хотим, чтобы данные были сохранены или получены. Данные выталкиваются из чипа по одному биту за раз, поэтому, если тактовая частота составляет 100 кГц, это означает, что в секунду передается 100 000 бит.

Если вы хотите восстановить или сохранить данные на флэш-карте, все, что вам нужно сделать, это вставить карту в устройство чтения флэш-карт.Затем у ридера есть драйвер на вашем компьютере, который позволяет вам просто перетаскивать файлы на изображение на экране, и он выполняет всю тяжелую работу по отправке данных на карту.

Ладно, при чем тут программист? Что ж, микроконтроллер — это как флеш-карта, а картридер — как программист. Когда вы вставляете чип в программатор (или, что более вероятно, кабель программатора в печатную плату, которая содержит чип), это позволяет программному обеспечению на вашем компьютере взаимодействовать с чипом через программатор.Обычно вы можете просто дать простую команду, например «отправить эту программу», и программист сделает всю тяжелую работу по программированию и проверке данных.

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

Например, я большой поклонник микросхемы ATtiny2313, поэтому давайте откроем «сводную» таблицу (всего лишь дюжина страниц вместо стандартных 250.На первой странице есть всякая информация о том, что находится в чипе.

Quick Quiz: Сколько EEPROM имеет чип? Как насчет флеш-памяти? БАРАН?

На второй странице распиновка. Мы будем иметь дело с пакетом PDIP (пластиковый двухрядный пакет), который выглядит следующим образом:

Распиновка воспроизводится здесь

Чип имеет 20 контактов. Посмотрите внимательно, и вы заметите, что 6 из этих контактов эквивалентны контактам карты SD / MMC.Есть вывод питания ( VCC ) и вывод заземления ( GND ), также есть вывод SCK (почему-то он называется UCSK ), вывод Serial Out ( MISO — Master In). Serial Out ) и Serial In pin ( MOSI — Master Out Serial In) . Единственное, чего у него нет, так это вывода / ChipSelect. Вместо этого он имеет вывод / RESET , который действует аналогичным образом. Когда на выводе / RESET находится положительное напряжение (такое же, как у VCC ), микросхема запускает программу, когда вывод / RESET находится на земле (такое же напряжение, как GND ), тогда микросхема останавливается. и слушает инструкции по программированию на выводах программирования.

У всех SD-карт одинаковые пальцы в одном месте, поэтому, когда вы вставляете карту в кард-ридер, подключаются правильные контактные площадки. Программирование AVR работает аналогичным образом. Вместо контактных площадок микросхему часто помещают в печатную плату, которая имеет контакты заголовка, в которые вставляется программатор, распиновка заголовка стандартизирована, так что любой программист может использоваться после правильного подключения заголовка.

Существует два стандарта для внутрисистемного программирования AVR:

Слева — стандартный 6-контактный разъем, справа — стандартный 10-контактный разъем, заголовки выглядят следующим образом:

Вот пример фотографии, показывающей, как это выглядит, когда микросхема подключена с 6-контактным разъемом


Фото любезно предоставлено EvilMadScientistLabs

Черная метка на печатной плате и заголовок обозначают контакт №1.Вы можете проследить провода, чтобы сопоставить контакты микросхемы с контактами заголовка и убедиться, что эта макетная плата правильная.

Упражнение: проверьте распиновку для этой целевой платы

Чтобы узнать, как сделать «целевую плату», которая позволит вам программировать AVR (в частности, как сказал ATtiny2313), посетите учебник EvilMadScientistLab. Это довольно просто и будет покрывать часть того же материала.

Теперь, когда вы знаете, как работает программирование, пришло время выбрать программатора weapon .

Что нужно для программирования микроконтроллеров AVR? | Орвин Демси

Компьютер
Если вы живете в 20 веке, вы должны знать, что такое компьютер. Если нет, то вы можете легко погуглить. О, убедитесь, что на вашем компьютере установлена ​​ОС Windows (операционная система), так как это руководство будет работать в Windows.

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

Мой программатор USBasp

Плата разработки
Плата разработки — это, по сути, инструмент, который позволяет микроконтроллеру взаимодействовать с программистом. Согласно моим выводам, отладочная плата также может называться минимальной системной или целевой платой.Причина, по которой ее называют минимальной системой, потому что это, по сути, система, позволяющая микроконтроллерам работать минимально. Что значит минимальный? Мы вернемся к этому позже. А пока просто помните, что отладочная плата / целевая плата / минимальная система подключает ваш микроконтроллер к вашему программисту. Кстати, вот мой:

Моя 40-контактная плата разработки AVR uC

Драйвер USBasp
Драйвер нужен, чтобы ваш компьютер мог распознавать USBasp.Если он не установлен, ваш компьютер не сможет распознать ваш программатор (USBasp), что сделает программирование в MCU невозможным.

Вот ссылка на драйвер USBasp, который я использовал, или вы можете найти его в Google:

https://www.fischl.de/usbasp/

Загрузите драйвер и сохраните его где угодно. Попробуйте вставить USBasp в порт USB, затем, чтобы проверить, распознает ли его компьютер, перейдите в Диспетчер устройств.

Вы увидите, что в разделе «Другие устройства» рядом с USBasp отображается небольшое желтое предупреждение.Это означает, что драйвер еще не установлен. Далее нам нужно установить драйвер.

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

Если драйвер не установлен успешно, вы все равно будете видеть предупреждающий символ на символе USBasp. Чтобы решить эту проблему, попробуйте переустановить драйвер, в большинстве случаев это будет основной причиной. Другой причиной может быть повреждение USBasp, поэтому вам может понадобиться новый, но это случается редко.

Теперь, когда ваш компьютер распознал USBasp, мы в основном готовы программировать MCU.Но нам нужно программное обеспечение, которое могло бы запускать и компилировать код C. Это программное обеспечение, которое мы собираемся использовать в этом руководстве, называется AVR Studio 7. AVR Studio — это IDE (интегрированная среда разработки), созданная в соответствии с требованиями AVR. AVR Studio можно бесплатно скачать здесь.

Сам AVR Studio 7 должен быть настроен так, чтобы он распознавал USBasp. Для получения информации о том, как настроить что-либо в AVR Studio, проверьте следующее.

WinAVR
WinAVR — это инструментальные средства разработки программного обеспечения для микропроцессоров Atmel.WinAVR можно бесплатно скачать здесь. WinAVR включает компилятор GNU GCC для C ++ и C, Блокнот программиста, MFile и AVRdude. «GNU GCC» может показаться устрашающим, но это просто компилятор для нашего кода C. Чтобы получить более интуитивное понимание того, как программировать MCU, рекомендуется начинать программирование с помощью блокнота программиста. Учебное пособие по этому поводу будет доступно здесь.

AVRdude
AVRdude — это программа для загрузки и выгрузки программы во встроенную память на микроконтроллерах AVR с использованием техники внутрисистемного программирования (ISP).Он может программировать Flash или EEPROM. AVRdude необходим, если вы хотите программировать микроконтроллер AVR. Чтобы проверить, установлен ли AVRdude, перейдите в командную строку, затем введите «avrdude», если на экране появится список команд AVRdude, значит, он установлен.

Список командной строки AVRdude

Внутри WinAVR есть пара программных инструментов, которые взаимодействуют таким образом, что наш код C может быть запрограммирован в микросхемы AVR. Это взаимодействие между этими инструментами называется цепочкой инструментов, представьте себе это как цепочку, в которой один конец связан с другим.Проще говоря, вот как наш код может оказаться в uC:

1. Откройте Atmel Studio 7.

2. Напишите программу на языке C.

3. Скомпилируйте с помощью компилятора GNU GCC.

4. Создайте шестнадцатеричный файл.

5. Дайте команду AVRdude прошить нашу программу в микроконтроллер.

6. Микроконтроллер выполняет шестнадцатеричный файл внутри своей флеш-памяти.

Для получения подробной информации о AVRdude я написал руководство о том, как программировать AVR с помощью блокнота программиста, пожалуйста, проверьте его.

Вот и все, ребята! Мы готовы запрограммировать несколько крутых вещей в наш MCU! Ознакомьтесь со следующей частью, чтобы начать нашу первую программу!

Терминология
Краткое изложение новых слов или сокращений в этом руководстве.

Flash / Program
Запишите код в наш MCU

MCU / uC
Аббревиатура микроконтроллера, MCU расшифровывается как Microcontroller Unit

IDE
Stands for Integrated Development Environment, представляет собой программное приложение, которое обеспечивает программист по разработке программного обеспечения.(взято из Википедии https://en.wikipedia.org/wiki/Integrated_development_environment)

USBasp
Один из программистов для AVR MCU.

Плата разработки / Минимальная система / Целевая плата
Эти три слова относятся к одному и тому же объекту — плате, которую мы использовали для подготовки нашего микроконтроллера перед прошивкой нашей программы.

WinAVR
Набор программных инструментов, созданных для программирования микроконтроллеров Atmel. Два важных элемента, которые включены в WinAVR:
— Компилятор GNU GCC: Компилятор C
— AVRdude: программа для управления содержимым микроконтроллера AVR с использованием внутрисистемного программирования (ISP)

ISP (Внутрисистемное программирование)
способность микросхемы, которую можно программировать, не удаляя ее из всей системы.

Учебники по

AVR — условное ветвление

Способность контролировать выполнение программы — один из наиболее фундаментальных и важных аспектов программирования на языке ассемблера. Без него микроконтроллеры просто последовательно выполняли бы инструкции в своей памяти, пока они не закончатся. Написание нетривиальной программы таким способом было бы чрезвычайно сложно, если бы не невозможно .

Управление потоком программы означает, что мы даем микроконтроллеру команду перейти от одного адреса в коде к другому — это называется ветвлением .Это можно сделать тремя разными способами:

  • Условное ветвление
  • Прыжки
  • Вызов подпрограммы

Условное ветвление позволяет вам проверить условие (например, установлен ли бит или равен ли регистр определенному значению) и перейти к в новое место, если условие истинно. Если это не так, микроконтроллер перейдет к следующей инструкции.

Прыжки — это форма Безусловный брейк .Он перенаправляет поток программы независимо от условий. Переход позволяет вам просто перейти к по новому адресу в программной памяти.

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

В этом руководстве мы специально рассмотрим Условное ветвление , названное так, поскольку оно создает несколько путей в программе.

Установка флагов в регистре состояния

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

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

Мнемоника Описание
CP сравнить
бит за канал сравнить с переноской
cpi сравнить с непосредственным
тст тест на ноль или минус

Инструкция cp позволяет нам сравнивать два регистра.

  ldi r16,0x01; загрузить r16 с помощью 0x01
ldi r17,0x02; загрузить r17 с помощью 0x02
cp r16, r17; сравнить r16 и r17
  

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

В приведенном выше примере флаг переноса будет установлен в регистре состояния после сравнения, поскольку мы, по сути, вычисляем 0x01 — 0x02.Из этого можно сделать вывод, что второй операнд больше первого.

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

  ldi r16,0x01; загрузить r16 с помощью 0x01
ldi r17,0x01; загрузить r17 с помощью 0x01
cp r16, r17; сравнить r16 и r17
  

После сравнения будет установлен нулевой флаг , поскольку 0x01 — 0x01 = 0x00. Таким образом, мы можем заключить, что два операнда равны.

Если необходимо сравнить более одного байта, можно использовать инструкцию cpc, которая будет включать бит переноса в сравнение.Например, для сравнения 16-битных чисел 0xAA01 и 0xAA02

  ldi r16,0x01; загрузить r16 с помощью 0x01
ldi r17,0xAA; загрузить r17 с помощью 0xAA
ldi r18,0x02; загрузить r18 с помощью 0x02
ldi r19,0xAA; загрузить r19 с помощью 0xAA

cp r16, r18; сравнить r16 и r18
cpc r17, r19; сравните r19 и r17 с carry  

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

Во втором сравнении, даже если старшие байты обоих чисел равны, Флаг переноса все равно будет установлен, правильно указывая, что 0xAA02 больше, чем 0xAA01.Если бы вместо этого использовалась инструкция cp, регистр состояния неверно указывал бы, что два числа равны.

Для регистров с 16 по 31 у нас есть немедленное сравнение cpi.

  ldi r16,0x05; загрузить r16 с помощью 0x05
cpi r16,0x05; сравните r16 с 0x05  

В приведенном выше примере будет установлен Zero Flag , что означает, что r16 равно константе, с которой мы его сравниваем.

Наконец, инструкция tst может использоваться в одном регистре, чтобы проверить, является ли он отрицательным или нулевым.tst установит как Sign , так и Negative Flag , если бит 7 регистра установлен, или установит Zero Flag , если регистр равен нулю. tst всегда сбрасывает Флаг переполнения дополнения до двух .

  ldi r16,0x80; загрузить r16 с помощью 0x80
tst r16; тест r16  

В приведенном выше примере будут установлены Sign и Negative Flag , поскольку бит 7 0x80 равен 1.

Условное ветвление

После установки флагов в регистре состояния существует множество команд условного перехода , которые могут управлять выполнением программы.

Мнемоника Описание
бус переход, если установлен флаг состояния
brbc ветвь, если флаг состояния сброшен
breq ветвь, если равно
brne ветвь, если не равно
brcs ответвление при переноске
brcc ветвь, если перевозка очищена
брш филиал, если такой же или выше
brlo ответвление нижнее
BRMI ветка если минус
брпл ветка если плюс
brge ветвь, если больше или равно, со знаком
brlt ветка, если меньше, подписано
brhs ответвление, если комплект для переноски половин
BRHC ветвь, если половина переноса очищена
brts ветвь, если установлен флаг t
brts ветвь, если флаг t сброшен
brvs переход, если установлен флаг переполнения
brvc переход, если флаг переполнения сброшен
бри переход, если прерывание разрешено
мост переход, если прерывание отключено

Синтаксис инструкции ветвления просто

Если условие, указанное в инструкции ветвления, удовлетворяется, выполняется переход к адресу, отмеченному меткой.В противном случае он перейдет к следующей инструкции.

Например, следующий код сравнивает r16 и r17 и выполняет переход к lbl, если они равны.

  cp r16, r17; сравнить r16 и r17
...
breq lbl; ветвь, если r16 == r17
...
фунт:  

Некоторые инструкции условного ветвления могут показаться избыточными, но это только потому, что существует беззнаковая и подписанная версия . Например, brsh — ветвь, если такая же или выше , используется с беззнаковыми значениями

  ldi r16,0x9C; загрузить r16 с помощью 0x9C (156 беззнаковых)
ldi r17,0x0F; загрузить r17 с помощью 0x0F (15 беззнаковых)
cp r16, r17; сравнить r16 и r17
...
brsh lbl; r16> = r17, код будет ветвиться
...
фунт:  

Инструкция brge — ветвь, если она больше или равна , выполняет тот же тип сравнения, но работает со значениями со знаком.

  ldi r16,0x9C; загрузить r16 с 0x9C (-100 подписано)
ldi r17,0x0F; загрузить r17 с 0x0F (15 со знаком)
cp r16, r17; сравнить r16 и r17
...
brsh lbl; r16 не> = r17, код не будет ветвиться
...
фунт:  

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

  ldi r16,0x9C; загрузить r16 с помощью 0x9C (156 беззнаковых)
ldi r17,0x0F; загрузить r17 с помощью 0x0F (15 беззнаковых)
cp r17, r16; сравнить r17 и r16
...
brsh lbl; r16 не <= r17, код не будет ветвиться
...
фунт:  

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

Цикл пока

A В то время как цикл в сборке может быть сконструирован следующим образом

 петля : cpi r16,100; сравните r16 и 100
...
brsh next; ветвь, если r16> = 100
rjmp loop; повторить цикл

следующий:  

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

Это эквивалентно следующему коду C, предполагая, что r16 хранится в переменной x.

Цикл "Делай, пока"

В качестве альтернативы, цикл Do While Loop может быть сконструирован в сборке как

 петля : ...
cpi r16,0; проверьте, равно ли r16 нулю
брючная петля; повторить цикл, если r16 не равно 0  

Обратите внимание, что в цикле Do While Loop нам не нужна инструкция rjmp.Условный переход используется для повторения цикла, и программа просто переходит к следующей инструкции, если условие не выполняется.

Это эквивалентно следующему коду C, предполагая, что r16 хранится в переменной x.

Для петли

Узел Для цикла показан ниже

  clr r16; очистить r16
цикл: cpi r16,11; сравните r16 с 11
breq next; прервать цикл, если он равен
...
inc r16; инкремент r16
rjmp loop; повторить цикл

следующий:  

В этом примере наш индекс For Loop хранится в r16 и инициализируется значением 0.r16 сравнивается с числом 11 и выйдет из цикла, когда оно станет равным. Обратите внимание, что это наш способ проверить, меньше ли r16 или равно 10.

Это эквивалентно следующему коду C, предполагая, что r16 хранится в переменной x.

Разветвление "Пропустить"

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

Мнемоника Описание
сбрц пропустить, если бит в регистре очищен
сбрс пропустить, если бит в регистре установлен
сбич пропустить, если бит в регистре ввода-вывода очищен
сбис пропустить, если установлен бит в регистре ввода-вывода

sbrc и sbrs позволяют «пропустить» следующую инструкцию, если бит в рабочем регистре общего назначения установлен или очищен.Например, следующее создаст цикл, который будет выполняться до тех пор, пока не будет установлен бит 3 r0.

 петля : ...; код цикла
сбрс р0,3; прервать цикл, если бит 3 r0 равен 0
rjmp loop; повторить цикл  

Кроме того, sbic и sbis могут использоваться одинаковым образом для регистраторов ввода-вывода. Например, следующее создаст цикл, который будет выполняться до тех пор, пока не будет очищен PINB3.

 петля : ...; код цикла
сбич ПИНБ, 3; прервать цикл, когда PINB3 равен 0
rjmp loop; повторить цикл  

Заключение

Вот и все, условное ветвление в сборке AVR.Понимание вышеизложенного - значительный шаг вперед в написании полезных программ на ассемблере.

Кто голосует с автоматической регистрацией избирателей?

См. Также : «Видео: автоматическая регистрация избирателей штата Орегон»

Введение и резюме

После нескольких лет работы различных групп граждан и государственных чиновников, штат Орегон принял первый в стране закон об автоматической регистрации избирателей (AVR) в 2015 году. Он вступил в силу в январе 2016 года и использовался для Выборы 2016 года.Программа, получившая название Oregon Motor Voter (OMV), направлена ​​на модернизацию системы регистрации избирателей, повышение точности и эффективности списков избирателей, упрощение процесса регистрации для избирателей и администраторов и повышение участия избирателей.

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

InProgress

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

  • Более 272 000 новых человек были добавлены в списки избирателей, и более 98 000 из них были новыми избирателями на президентских выборах в ноябре 2016 года.
  • человек, зарегистрировавшийся в OMV, составили 8,7 процента людей, зарегистрированных для голосования, и составили 4,7 процента всех избирателей в Орегоне.
  • Зарегистрировано более 116 000 человек, которые в противном случае вряд ли сделали бы это, и более 40 000 из этих ранее не участвовавших в голосовании людей проголосовали на ноябрьских выборах.
  • Электорат Орегона в настоящее время более представителен для населения штата, поскольку граждане, зарегистрированные через OMV, моложе, более сельские, имеют более низкий доход и более разнообразны в этническом отношении.

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

  • Заметно моложе - около 40 процентов регистрантов AVR и 37 процентов избирателей AVR были в возрасте 30 лет или моложе.Для сравнения, 20 процентов правомочных граждан Орегона в возрасте от 18 до 29 лет
  • С большей вероятностью будут жить в пригородных районах и реже - в городских районах
  • С большей вероятностью будут жить в районах с низким и средним доходом
  • С большей вероятностью будут жить в районах с низким уровнем образования
  • Более вероятно, что они живут в расово разнообразных районах - сообщество среднего регистранта AVR было более латиноамериканским и менее белым, чем сообщество традиционных регистрантов

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

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

Как работает автоматическая регистрация избирателей в штате Орегон

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

Когда жители штата Орегон сообщают свое имя, адрес (место жительства и / или почтовый адрес, если применимо), дату рождения и информацию о гражданстве в Управление транспортных средств, агентство передает эту информацию в Отдел по выборам Канцелярии Государственного секретаря. Только лица, подтвердившие свое гражданство через транзакцию Office of Motor Vehicles, добавляются через AVR.Информация для заявителей, которые демонстрируют свое местожительство иным образом, и лиц с защищенными или конфиденциальными записями не передается государственному секретарю.

После того, как избирательный отдел штата Орегон получает соответствующие списки избирателей из Управления автотранспортных средств, он отправляет открытки вновь зарегистрированным избирателям, информируя их о том, что:

  • Они будут зарегистрированы для голосования через AVR.
  • Они могут отказаться от добавления в список для регистрации избирателей, подписав и отправив открытку по почте.
  • Они могут зарегистрироваться в политической партии, вернув открытку, которая позволяет им участвовать в закрытых государственных первичных выборах.

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

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

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

Регистрация и общая явка в AVR

Офис государственного секретаря штата Орегон сообщил, что в 2016 году 238 876 жителей Орегона зарегистрировались как неаффилированные избиратели через систему AVR, а еще 33 826 человек отправили открытку обратно в политическую партию. В общей сложности 272 702 человека были автоматически зарегистрированы для голосования, и более 98 000 впоследствии проголосовали на президентских выборах 2016 года.

Однако сколько людей зарегистрировали AVR, которые не зарегистрировались бы сами? Сколько из них оказалось, кто иначе не проголосовал бы?

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

  • Они не были зарегистрированы во время выборов 2008, 2010, 2012 и 2014 годов.
  • Они были достаточно взрослыми, чтобы их можно было зарегистрировать и проголосовать с 2008 года.
  • Они не вернули свою регистрационную открытку.

Используя эти критерии, более 116 000 человек, которые были зарегистрированы через OMV, вероятно, не зарегистрировались бы в противном случае.Из них в 2016 году проголосовало более 40 000 человек.

По состоянию на 31 октября 2016 года 1,4 миллиона записей были переданы в электронном виде из Управления транспортных средств государственному секретарю, и около 75 процентов этих записей соответствовали существующим зарегистрированным избирателям. Госсекретарь разослала 304 227 писем, уведомляющих людей о новой регистрации.

Из 304 227 отправленных почтовых отправителей 9 485 не были доставлены и, следовательно, не зарегистрированы - немногим более 3 процентов всех открыток, - в то время как 25 112 соответствующих критериям граждан решили отказаться от регистрации и вернули свои открытки с указанием этого выбора.269 ​​130 отвечающих критериям лиц были отправлены клеркам графства, которые добавили их в списки. Из этих 269 130 избирателей 32 430, или 11 процентов, вернули свои карточки, чтобы выбрать политическую партию.

Хотя в избирательном цикле 2016 года явка по всей стране росла, в Орегоне наблюдался самый большой рост среди всех штатов - на 4,1 пункта по сравнению с 2012 годом. Учитывая приведенные выше результаты, кажется разумным сказать, что AVR сыграла большую роль в этом росте. .

География и демография регистрантов OMV

Хорошо известной особенностью американской политики является то, что процессы регистрации избирателей в каждом штате - обычно более сложные, чем в большинстве других демократических стран - приводят к тому, что численность зарегистрированных избирателей отличается от численности зарегистрированных избирателей. основное население.Зарегистрированные люди, как правило, старше, более образованы, имеют более высокие доходы и, как группа, менее разнообразны в расовом отношении, чем общий круг имеющих право голоса граждан избирательного возраста.

Следовательно, когда штат изменяет процесс регистрации, важно задаться вопросом, усиливают ли эти изменения эти различия или уменьшают их. Следующий раздел отвечает на этот вопрос для AVR в Орегоне с использованием демографических и географических данных из файла регистрации избирателей по всему штату, который включает домашние адреса и даты рождения людей.(Подробнее об использовании адресов см. в разделе «Методология»)

Возраст

Зарегистрированные лица OMV были намного моложе традиционных регистрантов.

Хотя AVR в Орегоне не был специально разработан для самых молодых избирателей, он действительно зарегистрировал непропорционально молодую группу людей. В 2016 году люди в возрасте от 18 до 29 лет составляли около 18 процентов от числа традиционных регистрантов, но немногим более 40 процентов от числа регистрантов OMV. Для сравнения, молодые люди в возрасте от 18 до 29 лет составляют примерно 20 процентов законного населения штата Орегон.

Село по сравнению с городом

Зарегистрированные лица OMV проживали в менее городских и более пригородных районах по сравнению с традиционными зарегистрированными лицами.

Используя географические данные в файле избирателей и категории сельских жителей, разработанные Министерством сельского хозяйства США, авторы классифицировали всех зарегистрировавшихся как проживающих в городских или сельских почтовых индексах. Зарегистрированные лица OMV реже проживали в районах, классифицируемых как «столичный центр», чем их традиционно зарегистрированные коллеги (67.7 процентов по сравнению с 61,4 процента) и с большей вероятностью будут проживать в прилегающих к городской местности районах (14,3 процента против 17,6 процента). Другими словами, по сравнению с традиционными регистрантами, регистранты OMV с меньшей вероятностью были из густонаселенных городских районов и с большей вероятностью приехали из пригородов, окружающих города.

Доход

По сравнению с традиционными зарегистрированными лицами, зарегистрированные лица OMV проживали в районах с более низкими доходами.

Средний регистрант OMV проживал в районе со средним доходом 49 886 долларов США.Та же цифра для сопоставимого традиционного регистранта составила 54 200 долларов. На рисунке 2 показано распределение OMV и традиционных регистрантов по районам с разными средними доходами. Регистранты OMV с гораздо большей вероятностью приехали из мест, где средний доход составляет менее 60 000 долларов, по сравнению с традиционными регистрантами (67,5 процента против 59,3 процента). Традиционные регистранты с большей вероятностью жили в районах с более высокими доходами.


Кроме того, средний регистрант OMV происходил из области, где 12.7 процентов домохозяйств испытали бедность за последние 12 месяцев по сравнению с только 11,3 процентами для традиционных регистрантов.
Раса

регистрантов OMV проживали в районах, которые были менее белыми и более латиноамериканскими, чем традиционные регистранты.

Средняя территория, в которой проживал регистрант OMV, была на 1,6 процента менее белыми и на 1,8 процента больше латиноамериканцами, чем сопоставимая территория традиционного регистранта. Как показано в Таблице 1, зарегистрированные лица OMV также чаще находились в менее черных и азиатских регионах, но эти различия были относительно незначительными.

Образование

Зарегистрированные лица OMV жили в менее образованных районах по сравнению с традиционными регистрантами.

Как показано в таблице 2, зарегистрированные лица OMV с большей вероятностью проживали в районах с более низким уровнем образования. В частности, люди в регионах, где проживали зарегистрированные лица OMV, с большей вероятностью имели уровень образования ниже средней школы, средней школы или какого-либо колледжа. Традиционные регистранты с большей вероятностью жили в районах, где люди имели более высокий уровень образования.

Географическое распространение

В то время как зарегистрированные лица OMV составили 8,7 процента зарегистрированных избирателей на выборах 2016 года, регистрация OMV не была равномерно распределена по штату. В одних сообществах через AVR зарегистрирован больший процент населения, в других - меньший. На Рисунке 3 области разбиты на шесть категорий в зависимости от того, сколько их зарегистрированных избирателей было зарегистрировано через OMV - менее 3 процентов; От 3 до 5,9 процента; 6 процентов к 8.9 процентов; От 9 до 11,9 процента; От 12 до 14,9 процента; и 15 процентов и более. На рисунке 3 показано, что большинство людей, которые были недавно зарегистрированы для голосования через систему, жили в местах, где значительный процент регистрантов был зарегистрирован через OMV.

Фактически, немногим более 12 процентов зарегистрированных избирателей проживали в районах, где 12 или более процентов зарегистрированных избирателей были зарегистрированы через OMV. Лишь очень небольшой процент зарегистрированных избирателей (около 1 процента) проживал в месте, где менее 3 процентов зарегистрированных избирателей были зарегистрированы в OMV.

Геополитический путеводитель по Орегону

Орегон географически и политически разделен между долиной Уилламетт и восточным Орегоном.

Долина Уилламетт, включая район метро Портленд-Салем у северной границы, проходит между двумя горными хребтами в западной трети штата. Это наиболее экономически динамичная и этнически разнообразная часть штата, в которой проживает около 70 процентов населения штата, и в целом она голосует за демократов. Пригороды вокруг Портленда и Салема, как и во многих штатах, более центристские и являются центром политических кампаний в масштабах штата и на национальном уровне.Корваллис и Юджин, где расположены два флагманских государственных университета штата, находятся в центральной части долины, а центральная и южная долины являются домом для легендарной винодельческой промышленности Орегона.

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

Помимо этих обширных регионов, есть еще две области Орегона, которые заслуживают внимания. Центральный Орегон - особенно район метро Бенд-Редмонд - был одним из самых быстрорастущих регионов за последнее десятилетие, с особым притоком пенсионеров.

Прибрежный штат Орегон также пережил значительный рост населения и экономики, но, как и в Центральном Орегоне, этот рост почти полностью ограничен прибывающими пенсионерами и туристической индустрией. Этот регион особенно примечателен тем, что прибрежные богатства граничат с некоторыми из самых бедных частей штата.Эти прибрежные округа сильно пострадали от упадка лесной промышленности и, как следствие, обвала местных налоговых поступлений.

Существуют значительные географические различия в регистрации OMV - «горячие» и «холодные» точки с более высокой или меньшей долей владельцев регистрации OMV. Хотя эти результаты являются предварительными, на Рисунке 4 показано, что многие районы с долей владельцев регистраций OMV ниже среднего (показаны здесь зеленым цветом) были сгруппированы в самом Портленде и его западных пригородах и следуют по Орегонской трассе 99W - автомагистрали штата, которая проходит через сравнительно благополучные сельскохозяйственные районы и два студенческих городка.Скорее всего, OMV не добавила так много новых зарегистрированных избирателей в этих областях, потому что у них уже был высокий уровень регистрации - результат относительно более высоких доходов и уровня образования населения. Другие «холодные точки» - Бенд и Редмонд в центре карты, а также небольшие горные городки Валлова в дальнем северо-восточном углу карты - соответствуют аналогичной схеме.


OMV привела к сравнительно более высокому уровню регистрации в «горячих точках» оранжевого цвета на карте. Большая часть побережья кажется оранжевой, но что не видно при этом разрешении, так это то, что большая часть оранжевого цвета находится внутри страны, недалеко от побережья, в то время как более богатые участки береговой линии на самом деле зеленые.Это первый намек на то, что OMV принесла пользу регионам, переживающим экономический спад, даже если они географически примыкают к благополучным районам.

В районе метро Портленда «горячие точки» весьма характерны для любого наблюдателя, знакомого с быстрыми изменениями, которые произошли в этом регионе за последнее десятилетие. Большая часть оранжевого сосредоточена в районах к востоку от Портленда, районах с более высокой долей граждан со средним и низким доходом и домам большинства цветных сообществ Портленда.Эта модель продолжается на юг через сообщества, сгруппированные вдоль коридора Interstate 5.

На южной оконечности долины Уилламетт тот же образец, что и на побережье, повторяется. Зеленая зона - это Медфорд и Эшленд - единственные очаги богатства в этом районе. Оранжевые регионы - это Грантс-Пасс на востоке, город, сильно пострадавший от спада древесины, и Кламат-Фолс на западе, сельскохозяйственный городок, который уже давно ведет спор о правах на воду.

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

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

Явка, география и демография избирателей OMV

Хотя приведенные выше регистрационные номера впечатляют, окончательный стандарт, по которому будет оцениваться программа AVR штата Орегон, заключается в том, стимулирует ли она большее гражданское участие.Короче говоря, появляются ли люди, зарегистрированные через OMV, для голосования?

На выборах в ноябре 2016 года 84,1 процента традиционно зарегистрированных избирателей - более 2 миллионов человек - проголосовали в Орегоне, что является высокой планкой для участия. Избиратели OMV оказались более чем вдвое меньше - 43,6%.

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

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

В-третьих, как и во всем, ожидается изменение. То есть, хотя 43,6 процента может быть средней явкой для зарегистрированных OMV, это число, вероятно, будет варьироваться в зависимости от важных демографических, политических и географических характеристик. В этом разделе рассматривается, как явка варьировалась в зависимости от возраста, демографии, географии, а также от принадлежности к партии.

Проще говоря, повлияли ли различия между зарегистрировавшимися на тех, кто явился и проголосовал в день выборов? По большому счету, да.Несмотря на то, что избиратели OMV менее заметны, чем различия между OMV и традиционными владельцами регистраций, они также демографически и географически отличаются от своих традиционных собратьев.

Возраст

Избиратели OMV были намного моложе традиционных избирателей.

Как и зарегистрированные в OMV, избиратели OMV были непропорционально молоды. Лица в возрасте от 18 до 29 лет составляли около 13 процентов традиционных регистрантов, которые проголосовали, но немногим более 37 процентов избирателей OMV. Для справки, люди в возрасте от 18 до 29 лет составляют 20 процентов населения штата Орегон, имеющего право на получение помощи.

Село по сравнению с городом

По сравнению с традиционными избирателями, избиратели OMV жили в менее городских и более пригородных районах.

Используя те же почтовые индексы категорий сельской местности, которые использовались в предыдущем разделе, авторы обнаружили аналогичные результаты для избирателей, которые были зарегистрированы через OMV. По сравнению с традиционными избирателями, они с меньшей вероятностью были из основных почтовых индексов городских агломераций (68,1 процента против 64,9 процента) и с большей вероятностью были из прилегающих к городским районам, но не из городских районов (14.1 процент против 16,1 процента).

Доход

По сравнению с традиционными избирателями, избиратели OMV жили в районах с более низким доходом .

Средний избиратель OMV жил в районе со средним доходом 49 886 долларов. Та же цифра для сопоставимого традиционного избирателя составила 55 446 долларов. Средний избиратель OMV происходил из района, где 11,7 процента домохозяйств испытали бедность за последние 12 месяцев по сравнению с только 10,8 процентами их традиционных собратьев.

Раса

По сравнению с традиционными избирателями, избиратели OMV жили в менее белых и более латиноамериканских районах.

Как и зарегистрированные лица, избиратели OMV в среднем проживали в более разнообразных в расовом отношении местах. Средний избиратель OMV жил в районе, где на 1,1% было меньше белых и на 1,1% больше латиноамериканцев.

Образование

По сравнению с традиционными избирателями, избиратели OMV жили в менее образованных районах.

Как показано в Таблице 4, избиратели OMV с большей вероятностью проживали в районах с более низким уровнем образования. В частности, люди в районах, где проживали избиратели OMV, с большей вероятностью имели уровень образования ниже средней школы, средней школы или какого-либо колледжа.

Географическое распространение

В то время как избиратели OMV составляли 4,7 процента всех избирателей на уровне штата, избиратели OMV не были равномерно распределены географически. В некоторых сообществах через систему был зарегистрирован больший процент голосующих, а в других - меньший. На Рисунке 6 области разбиты на пять категорий в зависимости от того, сколько их избирателей было зарегистрировано через OMV - менее 2 процентов; От 2 до 3,9 процента; От 4 до 5,9 процента; 6 процентов к 7.9 процентов; и 8 процентов и более.


Глядя на состав избирателей, рисунок 6 показывает, что большинство людей, проголосовавших после регистрации через OMV, жили в местах, где значительный процент избирателей был зарегистрирован через OMV. Фактически, более 16 процентов избирателей проживали в местах, где через OMV было зарегистрировано 6 или более процентов избирателей. Лишь очень небольшой процент избирателей (около 1,4 процента) проживал в месте, где менее 2 процентов избирателей зарегистрировались в OMV.
Партийная принадлежность и явка

Зарегистрированные лица OMV, которые были связаны с какой-либо партией, имели гораздо больше шансов проголосовать.

Твердо установленный вывод в рамках политологии состоит в том, что существует связь между партийной принадлежностью и явкой - люди, которые сильно отождествляют себя с партией, также, как правило, имеют более высокий уровень участия. Причинно-следственная связь кажется вероятной, что история идет в обоих направлениях. С одной стороны, политические деятели с большей вероятностью будут сторонниками.С другой стороны, сам факт отождествления с партией повышает вероятность того, что политические кампании тратят время и деньги на то, чтобы привести вас к участию в выборах.

Чтобы изучить эту взаимосвязь, авторы разделили владельцев регистраций на четыре группы: традиционные зарегистрированные лица, связанные с партиями, лица, не являющиеся аффилированными традиционными владельцами регистрации, лица, зарегистрированные в OMV, связанные с партиями, и лица, не являющиеся аффилированными лицами, зарегистрированными OMV. На Рисунке 7 показана явка этих четырех групп с двумя примечательными особенностями.


Во-первых, несмотря на различия в явке между OMV и традиционными регистрантами, о которых говорилось ранее в отчете, уровень явки партийных регистрантов OMV был почти идентичен явке их традиционных коллег - разница примерно в 2 раза.6 процентных пунктов, около 84,9 процента по сравнению с 87,5 процента.

Во-вторых, явка неаффилированных избирателей OMV была значительно ниже, чем их аффилированные коллеги OMV - около 35,7 процента по сравнению с 84,9 процента. Опять же, на это, вероятно, влияет динамика, окружающая факт включения в партийный список, а также сопутствующая кампания и охват кандидатов, которые в результате возникают.

Более пристальный взгляд на возраст и явку

Различия в явке можно исследовать на более глубоком уровне, добавив к этому возрасту.На рис. 8 показана явка в штате Орегон с разбивкой по методам регистрации (традиционный или OMV), партийной принадлежности (аффилированная с какой-либо партией или неаффилированной) и возрастным группам.

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

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

Более глубокий взгляд на географию и посещаемость

На рис. 9 показаны области, в которых зарегистрированные лица OMV явились сравнительно выше (оранжевый) или ниже (зеленый), чем средняя явка OMV.


Опять же, этот анализ является предварительным, но из данных выявляются некоторые четкие географические закономерности. Области, которые демонстрировали сравнительно низкие уровни регистрации OMV, часто демонстрировали более высокий уровень явки среди регистрантов OMV. Например, густонаселенные районы вокруг шоссе штата, которое проходит через винодельческий регион, и двух студенческих городков - 99W - также являются местами, где зарегистрированные лица OMV проголосовали с наибольшим количеством голосов. Тем не менее, сразу к востоку от них, вдоль межштатной автомагистрали 5, регистранты OMV оказались ниже среднего.Точно так же центральные муниципальные районы Портленда - районы, в которых появилось значительное количество новых жителей, рост цен на жилье и мобильность - оказались более высокими, чем средние зарегистрированные лица OMV, в то время как районы, расположенные всего в нескольких милях к востоку, показали одни из самых низких показателей. явка участников OMV.

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

Уроки из Орегона

Это исследование демонстрирует значительное влияние AVR на регистрацию и явку избирателей в Орегоне.Кроме того, необходимо извлечь уроки из Орегона для использования в других штатах - как с точки зрения того, о чем следует думать, пытаясь пройти AVR, так и как обеспечить устойчивое взаимодействие.

За годы, предшествовавшие принятию OMV, The Oregon Bus Project, организация, которая помогает молодым людям регистрироваться, начала обсуждать более эффективный способ повышения гражданской активности среди имеющих на это право жителей штата Орегон. Посмотрев на то, как другие страны регистрируют избирателей, было решено, что лучшей политикой будет система AVR, которая позволяет всем имеющим право жителям Орегона автоматически добавляться в списки.

Впервые представленный в 2013 году, законопроект о AVR стал законодательным приоритетом на сессии 2015 года. Беспартийные общественные группы сыграли значительную роль в окончательном достижении прохода. Клерки округа Орегон и широкая коалиция групп и организаций добросовестного правительства, включая AARP, Азиатско-Тихоокеанскую американскую сеть Орегона, Городскую лигу Портленда, студенческие группы и группы по защите прав людей с ограниченными возможностями, высказались в пользу законопроекта.

Законопроект прошел обе палаты, и новый губернатор штата Орегон.Кейт Браун (D) - которая в качестве госсекретаря руководила продвижением AVR - подписала закон. Тогдашний госсекретарь Джин Аткинс (справа) успешно внедрила OMV к всеобщим выборам 2016 года, а нынешний государственный секретарь Деннис Ричардсон (справа) продолжил успешно внедрять процесс OMV с момента своего избрания в 2016 году.

Из опыта штата Орегон, среди многих других, явились три совета:

  • Сосредоточьтесь на технологиях с самого начала: Оценка технологического потенциала и процедур, используемых Управлением автотранспортных средств штата Орегон и государственным секретарем, имела решающее значение для обеспечения того, чтобы система AVR работала точно, эффективно и безопасно.
  • Объедините людей с широким спектром знаний и точек зрения и убедитесь, что они участвуют от начала до конца: Вовлечение широкого круга заинтересованных сторон из всех сторон и со всех сторон способствовало беспрепятственному внедрению закона штата Орегон. Привлекая партнеров на протяжении всего процесса - от принятия закона до нормотворчества и реализации - Орегон решал вопросы конфиденциальности и конфиденциальности; обеспечили, чтобы у окружных клерков были необходимые инструменты; и в конечном итоге способствовал получению описанных выше результатов.
  • Повышение уровня информированности о гражданской активности: Число проголосовавших неаффилированных граждан свидетельствует о том, что OMV может продолжать улучшать участие как в сельских, так и в городских районах за счет повышения уровня гражданского образования. AVR дает возможность повысить осведомленность и заинтересованность в участии в выборах, поскольку этап регистрации уже достигнут. В случае штата Орегон информационно-пропагандистская деятельность может быть сосредоточена на 54 процентах владельцев регистрации OMV, которые не голосовали.

Заключение

В этом отчете представлен углубленный анализ влияния AVR на штат Орегон в 2016 году - с точки зрения исходных чисел и процентов - с разбивкой данных по демографическим данным.

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

Благодаря AVR сотни тысяч жителей Орегона стали зарегистрированными избирателями.Почти 100 000 из этих новых регистрантов проголосовали на выборах 2016 года, что составляет 4,7 процента всех избирателей. Имеются убедительные доказательства того, что десятки тысяч этих граждан не проголосовали бы, если бы не система AVR.

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

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

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

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

Методология

Геокодирование, пространственное объединение и данные сообщества
Файл избирателя

Oregon содержит почтовый адрес, город и почтовый индекс каждого регистранта.Эти фрагменты данных можно преобразовать в точки широты и долготы с помощью процесса, называемого геокодированием.

Используя метод, называемый пространственным объединением, эти точки широты и долготы использовались для определения географических областей - штатов, округов, участков переписи и т. Д. - в которых проживали зарегистрированные лица. Для этого исследования авторы определили и проанализировали блочные группы переписи. Численность населения на территории этого типа варьируется - от 600 до 3000 человек - но обычно ее можно рассматривать как приблизительный показатель местного сообщества человека.Наконец, авторы приложили данные о демографических, экономических и социальных характеристиках каждой блочной группы, используя данные 5-летнего исследования американского сообщества за 2011–2015 годы.

Стрелка модельная

Для точной оценки явки мелкозернистых групп в Орегоне в этом отчете использовалась перекрестно-вложенная многоуровневая модель.

Этот процесс начался с разбивки зарегистрированного населения на более чем 73 000 групп на основе:

  • Способ их регистрации (OMV в сравнении с традиционным)
  • Были ли они зарегистрированы в политической партии (аффилированные или неаффилированные)
  • Их возрастная группа (от 18 до 29, от 30 до 39, от 40 до 49, от 50 до 59, от 60 до 69, от 70 до 79, 80 и старше)
  • Их географическое положение (округ, переписной участок и переписная группа)

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

Явка с учетом возраста

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

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

Об авторах

Роберт Гриффин - старший аналитик Центра американского прогресса, специализирующийся на демографических изменениях и политическом поведении Америки.Он является соавтором и ведущим аналитиком данных проекта «State of Change» - сотрудничества между Центром американского прогресса, демографом Уильямом Х. Фреем из Института Брукингса, Американским институтом предпринимательства и Центром двухпартийной политики, который спрогнозировал демографические изменения с 1980 по 2060 год во всех 50 штатах, подробно описал потенциальные политические последствия этих изменений и задокументировал прошлые и будущие проблемы представительства в американском электорате. Он читал курсы по методологии исследований, статистике, общественному мнению и политической защите для Университета Джорджа Вашингтона, Университета штата Пенсильвания и Университета Лойола в Чикаго.

Пол Гронке - профессор политологии в Рид-колледже в Портленде, штат Орегон. Он специализируется на удобном и досрочном голосовании, проведении выборов, общественном мнении и выборах. В 2005 году он основал Информационный центр по досрочному голосованию, который сотрудничал с правительствами ряда штатов и местных органов власти, секретарями штатов и директорами по выборам штатов, федеральными агентствами и некоммерческими организациями, чтобы предоставлять основанные на фактах решения вопросов, связанных с досрочным голосованием и Избирательная администрация.Он является редактором Election Law Journal, , междисциплинарного журнала по избирательному праву, администрации и политике, и соредактором PS: Polit Science & Politics, , одного из трех ведущих журналов Американской ассоциации политических наук.

Това Ван - директор по политике и исследованиям в Центре безопасных и современных выборов и старший научный сотрудник Демос. У нее 20-летний опыт работы с адвокатами, учеными и политическими лидерами по вопросам улучшения демократии.Она сосредоточила свое внимание на вопросах, связанных с большей политической интеграцией в Соединенных Штатах, в том числе на крупных исследованиях повышения уровня участия в выборах среди людей с низким доходом, цветных сообществ, натурализованных иммигрантов, женщин и коренных американцев. Ее книга, получившая высокую оценку критиков, Политика подавления избирателей: защита и расширение права американцев на голосование была опубликована в 2012 году издательством Cornell University Press . Она также консультирует международные организации и государственных служащих по вопросам избирательных прав и избирательной реформы в странах по всему миру.Ее комментарии о голосовании и участии публиковались в многочисленных печатных СМИ, включая The New York Times , The Washington Post , The Hill и Politico , а также она появлялась на многочисленных национальных теле- и радиопрограммах. .

Лиз Кеннеди - директор по вопросам демократии и правительственной реформы в Центре американского прогресса. Она занимается исследованиями, разработкой политики и общественной защитой, чтобы восстановить баланс между демократией, ограничивая антидемократическую власть богатых особых интересов над правительством и расширяя права и возможности избирателей, чтобы правительство работало на людей.Кеннеди является автором многих статей и регулярно выступает по вопросам, включая конфликты интересов, лоббирование и корпоративное политическое влияние, реформу финансирования избирательных кампаний, права голоса, подавление избирателей и перераспределение избирательных округов. До прихода в CAP Кеннеди занимался вопросами права голоса, денег в политике и демократической подотчетности в качестве советника и стратега кампании в Demos и в качестве поверенного в программе демократии в Центре правосудия Бреннана в Школе права Нью-Йоркского университета.

Примечания

avr-libc: данные в программном пространстве

Значит, у вас есть постоянные данные, и у вас заканчивается место для их хранения? Многие AVR имеют ограниченный объем оперативной памяти для хранения данных, но могут иметь больше свободного места во флеш-памяти.AVR - это процессор с гарвардской архитектурой, в котором для программы используется Flash, для данных - ОЗУ, и каждый из них имеет отдельные адресные пространства. Непросто получить постоянные данные для хранения в пространстве программы и извлечь эти данные для использования в приложении AVR.

Проблема усугубляется тем фактом, что язык C не был разработан для архитектур Гарварда, он был разработан для архитектур фон Неймана, где код и данные находятся в одном адресном пространстве. Это означает, что любой компилятор для процессора с гарвардской архитектурой, такой как AVR, должен использовать другие средства для работы с отдельными адресными пространствами.

Некоторые компиляторы используют нестандартные ключевые слова языка C или расширяют стандартный синтаксис нестандартными способами. Набор инструментов AVR использует другой подход.

GCC имеет специальное ключевое слово __attribute__ , которое используется для присоединения различных атрибутов к таким вещам, как объявления функций, переменные и типы. За этим ключевым словом следует спецификация атрибута в двойных скобках. В AVR GCC есть специальный атрибут progmem .Этот атрибут используется в объявлениях данных и сообщает компилятору разместить данные в программной памяти (Flash).

AVR-Libc предоставляет простой макрос PROGMEM , который определяется как синтаксис атрибута GCC с атрибутом progmem . Этот макрос был создан для удобства конечного пользователя, как мы увидим ниже. Макрос PROGMEM определен в системном заголовочном файле .

Трудно модифицировать GCC для создания новых расширений синтаксиса языка C, поэтому вместо этого avr-libc создал макросы для извлечения данных из области программы.Эти макросы также находятся в системном заголовочном файле .

Многие пользователи поднимают идею использования ключевого слова C const как средства объявления данных как находящиеся в программном пространстве. Это было бы злоупотреблением предполагаемым значением ключевого слова const .

const используется, чтобы сообщить компилятору, что данные должны быть «только для чтения». Он используется, чтобы облегчить компилятору выполнение определенных преобразований или помочь компилятору проверить неправильное использование этих переменных.

Например, ключевое слово const обычно используется во многих функциях как модификатор типа параметра. Это сообщает компилятору, что функция будет использовать параметр только для чтения и не будет изменять содержимое переменной параметра.

const был предназначен для таких целей, а не как средство определения места хранения данных. Если бы он использовался как средство для определения хранилища данных, то он теряет свое правильное значение (изменяет свою семантику) в других ситуациях, таких как пример параметра функции.

Допустим, у вас есть глобальные данные:

беззнаковый символ mydata [11] [10] =

{

{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09},

{0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,0x11,0x12,0x13},

{0x14,0x15,0x16,0x17,0x18,0x19,0x1A, 0x1B, 0x1C, 0x1D},

{0x1E, 0x1F, 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27},

{0x28,0x29,0x2A, 0x2B, 0x2C, 0x2D, ​​0x2E, 0x2F, 0x30,0x31},

{0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A, 0x3B},

{0x3C, 0x3D, 0x3E, 0x3F, 0x40,0x41,0x42,0x43,0x44,0x45},

{0x46,0x47,0x48,0x49,0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F},

{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59},

{0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60,0x61,0x62,0x63},

{0x64,0x65,0x66,0x67,0x68,0x69,0x6A, 0x6B, 0x6C, 0x6D}

};

и более поздних версий в коде вы получаете доступ к этим данным в функции и сохраняете один байт в переменной, например:

Теперь вы хотите сохранить данные в памяти программ.Используйте макрос PROGMEM из и поместите его после объявления переменной, но перед инициализатором, например:

.

.

.

беззнаковый символ mydata [11] [10] PROGMEM =

{

{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09},

{0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,0x11,0x12,0x13},

{0x14,0x15,0x16,0x17,0x18,0x19,0x1A, 0x1B, 0x1C, 0x1D},

{0x1E, 0x1F, 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27},

{0x28,0x29,0x2A, 0x2B, 0x2C, 0x2D, ​​0x2E, 0x2F, 0x30,0x31},

{0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A, 0x3B},

{0x3C, 0x3D, 0x3E, 0x3F, 0x40,0x41,0x42,0x43,0x44,0x45},

{0x46,0x47,0x48,0x49,0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F},

{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59},

{0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60,0x61,0x62,0x63},

{0x64,0x65,0x66,0x67,0x68,0x69,0x6A, 0x6B, 0x6C, 0x6D}

};

Вот и все! Теперь ваши данные находятся в пространстве программы.Вы можете скомпилировать, связать и проверить файл карты, чтобы убедиться, что mydata помещен в правильный раздел.

Теперь, когда ваши данные находятся в программном пространстве, ваш код для доступа (чтения) данных больше не будет работать. Сгенерированный код будет извлекать данные, расположенные по адресу массива mydata , плюс смещения, проиндексированные переменными i и j . Однако окончательный адрес, который вычисляется, где получить данные, указывает на пространство данных! Не в программном пространстве, где на самом деле находятся данные.Вполне вероятно, что вы будете извлекать какой-то мусор. Проблема в том, что AVR GCC внутренне не знает, что данные находятся в программном пространстве.

Решение довольно простое. «Эмпирическое правило» для доступа к данным, хранящимся в пространстве программы, заключается в доступе к данным, как обычно (как если бы переменная хранится в пространстве данных), например:

тогда возьмите адрес данных:

, затем используйте соответствующий макрос pgm_read_ * , и адрес ваших данных станет параметром этого макроса:

Макрос pgm_read_ * принимает адрес, указывающий на область программы, и извлекает данные, которые хранятся по этому адресу.Вот почему вы берете адрес смещения в массив. Этот адрес становится параметром макроса, чтобы он мог сгенерировать правильный код для извлечения данных из области программы. Существуют различные макросы pgm_read_ * для чтения данных разного размера по заданному адресу.

Теперь, когда вы можете успешно сохранять и извлекать простые данные из пространства программы, вы хотите сохранять и извлекать строки из пространства программы. И, в частности, вы хотите хранить массив строк в программном пространстве.Итак, вы начинаете с вашего массива, например:

символов * таблица_строк [] =

{

"Строка 1",

"Строка 2",

"Строка 3",

"Строка 4",

"Строка 5"

};

, а затем вы добавляете свой макрос PROGMEM в конец объявления:

символов * таблица_строк [] PROGMEM =

{

"Строка 1",

"Строка 2",

"Строка 3",

"Строка 4",

"Строка 5"

};

Верно? НЕПРАВИЛЬНЫЙ!

К сожалению, с атрибутами GCC они влияют только на объявление, к которому они прикреплены.Итак, в этом случае мы успешно поместили переменную string_table , сам массив, в пространство программы. При этом сами строки НЕ помещаются в пространство программы. На данный момент строки все еще находятся в пространстве данных, что, вероятно, не то, что вам нужно.

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

char string_1 [] PROGMEM = "Строка 1";

char string_2 [] PROGMEM = "Строка 2";

char string_3 [] PROGMEM = "Строка 3";

char string_4 [] PROGMEM = "Строка 4";

char string_5 [] PROGMEM = "Строка 5";

Затем используйте новые символы в своей таблице, например:

PGM_P string_table [] PROGMEM =

{

строка_1,

строка_2,

строка_3,

строка_4,

строка_5

};

Теперь это дает эффект помещения string_table в Program Space, где string_table - это массив указателей на символы (строки), где каждый указатель является указателем на Program Space, где также хранится каждая строка.

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

Получить строки - другое дело. Вероятно, вы не захотите извлекать строку из пространства программы побайтно, используя макрос pgm_read_byte () . В заголовочном файле объявлены и другие функции, которые работают со строками, хранящимися в области программы.

Например, если вы хотите скопировать строку из пространства программы в буфер в ОЗУ (например, автоматическую переменную внутри функции, которая выделяется в стеке), вы можете сделать это:

void foo (недействительно)

{

символьный буфер [10];

для (символ без знака i = 0; i <5; i ++)

{

}

возврат;

}

Здесь массив string_table хранится в программном пространстве, поэтому мы обращаемся к нему обычно, как если бы он был сохранен в пространстве данных, затем берем адрес места, к которому мы хотим получить доступ, и используем адрес в качестве параметра для pgm_read_word .Мы используем макрос pgm_read_word для чтения указателя строки из массива string_table . Помните, что указатель имеет размер 16 бит или слово. Макрос pgm_read_word вернет 16-разрядное целое число без знака. Затем мы должны привести его к типу истинного указателя на программную память, PGM_P . Этот указатель представляет собой адрес в программном пространстве, указывающий на строку, которую мы хотим скопировать. Затем этот указатель используется в качестве параметра функции strcpy_P . Функция strcpy_P похожа на обычную функцию strcpy , за исключением того, что она копирует строку из пространства программы (второй параметр) в буфер в пространстве данных (первый параметр).

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

Макросы и функции, используемые для извлечения данных из области программы, должны генерировать некоторый дополнительный код, чтобы фактически загрузить данные из области программы. Это влечет за собой дополнительные накладные расходы с точки зрения пространства кода (дополнительные коды операций) и времени выполнения.Обычно накладные расходы как по пространству, так и по времени минимальны по сравнению с экономией места при размещении данных в пространстве программы. Но вы должны знать об этом, чтобы минимизировать количество вызовов в рамках одной функции, которая получает один и тот же фрагмент данных из Program Space. Всегда поучительно посмотреть на полученный дизассемблер из компилятора.

Какой язык вы рекомендуете для программирования микроконтроллеров AVR?

Что значит «но не могу найти много данных на этой конкретной плате»? На официальном сайте Arduino есть схемы, все-таки открытое оборудование и множество документации на https: // store.arduino.cc/lilypad-arduino-usb ваш просто клон. На этой плате используется устройство Atmel ATmega32u4. Полную таблицу данных, примечания по применению и инструменты разработки можно найти на веб-сайте Microchip http://www.microchip.com/wwwproducts/en/ATmega32U4 (Примечание: Microchip выкупила Atmel). Нет необходимости беспорядочно ковыряться в пространстве регистров, используя указатели, чтобы узнать, как все работает, просто RTFM. В Интернете есть буквально миллионы руководств и примеров, показывающих, как использовать каждую функцию микроконтроллеров AVR с помощью Arduino IDE, Atmel Studio, WinAVR, avr-gcc и языка ассемблера.Официальные примечания к приложению и таблицы данных Atmel должны быть вашим первым портом захода, таким образом, вы говорите на общем языке и используете стандартную терминологию / соглашения об именах регистров с другими разработчиками AVR.

Программирование AVR

- пошаговое руководство

Введение

Это полное руководство по AVR, включая программирование AVR в очень простой и организованной форме. Мы рассмотрим следующие пункты.

  • Что такое AVR?
  • Использование Mac и Windows
  • Как работает программирование AVR
  • Выбор программиста, для записи кода.
  • Использование AVRDUDE

Предварительные требования

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

  1. Вы должны знать, как использовать командную строку для своей ОС: Terminal (Mac, Unix) или cmd / DOS (Windows).
    Вот учебник для Mac
    Вот один для Linux (Ubuntu)
    Вот один для Windows
  2. Вы должны уметь программировать, предпочтительно на C.
    Дело в том, что большинство микроконтроллеров программируются на C, это легкий язык программирования, который хорошо подходит для ограничительной среды.Вы также можете использовать многие из этих примеров на BASIC, но я сомневаюсь, что у меня будет время разместить эти версии.
    Вот учебник
    , который я изучил на C около 12 лет назад из книги, которая поставляется с компакт-диском и содержит много примеров, Думаю, это было «Выучить Си за 21 день» или какая-то ерунда. Неважно, как вы это делаете, но в этом руководстве предполагается, что вы знаете, что такое цикл for, как работает побитовая арифметика и т. Д.
    Вам также необходимо уметь преобразовывать шестнадцатеричные, двоичные и десятичные числа (с помощью калькулятора ). Микроконтроллеры
    сложнее программировать из-за ограниченных возможностей отладки.

Что такое микроконтроллер?

Лучший способ объяснить, что такое микроконтроллер, - это начать с вашего компьютера. Ваш настольный компьютер (или ноутбук) состоит из нескольких частей: центрального процессора (например, Pentium или Celeron), некоторого объема оперативной памяти, жесткого диска, клавиатуры и мыши и экрана монитора. Программы хранятся на жестком диске и выполняются на CPU, а временные данные хранятся в RAM. Вы можете запускать несколько программ одновременно, имея одну «главную программу», называемую операционной системой (например, Linux, Windows или Mac OS X), и эта главная программа отслеживает все за вас.

Программирование микросхем AVR

Микросхема AVR также имеет компоненты. У него есть ЦП, немного флэш-памяти, немного ОЗУ и немного EEPROM, все в одном маленьком чипе !. ЦП такой же, как и в компьютере, но он намного проще и не такой быстрый (чего вы ожидаете за 2,50 доллара?) Флэш-память похожа на флэш-память в вашем mp3-плеере или карте цифровой камеры, за исключением того, что она используется хранить программы. Это похоже на жесткий диск микроконтроллера, только с него можно только читать.Оперативная память похожа на оперативную память компьютера. EEPROM похожа на флеш-память, за исключением того, что вы не можете запускать из нее программу, но она используется как долговременное хранилище. EEPROM не стирается, когда чип теряет питание.
Итак, напомним: микросхема AVR запускает любую программу, хранящуюся во флеш-памяти, использует RAM для временного хранения и EEPROM для более длительного хранения.
Большинство компьютеров имеют 32-разрядный процессор с тактовой частотой 1 ГГц, 1 ГБ оперативной памяти и 100 ГБ памяти.

alexxlab

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *