Цитата(ILYAUL @ Jan 18 2011, 12:38)

Вы считывете в Tmp1- значение расположенное по адресу находящегося ZH и соответсвенно в Tmp2 в ZL т.е не понятно откуда
предполагается, что ранее в программе в Z что-то заносилось
Цитата(ILYAUL @ Jan 18 2011, 12:38)

Скопировать значение mov TMP1,TMP2
Скопировать адрес MOVW X,Z
спасибо, буду пробовать
Вообще, наверно, проще будет описать задачу:
есть буффер из 50 элементов и в него заносятся последовательно байты; есть две байтовых переменных, в которых должна хранится high и low часть адреса следующего элемента, который будет записан (по аналогии с индексом массива в С/С++). В обработчике прерывания я заношу в буффер байт, инкрементирую регистр Z и нужно этот новый адрес записать для того, чтобы в следующем прерывании уже записывать новый элемент
реализация на С для IAR простенького кольцевого буффера:
Код
#include <ioavr.h>
#define EVER;;
#define BUFF_SIZE 50
typedef unsigned char BYTE;
BYTE Buff[BUFF_SIZE];
BYTE index;
void main()
{
USART_Init(); //к примеру будем забирать из УСАРТа байты
for(EVER)
{
}
#pragma vector=USART0_RXC_vect
__interrupt void usart_rxc(void)
{
BYTE sym;
sym = UDR0;
Buff[index++] = sym;
index = index % BUFF_SIZE;
}
}
как написать подобное на АСМе?
пробовал написать следующее:
Код
...
.DSEG
USART_Index_H: .byte 1
USART_Index_L: .byte 1
USART_BUFF: .byte 50
...
;инициализации и все такое
...
USART0_RXC:
push ZH
push ZL
push r16
;грузим адрес нового элемента, полученный в предыдущем прерывании
lds ZH,USART_Index_H
lds ZL,USART_Index_L
lds r16,UDR0
st Z+,r16
;сохраняем новый адрес
lds USART_Index_H,ZH
lds USART_Index_L,ZL
reti
но, полагаю, это работать не будет...
Забыл дописать
Код
...
;инициализация
lds ZH,high(USART_BUFF)
lds ZL,low(USART_BUFF)
sts USART_Index_H,ZH
sts USART_Index_L,ZL
...
;и забыл в конце прерывания дописать
pop r16
pop ZL
pop ZH