Обсуждаем контроллеры компании Atmel.
Ответить

Последовательно записать 48 байт в SRAM, также прочитать AVR

Вс ноя 11, 2012 21:09:03

Всем доброе время)

Подскажите код записи 48 байт в SRAM и также прочитать эти 48 Байт из SRAM
(AVR - Ассемблер)

Правильно делаю ?

Код:
      ldi ZH,1
      ldi ZL,0

Read:
      ld temp, Z+
      cpi ZL,48
      brne net
      ldi ZH,1
      ldi ZL,0
net:
      rjmp Read

Write:
      st Z+, temp
      cpi ZL,48
      brne net_n
      ldi ZH,1
      ldi ZL,0
net_n:
      rjmp Write


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

Как сделать ?

Спасибо заранее!

Re: Последовательно записать 48 байт в SRAM, также прочитать

Вс ноя 11, 2012 21:26:43

ldi ZH,1
ldi ZL,0
Эти команды зацикливают процедуры записи и чтения, для чего они?

Попробуй использовать для записи и чтения разные индексные регистры Z и Y
Код:
      ldi ZH,1
      ldi ZL,0
      ldi YH,1
      ldi YL,0

Read:
      ld temp, Y+
      cpi YL,48
      brne net
      ...
net:
      rjmp Read
      ldi YH,1
      ldi YL,0

Write:
      st Z+, temp
      cpi ZL,48
      brne net_n
      ...
net_n:
      rjmp Write
      ldi ZH,1
      ldi ZL,0

Re: Последовательно записать 48 байт в SRAM, также прочитать

Вс ноя 11, 2012 21:51:42

Дело в том, что сейчас программирую бегущею строку 8Х48. И возникла проблема: как синхронизировать запись и чтение SRAM (В SRAM я решил отправлять байты переданные по UART).

Текст на матрице мелькает (частота МК - 8 мГц использую внутреннею RC цыпочку), получает данные выводимые на матрицу вовсе не разборчивы((((

Как я понял не хватает частоты МК.

Что делать ?

Re: Последовательно записать 48 байт в SRAM, также прочитать

Вс ноя 11, 2012 21:59:34

zero648 писал(а):Попробуй использовать для записи и чтения разные индексные регистры Z и Y


Хм, читая Байты по тем же адресам прочитаются?
Если допустим для записи использовал Z а для чтения использую Y

Буду побывать...

Re: Последовательно записать 48 байт в SRAM, также прочитать

Вс ноя 11, 2012 22:03:11

не понимаю как вы связываете скорость "мелькания" информации на дисплее с процедурой чтения/записи данных в SRAM. как?
текст выводить на бегущую строку отдельной функцией, а писать в память другой функцией. Зачем их синхронизировать?

можно использовать и одну из пар регистров (X,Y,Z) просто предварительно подгружая в нее 2 байта указателя чтения или записи, в зависимости от того, что вы делаете.
Для этого заводятся отдельные переменные указателей записи/чтения.

Re: Последовательно записать 48 байт в SRAM, также прочитать

Вс ноя 11, 2012 22:06:58

не понимаю как вы связываете скорость "мелькания" информации на дисплее с процедурой чтения/записи данных в SRAM. как?
текст выводить на бегущую строку отдельной функцией, а писать в память другой функцией. Зачем их синхронизировать?


ХА! Если передаю данные без прерывно ? то на чтение вообще времени не будет у МК !

А вить еще кучу всего нужно сделать, например: Прочитать по Байтно SRAM затем отправить на 74HC595.

Re: Последовательно записать 48 байт в SRAM, также прочитать

Вс ноя 11, 2012 22:51:11

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

вот примерный алгоритм:
1) запускаем таймер для вывода информации на регистры сдвига (595)
(на какой именно интервал - надо рассчитать на основе примененной схемы соединения регистров) и по его прерыванию читаем данные и выдаем их в регистры. после этого опять ждем прерывания.
2) включаем приемник UART и по прерыванию по окончанию приема записываем данные в память. после этого опять ждем приема.
3) в главном цикле тупим и ничего не делаем)))
уточнение будет, когда напишете детали

