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

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 08, 2018 17:40:49

Siarzhuk писал(а):Прочитать код с BSOD экрана и забить его в гугл - и, как правило, где-то когда-то кто-то уже терзал коллективный разум аналогичным вопросом.
разумеется. искал. и находил какую-то хрень вроде "вероятно, проблема с банком памяти". после этих слов мне сразу стало легче. точно как в анекдоте: больной перед смертью потел? - да - это хорошо...

Siarzhuk писал(а):Сервисмены будут в восторге от такого подхода.
ну, если мы говорим об устройстве вроде PLC, то, пожалуй, сервисмены могут быть как-то присовокуплены к теме. но если мы все-таки ограничимся устройствами типа "умный выключатель" или что-то подобное, т.е. без гиперразвитого интерфейса с пользователем, то сервисмены будут совершенно ни при чем. Например, если ваша кофе-машина вдруг перестала заваривать кофе, никакие сервисмены к вам не придут, не позвонят и не станут давать советы, кроме единственного: везите в сервисцентр, разберемся. и эта фраза будет произнесена в ответ на любой код ошибки, который, вероятно, ваша кофемашина вам на дисплее покажет.
так что для огромного разнообразия приборов (и тем паче - любительских поделок) ваш метод все же параноидальный.

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

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 08, 2018 17:59:11

а как из БСОДа ещё выбраться? а вот когда выбрался - уже можно и меры предпринимать...
и, да, этот код помогает: пару раз на сбойный драйвер указывал, часто проблему загрузки через него найти можно: 0x00007b - можно в биос сходить режим SATA поправить, может и скандиск тут помочь... покрайней мере уже знаешь куда копать...

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 08, 2018 18:21:22

Ivanoff-iv писал(а):и, да, этот код помогает
преклоняюсь перед вашим опытом. но сомневаюсь, что таких большинство среди пользователей.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт янв 09, 2018 01:14:56

так что для огромного разнообразия приборов (и тем паче - любительских поделок) ваш метод все же параноидальный.

Обрабатываться должны все case-ы. Это правильная привычка - и она слишком дорого оплачена. А любитель - тоже человек, и его время для него бесценно. Впрочем наше для нас также, ЕВПОЧЯ. ;-)

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

Ближе к делу, к чёрту философию - интересны ваши гипотезы как бойлер дошёл до такой жизни. Я же только ради этого сюда и запостил "гишторию" - чтобы мнение более искушённых мастеров услышать и разбавить архетипично-бесперспективную бойню little endians vs big endians.
А номер ошибки - за что вы так народ-то недооцениваете? :-D

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт янв 09, 2018 07:45:14

Siarzhuk писал(а):интересны ваши гипотезы как бойлер дошёл до такой жизни
если бойлер умный, то мог просто сойти с ума от тупости пользователя, например. ну или просто. ум - штука тонкая, до конца не изученная... хочешь, чтобы бойлер работал и не сходил с ума - не делай его умным.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 13:51:28

Приветь всем!
А есть какая-нибудь команда, как вставить в Си файл другой лист целиком на ассемблере? Чтобы не исправлять ассемблерный всякими кавычками... ?

Ой. Не. Спасибо, уже не надо.
Посмотрел здесь:
https://embedderslife.wordpress.com/201 ... asm-and-c/
Последний раз редактировалось СКАЗОЧНИК Пн янв 15, 2018 14:00:06, всего редактировалось 1 раз.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 13:59:47

В проект добавьте файл ассемблера. Расширение .s или .S. Во втором случае будут работать директивы препроцессора.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 14:15:51

А не попортит мне регистры во всяческих конфликтах с Си?

Он вроде понял его, даже подсветил всякие команды цветами разными. Однако ругается на точки с запятой, на комментарии и т.д... :facepalm:

Добавлено after 14 minutes 44 seconds:
Походу просто придется писать инициализацию дисплея на Си. ))))

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 14:17:51

В отдельном файле, надо будет оформлять ассемблерные вставки как функиции. Я сходу не вспомню, часть регистров используется для передачи данных и возврата результа. В R1 всегда ноль должен быть, вроде какие-то есть на свободное пользование. Это для компилятора GCC.
Как то делал проект, сейчас открою и погляжу как там функции написаны.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 14:20:12

Да, не надо. Все равно все лопатить. Просто я подумал, что ранее писал такую простую и мало-места-занимающую библиотеку под 1602, но на ассемблере. Пытаюсь постигать Си язык теперь. Хотел использовать старую библиотеку, а увы! Мало там возможных регистров для собственного использования.
Проще на Си все переписать.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 14:48:19

