Только вот незадача, первая же простенькая практическая задача
для AVR контроллера поставила в тупик.
Суть программы:
- в памяти программ размещается таблица или массив;
- берем по очереди байт из массива и выкидываем в коммуникационный порт.
Массив находится в пристегиваемом файле и я не понимаю как указать
какому либо поинтеру на начало таблицы.
На ассемблере все получается достаточно гармонично:
Код
ldi zh,high(Transmit_Buff*2); Load Z-pointer
ldi zl,low(Transmit_Buff*2); to the beginning of Receive_Buff
Transmit_Loop:
USART_Transmit:
; Wait for empty transmit buffer
sbis UCSRA,UDRE
rjmp USART_Transmit
; Put data into buffer, sends the data
lpm Data_IN, Z+
out UDR, Data_IN
ldi TempReg,high(end_of_file*2); Check if we got high end_of_file
cp TempReg,zh ; Compare
breq got_high_end_of_file; If equal then check the Low part
rjmp go_further:
got_high_end_of_file:
ldi TempReg,low(end_of_file*2); Check if we got low end_of_file
cp TempReg,zl ; Compare
breq got_low_end_of_file; If equal then reload Z-pointer
rjmp go_further:
got_low_end_of_file:
ldi zh,high(Transmit_Buff*2); Load Z-pointer
ldi zl,low(Transmit_Buff*2); to the beginning of Receive_Buff
go_further:
rjmp Transmit_Loop
Transmit_Buff:
.include "AIS_LOG.txt"
end_of_file:
nop
ldi zl,low(Transmit_Buff*2); to the beginning of Receive_Buff
Transmit_Loop:
USART_Transmit:
; Wait for empty transmit buffer
sbis UCSRA,UDRE
rjmp USART_Transmit
; Put data into buffer, sends the data
lpm Data_IN, Z+
out UDR, Data_IN
ldi TempReg,high(end_of_file*2); Check if we got high end_of_file
cp TempReg,zh ; Compare
breq got_high_end_of_file; If equal then check the Low part
rjmp go_further:
got_high_end_of_file:
ldi TempReg,low(end_of_file*2); Check if we got low end_of_file
cp TempReg,zl ; Compare
breq got_low_end_of_file; If equal then reload Z-pointer
rjmp go_further:
got_low_end_of_file:
ldi zh,high(Transmit_Buff*2); Load Z-pointer
ldi zl,low(Transmit_Buff*2); to the beginning of Receive_Buff
go_further:
rjmp Transmit_Loop
Transmit_Buff:
.include "AIS_LOG.txt"
end_of_file:
nop
Реализация подбной программы на Си AVR для меня загадка.
Тем более что я нашел подходящую конструкцию на VisualDSP,
Код
complex_fract16 in[VEC_SIZE] =
{
#include "in.dat"
};
{
#include "in.dat"
};
но в CVAVR такое не проходит!!!