Перейти к содержанию

Язык СИ для микроконтроллеров


Рекомендуемые сообщения

_http://www.kodges.ru/63890-mikrokontrollery-pic-24.-arxitektura-i.html

_http://www.kodges.ru/61234-primenenie-mikrokontrollerov-pic18.-arxitektura.html

_http://www.kodges.ru/2007/03/01/programmirovanie_na_jazyke_c_dlja_avr_i_.html

и часто внизу аннотации к книге перечислены книги близкой тематики

Ссылка на комментарий
Поделиться на другие сайты

Третья приведенная книга она везде, куда ни плюнь. Но там слишком уж вкратце , что-ж поробую сам как нибудь.

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

у меня был период, когда я с фанатизмом, достойным лучшего применения, покупал книги по программированию.

перестал.

почему я так сейчас говорю об этом? 99 процентов книг являются пересказом или переводом соответствующих хелпов, с той разницей, что в хелпе есть поиск, а в книге только пальцем листать.

из оставшихся хороших книг бОльшая часть пишется и особенно - переводится тогда, когда уже не нужно.

т.е. например автор пишет для крупной конторы игрушку, проходит пара лет, продажи падают, автор увольняется и пишет книгу "как самому написать звездные войны".

в этот момент дисплеи EGA уже не производятся, а фирмы делавшей Voodoo не существует ;)

и так примерно в любом направлении.

поэтому если реально хочется что-то изучить, бумажные книги и тем более их сканы - это последний вариант по значимости.

а читать два и более учебника программированию подряд - чистый маразм, без обид.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Форумчане, помогите мне истолковать код этои программы , то как я понял я в коментариях НАПИСАЛ В ВЕРХНЕМ , а оригинальные коментарии без изменений.

//***** обработчик прерываний ***********************//
void interrupt _isr(void)  // МОЖНО ЖЕ ПРОСТО INTERRUPT(VOID)  ?
{
static unsigned char ind_num=0;	// Номер индикатора // ЗАЧЕМ СТАТИК?
static char cnt_ms=10;			// Счётчик mS для опроса кнопок


if(TMR1IF)	// Проверяем флаг И ЕСЛИ ИСТИНА(1), ТО СЛЕДУЮЩАЯ СТРОЧКА
{
	TMR1IF=0;	// Сбрасываем флаг
	TMR1 = 65537-2500 + TMR1;	// Переустанавливаем таймер на 1 mS
// ПОЧЕМУ НЕ 63073+TMR1 (ДЛЯ НАГЛЯДНОСТИ)
	ind_num++;	// Следующий индикатор
//ЭТА ИНСТРУКЦИЯ ИСПОЛНИТСЯ, ЕСЛИ ПРЕДЫДУЩАЯ IF ЛОЖЬ.
	if(ind_num>3)	ind_num=0;	// Если зашкалило, выбираем первый 

	PORTD &=0b11110000;	// Гасим индикаторы (КАТОДЫ)
	NOP();NOP();NOP();NOP();NOP();	// Небольшая задержка
	PORTC=buf_ind[ind_num];			// Выводим в порт значение текущего индикатора из буфера
	PORTD |=(1<<ind_num);			// Зажигаем текущий индикатор 

//ЛОЖЬ, ДЛЯ ПРЕДЫДУЩЕГО IF
	if(!--cnt_ms){	// Отсчитываем 10 mS
		cnt_ms=10;
		keyboard();	// Вызываем процедуру опроса кнопок
	}// ПОХОЖЕ, ЧТО ЕСЛИ ПРЕДЫДУЩАЯ ЛОЖЬ, ТО ВЫХОДИМ ИЗ ПРЕРЫВАНИЯ
}
}

Изменено пользователем Andrey_Ch8

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

МОЖНО ЖЕ ПРОСТО INTERRUPT(VOID) ?
Нельзя. interrupt это квалификатор, указывающий на то, что данная процедура лежит в области обработчика прерываний. А само название процедуры (_isr) уже можно писать как угодно.
// Номер индикатора // ЗАЧЕМ СТАТИК?
Что бы при следующем вызове процедуры она сохранила своё значение. Точнее чтобы при выходе не теряла.
//ЭТА ИНСТРУКЦИЯ ИСПОЛНИТСЯ, ЕСЛИ ПРЕДЫДУЩАЯ IF ЛОЖЬ.
Нет. Будут выполняться все инструкции до закрывающейся скобки.

Пример

if(a==1){// Если а равно 1

 if(b>0){ // Если b больше 0

 } // конец блока b>0


}// конец блока a==1
else{   // а не равно 1


}// конец блока else

Ссылка на комментарий
Поделиться на другие сайты

TMR1 = 65537-2500 + TMR1; // Переустанавливаем таймер на 1 mS

