Вы не вошли.
ну, пока вроде речь шла об одной кнопке. Если их несколько, можно читать весь порт где они висят и запоминать в однобайтную переменную. Тогда же легко реализуется выполнение какого-либо действия при одновременном нажатии нескольких кнопок. Но мне в данный момент одновременное нажатие нескольких не нужно.
......There is someone in my head, but it's not me.......
Вне форума
Так отож...
Глубокомысленное заявление...
Блин, вообще нет времени заниматься АВРами.. Засада какая-то настала...
......There is someone in my head, but it's not me.......
Вне форума
Глубокомысленное заявление...
Не нравится украинчкие присказки, пожадте немецкие:
"Аппетит приходит во время еды".
==============================
Это сегодня Вам достаточно одной кнопки, а завтра - захочется больше. Переделывать придется все по-новой....
=============================
(еще не проснулся, много стучать по клаве лень)
Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....
Вне форума
Здрасте всем! У меня такой вопрос: кто-нибудь делал что-то серъезное с макросами, используя параметры @0, @1 и т.д.?
Вне форума
Что серъезное можно сделать с макросами? Даже страшно стало
Использую такие макросы:
.macro clbr ;clear bit in register
cbr @0,exp2(@1)
.endm
.macro stbr ;set bit in register
sbr @0,exp2(@1)
.endm
.macro bbrc ;branch if bit in register clear
sbrs @0,@1
rjmp @2
.endm
.macro bbrs ;branch if bit in register set
sbrc @0,@1
rjmp @2
.endm
.macro bbic ;branch if bit in I/O clear
sbis @0,@1
rjmp @2
.endm
.macro bbis ;branch if bit in I/O set
sbic @0,@1
rjmp @2
.endm
.macro addi ;add immediate
subi @0,-@1
.endm
.macro ldx ;load XL, XH with word
ldi XL,byte1(@0)
ldi XH,byte2(@0)
.endm
.macro ldy ;load YL, YH with word
ldi YL,byte1(@0)
ldi YH,byte2(@0)
.endm
.macro ldz ;load ZL, ZH with word
ldi ZL,byte1(@0)
ldi ZH,byte2(@0)
.endm
.macro table ;load Z pointer
ldi ZL,low (@0*2)
ldi ZH,high(@0*2)
.endm
Вне форума
Тогда еще вопросы.
1. Как компилятор понимает символы @0, @1 и т.д. ? Как числа ?
2. Кроме как использования в выражениях (expression) их еще можно где-нибудь использовать?
3. Конструкции .if и #if по Help'у одно и тоже (при проверке параметров макросов), а на самом деле?
Вне форума
1. Как компилятор понимает символы @0, @1 и т.д. ? Как числа ?
Вместо @0 и т.д. тупо подставляется тот текст, что Вы написали через запятые в качестве параметров при вызове макроса.
2. Кроме как использования в выражениях (expression) их еще можно где-нибудь использовать?
Внутри макроса можно использовать везде: в instructions, directives, expressions.
3. Конструкции .if и #if по Help'у одно и тоже (при проверке параметров макросов), а на самом деле?
Конструкции .if и #if - не одно и то же. Конструкции типа .if и подобные являются директивами ассемблера, а конструкции типа #if - директивами препроцессора. Директивы препроцессора имеют стиль языка Си. Они работают только с символами препроцессора, определенными с помощью #define. Символы, которые не определены таким образом, приравниваются к нулю. Директивы ассемблера работают с символами, определенными с помощью .equ. Вот примеры использования:
альтернатива 1:
----------------------------------
.equ Fclk = 16000 ;Fclk, kHz
.equ Tbas = 5 ;time base, mS
.equ T1Div = Fclk*Tbas
.equ MAXWORD = 0xFFFF
.if T1Div > MAXWORD
.error "out of range constant"
.endif
-----------------------------------
альтернатива 2:
-----------------------------------
#define Fclk 16000 //Fclk, kHz
#define Tbas 5 //time base, mS
#define T1Div Fclk*Tbas
#define MAXWORD 0xFFFF
#if T1Div > MAXWORD
#error "out of range constant"
#endif
-----------------------------------
Во втором примере комментарии тоже выполнены в стиле языка Си, чтобы не смешивать разные стили.
Вне форума
Помогите разобраться с AVR
измерение скорости вращения двигателя
взято из книги "программирование на С для avr и pic"
90S8535, 8MHz
прерывание с оптоперывателя, каждый оборот
........
PORTD = _BV(PD6);
TIMSK = _BV(TICIE1);
TCCR1B = _BV(CS11);
TCNT1 = 0;
......
INTERRUPT(SIG_INPUT_CAPTURE1)
{
unsigned int CurrentTime, T;
CurrentTime = (256 * ICR1H) + ICR1L;
if (CurrentTime > PreviousTime) T = CurrentTime - PreviousTime;
else T = 0xFFFF - CurrentTime + PreviousTime;
sprintf(buffer, "%06u rpm", (unsigned long)60E6 / (unsigned long)T );
SetLCDPosition(3, 4);
ShowStr(buffer);
PreviousTime = CurrentTime;
}
мне непонятна вот эта сторока
CurrentTime = (256 * ICR1H) + ICR1L
зачем умножать на 256 старший байт и прибавлять младший?
как я понял при прерывании в ICR1 попадает число из TCNT1.
это не то число что нам нужно для вычислений? надо еще с ним извращатся?
Отредактировано ASni (08.10.2006 22:00:48)
Вне форума
мне непонятна вот эта сторока CurrentTime = (256 * ICR1H) + ICR1L зачем умножать на 256 старший байт и прибавлять младший? как я понял при прерывании в ICR1 попадает число из TCNT1. это не то число что нам нужно для вычислений? надо еще с ним извращатся?
Именно это число нам и нужно. Просто регистр захвата 16-разрядный, читать его нужно побайтно. Нужно сначала считать младший байт, затем считать старший, умножить его на 256 (или сдвиуть 8 раз влево) и сложить с младшим. Так мы из двух отдельных байтов снова сделаем 16-разрядное число.
Вне форума
[ Сгенерировано за 0.077 сек, 7 запросов выполнено - Использовано памяти: 601.54 Кбайт (Пик: 651.91 Кбайт) ]