Начал обучение программирования микроконтроллеров AVR с раздела:
РадиоКот > Обучалка > Микроконтроллеры и ПЛИС > Микроконтроллеры AVR - пишем, компилируем, прошиваем...
Для тестов взял Attiny2313
Вроде получалось, вроде что-то даже работало
По теме "Динамическая индикация" нужно было собрать простую схемку с 7-и сегментными индикаторами. Схемку я паять не стал, так как нет у меня лишних индикаторов... а взял уже готовую, собранную по схеме "Цифровой термометр" (который у меня исправно работал). Только у меня вместо 3-х цифрового индикатора подключен 4-х цифровой. Вывод 1-цифры подключен к 7-й ноге Тиньки (как и должно быть). Все "Общие" выводы припаяны правильно: 1-я цифра к 7-й ноге тиньки, 2-я к 6-й, 3-я к 3-й, 4-я к 2-й.
Как оказалось, выводы сегментов не совпадают. Перепаивать я не стал (зачем портить готовое и работающее) а просто внес изменения в символьную таблицу в коде.
Было так:
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111 ;2,3
.db 0b01100110,0b01101101 ;4,5
.db 0b01111101,0b00000111 ;6,7
.db 0b01111111,0b01101111 ;8,9
а стало так:
.db 0b01111110,0b00110000 ;0,1
.db 0b01101101,0b01111001 ;2,3
.db 0b00110011,0b01011011 ;4,5
db 0b01011111,0b01110000 ;6,7
.db 0b01111111,0b01110111 ;8,9
После проверки в Протеусе оказалось что отображение получатся в негативе, то есть если нужно вывести "1" то сегменты, отвечающие за единицу не светятся, зато светятся все остальные, которые не должны светиться. То же наблюдается для всех остальных цифр. Хотя, как я понял, "1" (единица из таблицы) отвечает за зажигание сегмента, а "0" (ноль из той же таблицы) говорит что сегмент погашен...
Еще один момент: по заданию "Динамической индикации" нужно вывести на отображение число 1234, но вместо этого отображается 2341 (в виде инверсии)
Получатся в исходном коде 2 ошибки (или я что-то не понял или не так составил исходник):
1) инверсия цифр
2) Цифры смещены в лево на 1 символ. Вместо "1234" отображает "2341"
вот исходник:
Спойлер
.include "g:\AVR-projects\tutorial\2313def.inc".def Temp1=R16
.def Temp2=R17
.def Temp3=R18
.def Temp4=R19
.def Temp=R20
.dseg
Digit: .byte 4
.cseg
.org 0
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM_CAPT1 ; Timer1 Capture Handler
rjmp TIM_COMP1 ; Timer1 Compare Handler
rjmp TIM_OVF1 ; Timer1 Overflow Handler
rjmp TIM_OVF0 ; Timer0 Overflow Handler
rjmp UART_RXC ; UART RX Complete Handler
rjmp UART_DRE ; UDR Empty Handler
rjmp UART_TXC ; UART TX Complete Handler
rjmp ANA_COMP ; Analog Comparator Handler
EXT_INT0 : ret
EXT_INT1 : ret
TIM_CAPT1 : ret
TIM_OVF0 : ret
TIM_OVF1 : ret
UART_RXC : ret
UART_DRE : ret
UART_TXC : ret
ANA_COMP : ret
TIM_COMP1 : ret
reset: ldi Temp1,RamEnd ;инициализация стека
out SPL,Temp1
cli
ldi Temp,0b11111111 ;настройка портов
out ddrb,Temp
ldi Temp,0b00001111
out ddrd,Temp
ldi Temp,4
sts Digit ,Temp ;загрузка начальных сначений
ldi Temp,3
sts Digit+1,Temp
ldi Temp,2
sts Digit+2,Temp
ldi Temp,1
sts Digit+3,Temp
;*********************************************************
;MAIN
;*********************************************************
IndicCycle: rcall Display ;цикл индикации
rjmp IndicCycle
;*********************************************************
Display:
;последовательный вывод на индикацию содержимого
;переменной Digit
lds Temp1,Digit ;загружаем 0-ю ячейку
ldi Temp,0b00001110 ;активируем 0-й разряд
;индикации
out PortD,Temp
rcall Decoder ;вызываем 7-сегм. декодер
out PortB,Temp1 ;выводим значение в порт
rcall Delay1 ;ждем
lds Temp1,Digit+1 ;и .т.д
ldi Temp,0b00001101
out PortD,Temp
rcall Decoder
out PortB,Temp1
rcall Delay1
lds Temp1,Digit+2
ldi Temp,0b00001011
out PortD,Temp
rcall Decoder
out PortB,Temp1
rcall Delay1
lds Temp1,Digit+3
ldi Temp,0b00000111
out PortD,Temp
rcall Decoder
out PortB,Temp1
rcall Delay1
ret
;*********************************************************
Decoder:
;преобразование двоичного числа
;в код 7-сегментного индикатора
ldi ZL,Low(DcMatrix*2) ;инициализация массива
ldi ZH,High(DcMatrix*2)
ldi Temp2,0 ;прибавление переменной
add ZL,Temp1 ;к 0-му адресу массива
adc ZH,Temp2
lpm ;загрузка значения
mov Temp1,r0
ret
DcMatrix:
;массив - таблица истинности декодера
; hgfedcba hgfedcba
.db 0b01111110,0b00110000 ;0,1
.db 0b01101101,0b01111001 ;2,3
.db 0b00110011,0b01011011 ;4,5
.db 0b01011111,0b01110000 ;6,7
.db 0b01111111,0b01110111 ;8,9
;*********************************************************
Delay1:
;цикл задержки
push Temp1
push Temp2
ldi Temp1,0
ldi Temp2,50
d11: dec Temp1
brne d11
dec Temp2
brne d11
pop Temp2
pop Temp1
ret
Хочется во всем этом разобраться и идти дальше...