// ПОЧЕМУ НЕ 63073+TMR1 (ДЛЯ НАГЛЯДНОСТИ)

потому, что значения

65536 = 0x10000

65537 = 0x10001

65535 = 0xFFFF

нужно на память среди ночи знать, они сами по себе образец наглядности :)

Ссылка на комментарий
Поделиться на другие сайты

Как составляется алгоритм программы при использовании языка Си, мне кажется есть отличия с ассемблером.

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Спасибо, где взять библиотеки готовых решений для HI-TECH, например как в MicroC Delay_us(30) -задержка на 30 мкс?

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Я так же нашел на саите www.microchipc.com, скачал архив и распоковал в папку Microchip/library , в проект добавил delay.h но компилятор на него ругается

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Спасибо, я воспользовался вашеи первои подсказкои, теперь компилятор ругается на все ( практически все что у меня написано в программе))), даже на главную функцию void main (void)???

#include <pic.h>
#include <htc.h>/* Памятка
	_delay(1000);		// delay for 1000 instruction cycles
	CLRWDT();
	__delay_us(400);	// delay for 400 microseconds
	CLRWDT();
	__delay_ms(2);		// delay for 2 milliseconds
*/
__CONFIG ( RC & WDTDIS & PWRTEN & BOREN & LVPDIS & DUNPROT &
WRTEN & DEBUGDIS & UNPROTECT );
unsigned char schet=0;     // Глобальная переменная
bit flag = 0               // Глобальный флаг
void main (void)
{
ADCON1  = 0x03;            // Порт А цифровои, 00000111
TRISA   = 0xFF;            // на вход (кнопки)
TRISB   = 0   ;            // на выход (датчик темп)
TRISC   = 0   ;            // На выход, подключен индикатор
TRISD   = 0   ;            // На выход  катод индикатора и зумер
OPTION_REG = b01000110 ;   // Подтяжка вкл(сидит датчик), 1:128 от TMR0
INTCON = 0;                // Выключить все прерывания//(10100000)включить от TMR0 
CMCON = 0b00000111;        // Comparator off
}
void init_DS1821(void)      // Инициализация DS1821
{                           /* Послать импульс сброса(<480мкс)
                              переключиться на вход и ждать импульс присутствия
                              измерить PRESENCE, если его нет,то
                              повторить сначала
                              Если есть, продолжить инициализацию
                            */
}                              
void interrupt timers (void) // прерывания от TMR0, каждые 32 мкс
{
if(flag=1)                   // Если установлен флаг, то 
{schet = schet--, flag = 0};// Декрементирую и сбрасываю флаг.
TMR0IF=0;                    // Сбрасываю флаг прерывания от TMR0
}

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Спасибо, я воспользовался вашеи первои подсказкои, теперь компилятор ругается на все
Ну извините, я не хотел :unknw: Я всего лишь хотел сказать где лежит пример :umnik2:

bit flag = 0

; забыли.

Ссылка на комментарий
Поделиться на другие сайты

Ура скомпилил, оказывается надо писать не OPTION_REG а просто OPTION, и ноль перед двоичным числом забыл и точку с запятои забыл и не там поставил( вторая строчка снизу с ошибкои)

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Как мне передать по 1 wire баит? Я придумал такои алгоритм- записываю в порт баит, как раз у меня датчик на младшем разряде, жду 100мкс, потом уставлю на RB0 1 и сразу 0 , сдвигаю следующий разряд и декрементирую счетчик битов. Это закольцовываю пока счетчик битов не обнулится.

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Ну вот что я написал

