Привет, коты =) Я почти добрался до прерывания, но есть очередной вопрос.
Сейчас у меня собран макет, в котром участвует:
ATmega32,
Тройной семисегментный индикатор с общим анодом,
Резисторы и провода, импровизированная кнопка.
Всё это должно выполнять следующие действия:
По одному семисегментному индикатору бегает огонёк по направлению a-b-c-d-e-f. Это работает, ничего сложного тут и нет.
При нажатии кнопки должно происходить переключение на следующий индикатор.
Вот текст программый, который есть на данный момент
Да, надо добавить вот что: PB0-PB5 по очереди дают 0, пропуская ноги индикатора к Земле.
PD6 питает общий анод первого индикатора. PD5 ждёт своей очереди для второго. PD2 - ножка прерывания.
Спойлер
/*
* Led_01.asm
*
* Created: 15.04.2013 18:19:53
* Author: test3
*/
.include "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRAssembler\2.1.51.64\avrassembler\include\m32def.inc"
.def Temp1=R16 ;присвоение названий регистрам общего назначения
.def Temp2=R17
.def Temp3=R18
.cseg ;начало пограммного сегмента
.org 0
ldi Temp1, high(RamEnd); Установка указателя стека в начало ОЗУ Set Stack Pointer to top of RAM
out SPH, Temp1;
ldi Temp1, low(RamEnd);
out SPL, Temp1;
ldi Temp1, 0b10000000 ;Глобальное разрешение прерываний
out SREG, Temp1
ldi Temp1, 0b01000000 ;Разрешение прерывания на ножке ИНТ0
out GICR, Temp1
ldi Temp1, 0b0000000
out MCUCR, Temp1 ;Прерывание при 0 на INT0
ldi Temp1, 0b11111111 ;Настройка порта B на выход
out DDRB, Temp1
ldi Temp1, 0b1100000 ;Настройка порта D 2 выхода и входы
out DDRD, Temp1
ldi Temp1, 0b1000000 ;Включаем первый дисплей
out PortD, Temp1
begin: ldi Temp1, 0b11111110 ;Включаем Сегмент А
rcall Delay
ldi Temp1, 0b11111101 ;Включаем Сегмент B
rcall Delay
ldi Temp1, 0b11111011 ;Включаем Сегмент C
rcall Delay
ldi Temp1, 0b11110111 ;Включаем Сегмент D
rcall Delay
ldi Temp1, 0b11101111 ;Включаем Сегмент E
rcall Delay
ldi Temp1, 0b11011111 ;Включаем Сегмент F
rcall Delay
rjmp begin ;В начало цикла
Delay: out PortB, Temp1 ; Задержка
ldi Temp1, 0
ldi Temp2, 150
Loop: inc Temp1
brne Loop
inc Temp2
brne Loop
ret
int_0: ldi Temp3, 0b1000000
out PortD, Temp3
Спросить я хотел следующее:
1). Что нужно вписать в ножку PD2 (INT0), которая настроена на вход и ждёт, когда на ней вместо лог 1 будет лог 0 (к нй через 6.9 кОм подведено +5в, при нажатии на кнопку эти 5 через эти 6.9 кОм подсоедиянтся к земле). Так вот, что в неё изначально записать, 1 или 0? Так, стоп. Пока писал, вспомнил, что если порт настроен на вход, то не важно, что ты в него запишешь. Я не удаляю эти мысли в слух, тк ваше подтверждение очень нужно
2). Как я понял из прочитанной статьи про бегущей огонёк, то при прерывании по INT0, программа обратится к адресу этого прерывания. По даташиту оно записнао как $002. По этому адресу надо поставить безусловный переход на обработчик этого прерывания. А как это правильно сделать? Я пробовал эксперементировать с командой org, но что-то ничего дельного не вышло.
Если я где-то написал какой-то бред, прошу не бить, а сказать, что именно бред - пойду читать