Re: Последовательно записать 48 байт в SRAM, также прочитать

Пн ноя 12, 2012 08:22:59

У меня план другой:
1) Принимаю данные по UART и в прерывании по окончанию приема данных записываю в массив.

2) В свободное время читаю последовательно массив и отправляю на 595.

3) Отправляю сообщение компу о том что закончил читать данные с массив. И Заного записываю массив в SRAM тоесть быть возвращаюсь на "1" пункт.

Re: Последовательно записать 48 байт в SRAM, также прочитать

Пн ноя 12, 2012 08:29:11

Сейчас пробую все варианты вывода на 595.

Первый вариант был: как принял данные сразу выводил на 595.

Теперь я пробую сначало записать данные в массив потом читать и выводить на 595 вне прерывания по UART

Re: Последовательно записать 48 байт в SRAM, также прочитать

Пн ноя 12, 2012 15:18:59

Кефир писал(а):У меня план другой:
аааа! ну если план другой, то конечно да. где берете? дорого? :))

Re: Последовательно записать 48 байт в SRAM, также прочитать

Пн ноя 12, 2012 15:44:51

где берете? дорого? :))
"Извините" не понял юмора...

Re: Последовательно записать 48 байт в SRAM, также прочитать

Пн ноя 12, 2012 15:46:33

Это я оценил вашу реакцию на мои вопросы. Вы ни на один не ответили. Если вам нужна помощь другого человека, научитесь формулировать свои вопросы, а также ответы на поставленные вопросы.

Re: Последовательно записать 48 байт в SRAM, также прочитать

Пн ноя 12, 2012 16:04:38

ibiza11, Вы ни на один не ответили

Ответил на все...

Если вам нужна помощь другого человека, научитесь формулировать свои вопросы

Все детально разложил по полочкам...


Куда еще формулировать ?

1) Принять данные по UART, параллельность записывая в массив в SRAM
2) Прочитать данные из массива и отправить на 74HC595 (6 байт)

Re: Последовательно записать 48 байт в SRAM, также прочитать

Вт ноя 13, 2012 09:48:48

:shock: Повторять вопросы не буду. Сами посмотрите. Это такие предложения с вопросительным знаком в конце.

Re: Последовательно записать 48 байт в SRAM, также прочитать

Вт ноя 13, 2012 10:47:23

Спойлер
Код:
.equ BufferAddr            =    SRAM_START
.equ Buffersize            =    48

.equ MaxPointerAddrH    =    high(BufferAddr + BufferSize)
.
equ MaxPointerAddrL    =    low(BufferAddr + BufferSize)

.
equ ReadPointerAddrH    =     BufferAddr + BufferSize
.equ ReadPointerAddrL    =    ReadPointerAddrH + 1

.equ WritePointerAddrH    =    ReadPointerAddrL + 1
.equ WritePointerAddrL    =    WritePointerAddrH + 1

.equ DataAddr            =     WritePointerAddrL + 1
.equ BytesInBufferAddr    =     DataAddr + 1


.def tmp1    =    r16



reset
:
    cli
    ldi     temp
,Low(ramend)        ;инициализация стека
    out     spl
,temp
    ldi     temp
,high(ramend)
    out     sph,temp

    rcall     buffer_init        
;инициализация кольцевого буфера FIFO
    
;write byte
    ldi     tmp1
, 200        ;записываемые данные
    sts     DataAddr
, tmp1
    rcall     write_byte        
;запись в FIFO

    rcall     read_byte        
;чтение из FIFO
    lds     tmp1
,DataAddr    ;считываемые данные

    rjmp PC



buffer_init
:
    ldi     tmp1,low(BufferAddr)
    sts        ReadPointerAddrH,tmp1
    ldi     tmp1
,high(BufferAddr)
    sts     ReadPointerAddrL,tmp1

    ldi     tmp1