void out_ds1821(void)
 {char count_byte=7;       // счетчик битов
  char out_ds=0   ;        // то что буду отправлять в ds
out_ds=PORTB;TRISB=0;      // Загрузил, младший разряд пошел на передачу
  __delay_us(100);         // Жду пока закачается
do {RB0=1;RB0=0;PORTB<<1;  // Импульс восстановления, сдвигаю влево на один разряд
   __delay_us(100);}       // Задержка
while  (--count_byte) ;    // Зацикливается 7раз, потому-что один бит уже был отправлен

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Компиль постоянно ругается на вторую строчку сверху. Уже ума не приложу что делать.

Error [314] C:\Program Files\Microchip\Project_C\Signpic_C2\Signpic_C2.c; 52.18 ";" expected

и что означают цифры в данной ошибке, после того как я меняю код они постоянно меняются 52.18

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Ну вот что я написал

void out_ds1821(void)
 {char count_byte=7;       // счетчик битов
  char out_ds=0   ;        // то что буду отправлять в ds
out_ds=PORTB;TRISB=0;      // Загрузил, младший разряд пошел на передачу
  __delay_us(100);         // Жду пока закачается
do {RB0=1;RB0=0;PORTB<<1;  // Импульс восстановления, сдвигаю влево на один разряд
   __delay_us(100);}       // Задержка
while  (--count_byte) ;    // Зацикливается 7раз, потому-что один бит уже был отправлен

PORTB <<= 1;

или PORTB = PORTB << 1;

Компиль постоянно ругается на вторую строчку сверху. Уже ума не приложу что делать.

Error [314] C:\Program Files\Microchip\Project_C\Signpic_C2\Signpic_C2.c; 52.18 ";" expected

написано же: ожидается ; точка с запятой.

цифры думаю это номер строки и символа в ней.

обожаю угадывать проблему, не видя исходника.

Ссылка на комментарий
Поделиться на другие сайты

весь текст нет имеет смысла выкладывать, но компиль уверенно показывает на код( втораЯ строчка сверху)( точку с запятои уже поставил везде, где только можно)

989232.jpg[/img]

Изменено пользователем Andrey_Ch8

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

если по-вашему нет смысла в выкладывании исходника, то ковыряйтесь дальше сами.

если в вашем тексте компилятор четко ругается в самом начале, ругается одинаково, и визуально нет ошибок в этой строке - логично предположить, что проблема в предшествующих: в #include или где-то выше по тексту.

вы не меня пытаетесь переупрямить, а свой компилятор и компьютер, а это куда сложнее.

пока не исправите, будете топтаться на этом же месте.

Ссылка на комментарий
Поделиться на другие сайты

Я тут выкладывал, готовые функции на Си от самого производителя этих датчиков, там есть всё и чтение и запись, зачем изобретать велосипед заново если его уже изобрели до вас ?

Даже вот тебе ссылка: http://forum.cxem.net/index.php?app=core&module=attach&section=attach&attach_id=56666

Изменено пользователем a_sergeevich

Будьте проще и люди к вам потянутся.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Привет.  Хочу попробовать поработать с фоторезистом. Есть пару десятков ультрафиолетовых светодиодов, общей мощностью 4 вата. Хватит ли этой мощности для обработки платок размером 10 на 10 см или надо искать что-то дополнительно? 
    • Чтобы меньше было излучения, нужно мотать тороидальную. Возможно для повышения добротности по омическому сопротивлению лучше этот ТОР мотать в пару слоев. Если ее намотать на шило, то она вряд ли будет вообще работать как катушка.   Индуктивность прямо пропорциональна площади сечения, которая в свою очередь прямо пропорциональна квадрату диаметра. К тому же индуктивность в обратной пропорции с длиной намотки.
    • Я в ходе отладки выяснил, что сбоит в функции:  void w25qWritingByUSB(uint32_t dpagenum, uint8_t *bufByUSB) При чем поведение очень странное. Отладочные сообщения даже не выводятся в начале функции. В ходе экспериментов понял что связано это с объявлением массивов и решил объявить большие буферы которые на 4КБ и 0.25КБ: uint8_t current_sector_buf[4096]; uint8_t buf[256]; глобально. В оригинале, буферы объявлялись локально в функции. После изменения буквально двух строчек кода, все заработало. Также, в оригинальном проекте было сильно напутано из функциями. Я решил функции выкинуть из main.c и вставить в w25q.c Эти функции: void w25qEraseSector(uint16_t sector) void w25qWritingByUSB(uint32_t dpagenum, uint8_t *bufByUSB) Поиск данной проблемы реально отобрало кучу времени. На будущее буду знать что и такое бывает...
    • есть готовый  драйвер BTS7960 до 43А (долговременно до 10) с шим и все, что нужно и стоит недорого. И не надо изобретать  велосипед. Даже с учетом завышения параметров  уж 5А свободно.
    • А есть внятное описание этого M18? По моему он не очень "интегирируется" с микроконтроллером, да и нужно ли? По схеме выше - подключить его к U1C, выход U1C кинуть на +С12, U1D вообще выкинуть вместе с D1,D2 и R13.
    • Прежде чем сломя голову что-либо менять, следует задуматься о причинах выхода этого "чего-либо" из строя. В противном случае замененное отправится протоптанной тропой своих предшественников. Защитной лампой пользоваться умеете? Вот на нее и заменяйте для начала.
    • Это обрывные резисторы в роли предохранителей. Номинал на последнем фото похож на 470 Ом (желтый-фиолетовый-коричневый-золотой, если цвета правильно разглядел), но это многовато, вот 47 Ом - похоже на правду. Можно ставить в достаточно широком диапазоне, другое дело, что горят они не просто так. Скорее всего дальше где-то косяк. А мультиметром измеряли сопротивление? Что показывает?
  • Похожий контент

×
×
  • Создать...