Alhen 0 2 февраля, 2006 Опубликовано 2 февраля, 2006 · Жалоба Все решено перехожу на Си! Только вот незадача, первая же простенькая практическая задача для 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 Реализация подбной программы на Си AVR для меня загадка. Тем более что я нашел подходящую конструкцию на VisualDSP, complex_fract16 in[VEC_SIZE] = { #include "in.dat" }; но в CVAVR такое не проходит!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 2 февраля, 2006 Опубликовано 2 февраля, 2006 · Жалоба struct { volatile BYTE mode; volatile WORD timeout; volatile BYTE errc; volatile WORD tx_cnt; volatile WORD tx_len; BYTE*tx_buf; volatile WORD rx_cnt; volatile WORD rx_len; BYTE* rx_buf; } UCB; //RS485 direction #define DIR_BIT 2 #define DIR_TX PORTD |= (1<<DIR_BIT) #define DIR_RX PORTD &= ~(1<<DIR_BIT) //-------------------------------------------------------------------------- //UART modes #define TX_BUSY 0 #define RX_BUSY 1 #define RX_READY 2 //-------------------------------------------------------------------------- SIGNAL(SIG_USART_TRANS) { if(UCB.tx_cnt < UCB.tx_len) { UDR0 = UCB.tx_buf[UCB.tx_cnt++]; } else { UCB.tx_cnt = 0; CLR_TX_BUSY; _NOP(); _NOP(); _NOP(); DIR_RX; } } //-------------------------------------------------------------------------- BYTE TxStart(WORD len) { if(UCB.mode & TX_BUSY) return 1; DIR_TX; _NOP(); _NOP(); _NOP(); UCB.tx_cnt = 0; UCB.tx_len = len; SET_TX_BUSY; SIG_USART_TRANS(); return 0; } //-------------------------------------------------------------------------- Структура UCB содержит связанные с УАРТом переменные присутствует кое-что лишнее для RS485, можно выкинуть. Указатель UCB.tx_buf указывает на массив для отправки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 2 февраля, 2006 Опубликовано 2 февраля, 2006 · Жалоба Массив находится в пристегиваемом файле и я не понимаю как указать какому либо поинтеру на начало таблицы. __flash unsigned char TABL[10]={1,2,3,4,5,6,7,8,9,10};//определение таблицы во flash запись в указатель адреса начала таблицы: unsigned char __flash *PTR;//определение указателя на flash //......... PTR=TABL;//запись в указатель начального адреса таблицы Да, я работаю с ИАРом, возможно в CVAVR указатель на массив и сам массив во flash описывается немного подругому, но обращение к нему и к массиву делается также... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alhen 0 3 февраля, 2006 Опубликовано 3 февраля, 2006 · Жалоба __flash unsigned char TABL[10]={1,2,3,4,5,6,7,8,9,10};//определение таблицы во flash Не могу я набирать массив ручками, там пару тысяч байт, поэтому храню его в отдельном файле в текстовом формате и должен пристегнуть его. Например, #include "tabl.dat"; вот теперь как определить его в виде TABL[length_of_table] ? или определить начальный адрес размещения данных, а потом передать это значение указателю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 3 февраля, 2006 Опубликовано 3 февраля, 2006 · Жалоба __flash unsigned char TABL[10]={1,2,3,4,5,6,7,8,9,10};//определение таблицы во flash Не могу я набирать массив ручками, там пару тысяч байт, поэтому храню его в отдельном файле в текстовом формате и должен пристегнуть его. Например, #include "tabl.dat"; вот теперь как определить его в виде TABL[length_of_table] ? или определить начальный адрес размещения данных, а потом передать это значение указателю? Вам поможет программа bin2asc. На входе она получает бинарник, на выходе - выдаёт текстовый файл со списком байтов, который можно вставлять в исходники. BIN2ASC.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 3 февраля, 2006 Опубликовано 3 февраля, 2006 · Жалоба Не могу я набирать массив ручками, там пару тысяч байт, поэтому храню его в отдельном файле в текстовом формате и должен пристегнуть его. По подробнее плиз, что из себя файл с массивом представляет, и как вы его создаете? Кстати, я в таких случаях тоже не набираю ручками. Файл (с определением массива) генерю при помощи простенькой проги написанной на DELPHI (каждый раз пишу под задачу, делать универсальную лень), там (и не только там) это делается элементарно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BVU 0 3 февраля, 2006 Опубликовано 3 февраля, 2006 · Жалоба Таблицу всегда можно представить массивом, либо структурой. В 'C' всегда адрес массива он же адрес первого элемента массива может быть представлен указателем. int buff[100]; int *f; f = buff; или f = &buff[0]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nixon 4 3 февраля, 2006 Опубликовано 3 февраля, 2006 · Жалоба Я делал вот так: в файле "data.txt" : #define MACROS1 { 1, 2, 3, 4, ... остальные данные } в основном файле ... #include "data.txt" ... const VARIABLE1 char [SIZE] = MACROS1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 5 3 февраля, 2006 Опубликовано 3 февраля, 2006 · Жалоба А еще в IAR можно пристегнуть любой файл как бинарный массив, назначив его указателю с указанным именем. Это в опциях линкера, если не ошибаюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k0t 0 3 февраля, 2006 Опубликовано 3 февраля, 2006 · Жалоба Проще и удобнее всего подключение файла делать так: __hugeflash unsigned char file[]={#include "file.c"}; file.c сделать из бинарника с помощью bin2asc :) Размер массива определяется так (если он меняется, иначе можно константу забить): file_length=sizeof(file)/sizeof(unsigned char); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 3 февраля, 2006 Опубликовано 3 февраля, 2006 · Жалоба Проще и удобнее всего подключение файла делать так: __hugeflash unsigned char file[]={#include "file.c"}; В каком компиляторе такое проходит? Попробовал в ИАРе для AVR 4.11, ругается: Error[Pe010]: "#" not expected here ... Error[Pe029]: expected an expression ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 3 февраля, 2006 Опубликовано 3 февраля, 2006 · Жалоба Проще и удобнее всего подключение файла делать так: __hugeflash unsigned char file[]={#include "file.c"}; В каком компиляторе такое проходит? Попробовал в ИАРе для AVR 4.11, ругается: Error[Pe010]: "#" not expected here ... Error[Pe029]: expected an expression ... Команды препроцессора всегда пишутся в отдельной строке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alhen 0 4 февраля, 2006 Опубликовано 4 февраля, 2006 · Жалоба 2Nixon Попробывал я обыграть макрос и в CodeVision прошел следующий вариант: #include "my_table.txt" flash unsigned char my_array[] = in_table; Включаемый файл при этом выглядел так: #define in_table {\ 0x01, 0x02,\ 0x03, 0x04 \ .... };\ Что еще приятно, работает sizeof a = sizeof(my_array); 2kOt Вариант типа flash unsigned char my_array[]={#include "my_table.txt"}; в Code Vision не проходит?! Хотя все логично, тем более что в VDSP++ есть подобная конструкция 2 Old1 & vet По поводу конвертации бинарного файла я уже поднимал тему на форуме. И программа BIN2ASC.exe показалась сперва чрезвычайно полезной, тем не менее мне пришлось написать свою на Паскале, потому что я тогда работал на Ассемблере под AVR Studio и программа не принимала сгенерированный ascii файл, по следующим причинам: - она глючила на десятичные числа с нулями впереди, например 040 воспринимая их за операторы - не понимала шестнадцатеричный формат без 0x - префикса (естественно) - не признавала директиву db без точки впереди - и к тому же, AVR Studio ругается на нечетное количество операндов в строке (наверное из-за 16 разрядной структуры памяти программ) .db 183, 001, 137, 255, 255, 134, 254, 255, 133, 255, 255, 255, 243, 041, 255, а их то 11 то 15 штук в строке. Любой после этого кинется писать свой конвертор. 2AndyBig и всем Уже вижу что Си компиляторы все разные, может мне не стоит заморачиваться с Code Vision , а сразу работать в IAR и т.п., что посоветуете. Я то стартанул по известному курсу AVR123 http://electronix.ru/redirect.php?http://[banned]/. И могу сказать что Image Craft мне не нравится. Он не генерит ассемблер, а самое главное ИМХО у него ограниченный Си. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k0t 0 4 февраля, 2006 Опубликовано 4 февраля, 2006 · Жалоба Проще и удобнее всего подключение файла делать так: __hugeflash unsigned char file[]={#include "file.c"}; В каком компиляторе такое проходит? Попробовал в ИАРе для AVR 4.11, ругается: Error[Pe010]: "#" not expected here ... Error[Pe029]: expected an expression ... Так ругаться не будет: __hugeflash unsigned char file[]={ #include "file.c" }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 4 февраля, 2006 Опубликовано 4 февраля, 2006 · Жалоба Уже вижу что Си компиляторы все разные, может мне не стоит заморачиваться с Code Vision , а сразу работать в IAR и т.п., что посоветуете. Я то стартанул по известному курсу AVR123 http://electronix.ru/redirect.php?http://[banned]/. И могу сказать что Image Craft мне не нравится. Он не генерит ассемблер, а самое главное ИМХО у него ограниченный Си. К IAR, пожалуй, слово "заморачиваться" подходит куда как точнее, чем к CV :) Собственно, мне CodeVision нравится именно своей простотой и удобством. Плюс полезные библиотеки в составе дистрибутива. Насчёт ImageCraft соглашусь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться