Страница 3 из 3
Re: AVR + Pascal (?)
Добавлено: Вт июл 31, 2012 22:46:44
Goldsmith
BCluster писал(а):Можно выбрать хороший труд и перевести, думаю многим будет полезно
На крупные формы не замахиваюсь, а несколько небольших, но интересных статей перевел, так сказать, для внутреннего пользования. Если интересно, могу накидать ссылок.
Re: AVR + Pascal (?)
Добавлено: Ср авг 01, 2012 15:41:47
BCluster
Было бы неплохо )
Re: AVR + Pascal (?)
Добавлено: Ср авг 01, 2012 16:11:42
Goldsmith
Re: AVR + Pascal (?)
Добавлено: Ср авг 01, 2012 19:01:21
YS
Я специально линки там не привожу во избежания наездов по поводу пиратства. Тем более что наши соотечественники в последнее время тоже грешат копирастией
James W. Grenning, Test Driven Development for Embedded C и Mark VanderVoord, Embedded Testing with Unity and CMock
До такого я еще не дорос.
Спасибо, если совсем туго будет - напишу.
А у нас, старых инженегров, в сленге нормально проходило.
Видимо, это как где... Ни разу не слышал, хотя имел возможность лично общаться с Ъ-советским инженером, от которого, кстати, много почерпнул.

Re: AVR + Pascal (?)
Добавлено: Ср авг 01, 2012 19:49:19
vovksextra
YS писал(а):Есть.
Но для эмбеда Паскаль подходит плохо. Он слишком академичен (разрабатывался-то изначально для обучения), и потому многое из того, что на С делается естесственно, на нем необходимо делать с костылями.
Хотел-бы ради интереса увидеть то, что можно легко сделать на СИ и с костылями на PASCAL-е, например, хотел бы увидеть "естественный" код под mega8, который бы с трудом портировался под все то-же паскаль.
Вопрос выбора среды разработки очень философский )
Что касается микропаскаля, то он готов решать более 99% прикладных задач.
Re: AVR + Pascal (?)
Добавлено: Ср авг 01, 2012 20:11:49
YS
Хотел-бы ради интереса увидеть то, что можно легко сделать на СИ и с костылями на PASCAL-е
Я уже приводил пример.
Код: Выделить всё
((void (*)(uint8_t**,uint8_t))pgm_read_word(&(sys_func[i])))(arg_ptr,args_num);
Промотайте тему назад - пример реальный. Кусок кода моей самописной командной оболочки.
Сия строка по номеру выбирает из массива, находящегося во FLASH, два байта - указатель на функцию, после чего передает ей управление; функция принимает два параметра: первый - указатель на массив строк (null-terminated, соглашение Си), второй - количество этих строк. Притом сей код, несмотря на странноватый вид, совершенно портируем.
Мне интересно увидеть решение этой задачи на Паскале (желательно так же в одну строчку) без использования костылей.

Re: AVR + Pascal (?)
Добавлено: Ср авг 01, 2012 20:26:45
vovksextra
YS писал(а):Хотел-бы ради интереса увидеть то, что можно легко сделать на СИ и с костылями на PASCAL-е
Я уже приводил пример.
Код: Выделить всё
((void (*)(uint8_t**,uint8_t))pgm_read_word(&(sys_func[i])))(arg_ptr,args_num);
......
Код: Выделить всё
type
// описали типы;
read_word = function(arg_ptr: ^char;args_num: byte): word ;
p_read_word = ^read_word;
var
sys_func: array [10] of p_read_word;
и где-то в коде вызвали одну строчку
sys_func[0](nil,10);
Типа того ))
Re: AVR + Pascal (?)
Добавлено: Ср авг 01, 2012 20:36:27
BCluster
YS писал(а):
pgm_read_word
...
Притом сей код, несмотря на странноватый вид, совершенно портируем.
этот фрагмент не портируем

))
Re: AVR + Pascal (?)
Добавлено: Ср авг 01, 2012 21:37:28
YS
Типа того ))
Нет. pgm_read_word() - библиотечная функция, которая извлекает число из FLASH. Да-да, если бы указатели лежали в RAM, проблемы бы не было.
Или mikroPascal умеет сам подставлять нужный код при чтении из FLASH (как IAR)?
Т.е., мы читаем
число, быстренько преобразуем его к типу "указатель на функцию" с нужным форматом аргументов, и вызываем ее.
arg_ptr: ^char
arg_ptr - указатель на массив указателей на char, а не просто на char.
этот фрагмент не портируем
Ой ли? ОК, пускай у нас IAR, который умеет читать напрямую. Пишем строчку
и все - код работает как и раньше.
Re: AVR + Pascal (?)
Добавлено: Чт авг 02, 2012 06:57:26
BCluster
ok, уговорили

Re: AVR + Pascal (?)
Добавлено: Вс окт 06, 2013 06:59:46
shtela
Привет всем!
Помогите, пожалуйста - никак не могу считать значения минут из ds1307. Секунды считываются нормально, а минуты - выдаёт полный бред, который к тому же не меняется. Схему моделирую в Proteus. Процедура считывания ниже.
Спасибо.
Сергей
Procedure Clock_Read(Var sec_p,min_p,hour_p:byte);
Begin
TWI_Start();
TWI_Write(0xD0); // Address ds1307 --- запись
TWI_Write(0x00); // Установка записи/чтения регистра 00h
TWI_Start();
TWI_Write(0xD1); // Address ds1307 --- чтение
sec_p:=TWI_Read(0); // чтение регистра секунд 00h
sec_p:=((sec_p and %11110000) shr 4)*10 + (sec_p and %00001111); // преобразование считанного значения из регистра
min_p:=TWI_Read(1); // чтение регистра минут 01h
min_p:=((min_p and %11110000) shr 4)*10 + (min_p and %00001111); // преобразование считанного значения из регистра
TWI_Stop();
end;
Re: AVR + Pascal (?)
Добавлено: Вс окт 06, 2013 08:35:29
coredumped
Ошибка здесь: sec_p:=TWI_Read(0); // чтение регистра секунд 00h
Вы выполняете чтение из регистра и посылаете NO_ACK, после чего дальнейшее чтение невозможно, в таком случае нужно делать стоп-старт, итд.
Нужно вызывать TWI_Read() все время с параметром =1, и только последний раз с параметром=0. А у Вас все наоборот.
Вот так сделайте:
sec_p:=TWI_Read(1); // чтение регистра секунд 00h и посылка ACK
sec_p:=((sec_p and %11110000) shr 4)*10 + (sec_p and %00001111); // преобразование считанного значения из регистра
min_p:=TWI_Read(0); // чтение регистра минут 01h и посылка NOT ACK
Re: AVR + Pascal (?)
Добавлено: Вс окт 06, 2013 09:04:14
shtela
Спасибо, работает