Страница 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
Пока вот что попало под руку:

Развитие в направлении разработки встроенных систем.
Эффективная разработка встроенного ПО через тестирование.
Сопрограммы в языке программирования C.
Оптимизация: ваш злейший враг.
Рекомендации IEEE по разработке требований к программному обеспечению (части 1, 2, 3).

Ну и, если любите полистать классику, кое-что из моих прежних переводов Дейкстры:

Программирование как вид человеческой деятельности. (EWD117)
Конец Информатики?
О природе информатики.
Ответы на вопросы студентов отделения программного обеспечения (EWD1305).
Навстречу корректным программам (EWD241).
Смиренный программист (EWD340).
Почему американская информатика кажется неизлечимой (EWD1209).
Почему программное обеспечение такое дорогое? (EWD648).
Два взгляда на программирование (EWD540).
Научная фантастика и научная реальность в информатике (EWD952).

Остальное нужно поискать.

Re: AVR + Pascal (?)

Добавлено: Ср авг 01, 2012 19:01:21
YS
Я специально линки там не привожу во избежания наездов по поводу пиратства. Тем более что наши соотечественники в последнее время тоже грешат копирастией
:facepalm:
James W. Grenning, Test Driven Development for Embedded C и Mark VanderVoord, Embedded Testing with Unity and CMock
До такого я еще не дорос. :)

Спасибо, если совсем туго будет - напишу.
А у нас, старых инженегров, в сленге нормально проходило.
Видимо, это как где... Ни разу не слышал, хотя имел возможность лично общаться с Ъ-советским инженером, от которого, кстати, много почерпнул. :dont_know:

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, который умеет читать напрямую. Пишем строчку

Код: Выделить всё

#define pgm_read_word(ARG)    (*(ARG))
и все - код работает как и раньше.

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
Спасибо, работает