СКАЗОЧНИК писал(а):Да, не надо.
А я все равно напишу :).
СКАЗОЧНИК писал(а):Мало там возможных регистров для собственного использования.
Никуда они не делись, все Ваши.

Вот как у меня было, например. Созданы дополнительно два файла в проект (то есть их надо не только создать, но и включить в проект). Условно asm.h и asm.S. В заголовочном файле объявлен пототип функции void SetPicMono (color_t color);. Тип этот имеет размер один байт.

В файле asm.S
Код:
//Функцйия  void SetPicMono (color_t color);
.global SetPicMono
SetPicMono:

   
push
push
...
...
...
pop
pop

ret


Си встретив вызов этой функции, покладет передаваемый параметра в R24R25 (кажется) и выполнит инструкцию call на метку SetPicMono.

Добавлено after 6 minutes 41 second:
Собственно заголовочный файл тут совсем не обязателен, прототип функции можно было и прямо в основной исходник вставить.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 14:56:25

Как все сложно то... ((((
Вот надо мне инициализировать дисплей на Си и буковки на него выводить. А тут.. передаваемый параметр, да еще в паре регистров.
Пойду чаю попью (с пельменями).

Добавлено after 6 minutes 2 seconds:
А какая команда работы с битами в Си? Ну, типа sbi, cbi

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 14:58:53

Вот еще пример, обработчика прерывания.
Тут обработчик прерывания от таймера 1 использует переменную объявленную в где-то в Сишном коде.
Тип файла .S. Если бы был .s, то .extern вроде не сработает. Я очень давно этим проектом занимался.
Код:
.extern uint8_t SysTick;
...
...
...
.global TIMER1_COMPB_vect
TIMER1_COMPB_vect:

   PUSH R16
   in R16,_SFR_IO_ADDR(SREG)
   PUSH R16

   LDS R16,SysTick
   TST R16
   brne eex2

   sbi _SFR_IO_ADDR(PINB),PB1 //

eex2:
   POP R16
   out _SFR_IO_ADDR(SREG),R16
   POP R16
reti


З.Ы. Для обработчика прерывания, имя метки должно точно совпадать с именем вектора.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 15:00:24

СКАЗОЧНИК, а что, на Си проблематично дисплей инициализировать ? Зачем весь этот гемор с АСМ-вставками ? :dont_know:

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 15:02:47

Для обучения. ))) ну и жалко, когда-то написанное на асме не использовать везде. Тем более, там быстрый код, и занимает катастрофически мало места! )) Тем более, делал сам.
На Си мне пока что сложно в плане того, что я плохо его помню, за каждой командой приходится лезть и вспоминать.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 15:03:55

СКАЗОЧНИК писал(а):А тут.. передаваемый параметр, да еще в паре регистров.
Можно ж и не передавать если не нужно, тип void.
СКАЗОЧНИК писал(а):А какая команда работы с битами в Си? Ну, типа sbi, cbi
PORTx|=0x80; При включенной оптимизации, компилятор должен догадаться, что операция "или" не нужна и вставит sbi, на старший бит.

Добавлено after 58 seconds:
СКАЗОЧНИК, а что, на Си проблематично дисплей инициализировать ? Зачем весь этот гемор с АСМ-вставками ? :dont_know:

+.
Дисплею врядли нужОн ассм.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 15:07:00

Вот это я написал на СИ

Код:
#define RSport   PORTB   // Указать порт, к которому подключена линия управления RS
#define RSddr    DDRB   // Указать регистр направления порта, к которому подключена RS
#define RSpin    5      // Указать номер бита порта, к которому подключеа линия RS


А вот это надо переделать на СИ

Код:
sbi   RSddr, RSpin


:dont_know:

Добавлено after 1 minute 50 seconds:
LED_DDR = 1<<LED1;

Типа того?

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 15:07:23

Да, чтобы ассеблерная вставка знала типы ,и имена портов у меня вверху файла была такая директива #include <avr/io.h>

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 15:07:49

СКАЗОЧНИК писал(а):Для обучения. )))
Перешли на Си - забудьте об обучении АСМа. Обучайтесь лучше языку.

СКАЗОЧНИК писал(а):ну и жалко, когда-то написанное на асме не использовать везде.
Забейте. Напишете потом на Си.
Мало того, я скажу больше - Вы код не один раз ещё перепишете и ни капельки об этом не пожалеете.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пн янв 15, 2018 15:10:02

СКАЗОЧНИК писал(а):LED_DDR = 1<<LED1;

Типа того?


LED_DDR = (1<<LED1) | LED_DDR;
Или же
LED_DDR |= 1<<LED1;
Это разные записи идентичных операций. А то что Вы указали, сбросите остальные биты.
Ответить