,low(BufferAddr)
    sts     WritePointerAddrH,tmp1
    ldi     tmp1
,high(BufferAddr)
    sts     WritePointerAddrL,tmp1
    ret


read_byte
:
    lds        tmp1,BytesInBufferAddr
    tst        tmp1
    breq    read_byte_error
    dec        tmp1
    sts        BytesInBufferAddr
,tmp1
    lds     ZL
,ReadPointerAddrL
    lds     ZH
,ReadPointerAddrH
    ld         tmp1
,Z+
    sts     DataAddr,tmp1
    ldi     tmp1
,MaxPointerAddrH
    cpi        ZL
,MaxPointerAddrL
    cpc     ZH
,tmp1
    brlo     read_byte_addr_less_than_max    
    ldi     ZL
,low(BufferAddr)
    ldi     ZH,high(BufferAddr)
read_byte_addr_less_than_max:
    sts     ReadPointerAddrL,ZL
    sts     ReadPointerAddrH
,ZH
    ret
read_byte_error
:
    set
    ret


write_byte
:
    lds     tmp1,BytesInBufferAddr
    cpi     tmp1
,Buffersize+1
    brlo     write_byte_ok
    set
    ret
write_byte_ok
:
    inc     tmp1
    sts     BytesInBufferAddr
,tmp1
    lds     ZL
,WritePointerAddrL
    lds     ZH
,WritePointerAddrH
    lds     tmp1
,DataAddr
    st         Z
+,tmp1
    ldi     tmp1
,MaxPointerAddrH
    cpi        ZL
,MaxPointerAddrL
    cpc     ZH
,tmp1
    brlo     write_byte_addr_less_than_max    
    ldi     ZL
,low(BufferAddr)
    ldi     ZH,high(BufferAddr)
write_byte_addr_less_than_max:
    sts     WritePointerAddrL,ZL
    sts     WritePointerAddrH
,ZH
    ret

Re: Последовательно записать 48 байт в SRAM, также прочитать

Вт ноя 13, 2012 21:56:00

Излишний сарказм уважаемый...

За код спасибо! вопросы еще будут по этой теме...

Re: Последовательно записать 48 байт в SRAM, также прочитать

Вс май 14, 2017 15:27:28

Уважаемые Коты помогите разобраться с регистрами sfr для AT89С2051, мне всего то нужно в СИ - записать один байт и прочитать его. Из PDF ничего толком не понял. Какими командами это можно сделать? Переменную k хочу хранить в энергонезависимой памяти. Вот мой кусочек программы:
//Keypad Connections:
sbit S0=P2^4; //T
sbit S1=P2^3; //T+F
sbit S2=P2^2; //F

unsigned char k = 1;
//======
Read_Keypad(void)
{
if(S0==0){delay_ms(50);while(S0==0);return k=0;}
if(S1==0){delay_ms(50);while(S1==0);return k=1;}
if(S2==0){delay_ms(50);while(S2==0);return k=2;}
return (k) ;
}

Всем спасибо за ответ!

Re: Последовательно записать 48 байт в SRAM, также прочитать

Пн май 15, 2017 11:30:55

Уважаемые Коты помогите разобраться с регистрами sfr для AT89С2051, мне всего то нужно в СИ - записать один байт и прочитать его. Из PDF ничего толком не понял. Какими командами это можно сделать? Переменную k хочу хранить в энергонезависимой памяти. Вот мой кусочек программы: ...
....
Всем спасибо за ответ!

МЛИН!!!
А ничего такого не заметно, что
AT89С2051
НЕ АВР, а MCS51

и соответственно компилятор СИ и среда разработки иная чем для АВРок требуется??
:evil: :kill: :kill: :kill:

Re: Последовательно записать 48 байт в SRAM, также прочитать

Пн май 15, 2017 11:37:03

...записать один байт и прочитать его...

Код:
data= 8; // запись в память.
data1= data;// чтение из памяти.
Ответить