Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Пт дек 01, 2017 11:58:44
Модератор
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Если для младших (12, 16), то - XC8. Если под 18-ые камушки, можно ещё присмотреться в сторону MCC18, тоже неплохой компилятор. Единственным, на мой взгляд, минусом у него является проблемы с объявлением массивов более 256 байт. Приходится скрипт линкера править.
Уважаемый dosikus, а можно поинтересоваться, откуда Вы узнали, что я "плаваю"? Из того, что пользуюсь CCS? Так я уже объяснил, в чем причина. Цена на лицензию XC8 является неприемлемой для тех, кто не зарабатывает деньги программами для PIC. А всякими "таблетками от жадности" для программ я не пользуюсь принципиально, у меня все программы купленные. Однажды мне не хватило бесплатной версии XC8 (по времени не укладывался в требования), переписывать на ассемблере особого желания не было, слишком много было уже написано. Поиск и дал вариант с CCS, которым я и стал пользоваться когда пишу на С. За неимением лучшего доступного варианта. О моем уровне знаний и опыта это никоим образом не говорит. Программированием и электроникой занимаюсь профессионально более 30 лет. Да, PIC занялся, для себя, а не для работы, три с небольшим года назад. Но, опять таки, уровень знаний Вы видеть просто не можете.
Вы говорите, что MikroC слишком ардуинообразен и далек от настоящего С? Да, могу согласиться, что от идеала он далек. CCS выбирают только из-за плюшек? Это почему же? Ими кто то заставляет пользоваться? Кодогенератор и оптимизатор там вполне приличные, а этого достаточно. Вы не заметили, что вопрос о С задал человек, который С еще и не знает практически? Насколько ему важно такое уж полное соответствие последним стандартам С? Да и Вы, в программа для PIC, а не для настольных ПК и серверов, так часто пользуетесь всеми возможностями С99, например? Базовый вариант языка все эти компиляторы поддерживают. Расширения языка и отступления от стандарта в документации на них описаны. Так ли уж важно, опишите Вы процедуру прерывания как void interrutp ISR() и в ней полностью обработаете прерывание определив его источник, или напишете #INT_TIMER0, например, а потом void ISR() и уже точно будете знать, что процедура получит управление только при прерывании от таймера (диспетчер прерываний скрыт внутри среды компилятора). Или чем так критично отличается TRISA=0x25, от set_tris_a(0x25)? Да, это обертка, но стандарта С это не нарушает ни разу. Я могу понять, что setup_adc у кого то вызывает отторжение тем, что ему больше нравится прописывать значения в регистры вручную, но новичку (автор вопроса новичек!) это облегчит жизнь. И опять таки, стандарта это не нарушает. Меня вот очень раздражает в CCS такое #bit TMR0IF=getenv("BIT:TMR0IF"), но я готов смириться, когда других вариантов нет. А вот серьезная засада в CCS то, что он не различает регистр букв, прямо как Pascal. Причем разработчик прямо заявляет, что включать case sensitive лучше не надо, так как он не гарантирует, что все библиотеки при этом будут работать нормально при компиляции.
Я за свою жизнь со столькими экзотическими языками и диалектами того же С работал, что поверьте, все эти отличия просто мелочи. Гораздо сложнее было на С писать в 90-е годы прошлого века для наших 1816ВЕ51 (MCS51 совместимые). Вот где был засада сидела на засаде. И мне не понятна такая вот позиция, что мол кроме XC нет ничего, а все не согласные дилетанты и плавают. Профессионалу, зарабатывающему программированием PIC, действительно нужен XC. И не только он. Но тратить, минимум 1000 USD только на компилятор, не каждый может себе позволить. И заявлять, что описывая возможные варианты я оказываю медвежью услугу, как минимум, неприлично. На мой взгляд, гораздо большие "гуру медвежьих услуг" те, кто заявляет, что без конкретного инструмента человек обречен на провал. Программы пишет человек, а не компилятор. Фотографирует фотограф, а не камера. Можно купить самый навороченный компилятор, да что там компилятор, IDE, и писать программы на уровне первоклассника. А можно чем то попроще и писать действительно профессиональные программы. А объявляя что то "единственно верным", мы просто встаем на путь очередной "священной войны", коих уже много было (windows vs linux, зеркальная vs беззеркальная, и тому подобное).
Повторю свою точку зрения, ну и groot почитав все это может что для себя решит.
- Все три упомянутые мной компилятора нормально поддерживают С, как язык программирования. Да, у каждого свои расширения, и свои ограничения и отступления от стандарта. Но пользоваться можно любым. На выбор может повлиять цена и используемая OS.
- Гораздо важнее знать и понимать сам С. Причем не обязательно С89 или С99, достаточно уровня классики Кернигана и Ричи, на первом этапе. Все равно, на PIC10, 12, 16 Вы не будете пользоваться всеми возможностями современных стандартов С. Но понимание языка нужно обязательно.
- По большому счету, для разработки программ на языках высокого уровнядля микроконтроллеров (и не только) не требуется знание ассемблера. Оно может быть полезным, но может и мешать. Так как в голове переходящего с ассемблера на С человека будут крутиться шаблоны мышления ассемблера.
- Язык программирования это лишь инструмент. Компилятор это лишь инструмент. Главное - человек, его знания и умения. Его способность подобрать, или придумать, алгоритм решения своей задачи.
Написал много, но не в плане наезда или повода для драки.
_________________ Мир вокруг нас разумен настолько, насколько разумны мы сами. Профессионал не обязательно говорит умные слова, но зная самые глубины, способен объяснить их любому "на пальцах".
Цена на лицензию XC8 является неприемлемой для тех, кто не зарабатывает деньги программами для PIC. А всякими "таблетками от жадности" для программ я не пользуюсь принципиально, у меня все программы купленные. Однажды мне не хватило бесплатной версии XC8 (по времени не укладывался в требования), переписывать на ассемблере особого желания не было, слишком много было уже написано. Поиск и дал вариант...
Microchip продает на Директе помесячную лицензию на любой из XC компиляторов. Такая стоит 30 баксов.То есть около 1800 рублей. К слову, полная лицензия на копилятор имеет ГОДОВОЙ срок действия и стоит около 1000 долларов на 3 компьютера, но одного пользователя. То есть даже при профессиональном использовании ее очень трудно "отбить". Такшта если Вы принципиальны в вопросе соблюдения авторских прав на ПО, то пишите в бесплатной версии до момента возникновения проблем, а затем покупаете месячную для завершения проекта. Вот и все.
Уважаемый dosikus, а можно поинтересоваться, откуда Вы узнали, что я "плаваю"?
Из вашей же писанины, ибо вы ни черта не знаете ни о компиляторах вами рекламируемыми ни о С вообще.
Добавлю еще вам "плюшек" : в микроС закрытые либы, фрэймворк одинаков и в микроЕ паскрале и в микроС и в микросЕ барсике. Догадываетесь что в ассемблерном листинге? Нет? Советую внимательней изучить... Либы "универсальные", ардуино_подобные, раздутые и недоступные для изучения нутра.
CCS - извечные проблемы с указателями в флэш , да и вообще с адресацией в флэш . Извечные проблемы с многофайловыми проектами. Производители усердно добавляют новые "плюшки", все более отдаляющие CCS от стандарта. К примеру -перезагрузка функций.
В итоге - вы советуете изучать новичкам "С для пЫк" , вместо вменяемого С. Гуру медвежьих услуг?
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Пт дек 08, 2017 20:29:42
Открыл глаза
Зарегистрирован: Вс май 28, 2017 19:07:32 Сообщений: 63
Рейтинг сообщения:0
Ребят, такая проблема:
Программу для PIC10F322 написал, которая запускает генератор и включает светодиод. МК должен запускаться/останавливаться при нажатых кнопках старт/стоп (останавливается так же, если нажаты или нет обе кнопки).
На деле МК работает не на нажатые клавиши, а при нажатии.
// Параметры сигнала #define SIGNAL 30 // Длительность сигнала в мкс #define DELMIN 100 // Максимальная задержка в мкс #define DELMAX 400000 // Максимальная задержка в мкс
// Обознаение выводов и кнопок #define BUTTON RA0 // Кнопка МК #define LED RA1 // Вывод на светодиоды #define GREEN 0 // Сигнал для зеленого светодиода #define RED 1 // Сигнал для красного светодиода #define GENERATOR RA2 // Выход генератора
// PIC10F322 Configuration Bit Settings
// 'C' source line config statements
// CONFIG #pragma config FOSC = INTOSC // Oscillator Selection bits (EC: CLKIN function enabled) #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = ON // Code Protection bit (Program memory code protection is enabled) #pragma config LVP = OFF // Low-Voltage Programming Enable (Low-voltage programming enabled) #pragma config LPBOR = ON // Brown-out Reset Selection bits (BOR enabled) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
// #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF.
void Prepare(); // Функция подготовки МК
int main() { Prepare(); // Запуск функции подготовки int K = 4; while(1) // Бесконечный цикл работы { if(BUTTON == 1) // Проверка на нажатые кнопки { LED = GREEN; // Зажигаем зеленый светодиод //srand(K); // Инициализация генератора случайных импульсов //K = DELMIN + rand ()% DELMAX; // Присвоение псевдослучайного числа //for(int i = 0; i <= K/60; i++) {} // Пустой цикл задержки __delay_us(SIGNAL-4); // Определяем задержку GENERATOR = 1; // Подаем на выход лог. единицу __delay_us(SIGNAL-2); // Определяем длительность сигнала GENERATOR = 0; // Подаем на выход лог. ноль } else { LED = RED; // Зажигаем красный светодиод GENERATOR = 0; // На выход ставил лог. ноль } } return 0; }
// Функция подготовки void Prepare() { TRISA = 0b1001; // Направление работы ножек порта А (вход) PORTA = 0b0000; // очищаем порт А OSCCON = (1<<4)|(1<<5)|(1<<6); // Установка IRCF = '111' для частоты в 16 MHz WPUA&=~((1<<0)|(1<<1)|(1<<2)|(1<<3)); // Отключение WEAK PULL-UP ANSELA = 0; // Отключение аналоговой части }
Вот disassembly listing:
Спойлер
Код:
17: // Подключение нужных библиотек 18: #include <stdio.h> 19: #include <stdlib.h> 20: #include <xc.h> 21: 22: // Параметры микроконтроллера 23: #define _XTAL_FREQ 16000000 // Тактовая частота 4 МГц 24: 25: // Параметры сигнала 26: #define SIGNAL 30 // Длительность сигнала в мкс 27: #define DELMIN 100 // Максимальная задержка в мкс 28: #define DELMAX 400000 // Максимальная задержка в мкс 29: 30: // Обознаение выводов и кнопок 31: #define BUTTON RA0 // Кнопка МК 32: #define LED RA1 // Вывод на светодиоды 33: #define GREEN 0 // Сигнал для зеленого светодиода 34: #define RED 1 // Сигнал для красного светодиода 35: #define GENERATOR RA2 // Выход генератора 36: 37: // PIC10F322 Configuration Bit Settings 38: 39: // 'C' source line config statements 40: 41: // CONFIG 42: #pragma config FOSC = INTOSC // Oscillator Selection bits (EC: CLKIN function enabled) 43: #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled) 44: #pragma config WDTE = OFF // Watchdog Timer Enable (WDT enabled) 45: #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) 46: #pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD) 47: #pragma config CP = ON // Code Protection bit (Program memory code protection is enabled) 48: #pragma config LVP = OFF // Low-Voltage Programming Enable (Low-voltage programming enabled) 49: #pragma config LPBOR = ON // Brown-out Reset Selection bits (BOR enabled) 50: #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) 51: #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) 52: 53: // #pragma config statements should precede project file includes. 54: // Use project enums instead of #define for ON and OFF. 55: 56: void Prepare(); // Функция подготовки МК 57: 58: int main() 59: { 60: Prepare(); // Запуск функции подготовки 01E8 21DD CALL 0x1DD 61: int K = 4; 01E9 3004 MOVLW 0x4 01EA 00C2 MOVWF K 01EB 3000 MOVLW 0x0 01EC 00C3 MOVWF 0x43 62: while(1) // Бесконечный цикл работы 63: { 64: if(BUTTON == 1) // Проверка на нажатые кнопки 01ED 29FA GOTO 0x1FA 01FA 1805 BTFSC PORTA, 0x0 01FB 29EE GOTO 0x1EE 65: { 66: LED = GREEN; // Зажигаем зеленый светодиод 01EE 1085 BCF PORTA, 0x1 67: //srand(K); // Инициализация генератора случайных импульсов 68: //K = DELMIN + rand ()% DELMAX; // Присвоение псевдослучайного числа 69: //for(int i = 0; i <= K/60; i++) {} // Пустой цикл задержки 70: __delay_us(SIGNAL-4); // Определяем задержку 01EF 3022 MOVLW 0x22 01F0 00C1 MOVWF 0x41 01F1 0BC1 DECFSZ 0x41, F 01F2 29F1 GOTO 0x1F1 01F3 0000 NOP 71: GENERATOR = 1; // Подаем на выход лог. единицу 01F4 1505 BSF PORTA, 0x2 72: __delay_us(SIGNAL-2); // Определяем длительность сигнала 01F5 3025 MOVLW 0x25 01F6 00C1 MOVWF 0x41 01F7 0BC1 DECFSZ 0x41, F 01F8 29F7 GOTO 0x1F7 73: GENERATOR = 0; // Подаем на выход лог. ноль 01F9 1105 BCF PORTA, 0x2 74: } 75: else 76: { 77: LED = RED; // Зажигаем красный светодиод 01FC 1485 BSF PORTA, 0x1 01FD 29F9 GOTO 0x1F9 78: GENERATOR = 0; // На выход ставил лог. ноль 79: } 80: } 81: return 0; 82: } 83: 84: // Функция подготовки 85: void Prepare() 86: { 87: TRISA = 0b1001; // Направление работы ножек порта А (вход) 01DD 3009 MOVLW 0x9 01DE 0086 MOVWF TRISA 88: PORTA = 0b0000; // очищаем порт А 01DF 0185 CLRF PORTA 89: OSCCON = (1<<4)|(1<<5)|(1<<6); // Установка IRCF = '111' для частоты в 16 MHz 01E0 3070 MOVLW 0x70 01E1 0090 MOVWF OSCCON 90: WPUA&=~((1<<0)|(1<<1)|(1<<2)|(1<<3)); // Отключение WEAK PULL-UP 01E2 30F0 MOVLW 0xF0 01E3 00C0 MOVWF __pcstackBANK0 01E4 0840 MOVF __pcstackBANK0, W 01E5 0589 ANDWF WPUA, F 91: ANSELA = 0; // Отключение аналоговой части 01E6 0188 CLRF ANSELA 92: } 01E7 0008 RETURN
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Долго объяснять. Но на висячем выводе без подтяжки, потенциал может считываться какой угодно. И далеко не обязательно лог.0. Потом с резисторами - проверьте какие входы у того микроконтроллера с триггером Шмита или нет. В своё время был помучавшись с PortB.0 у pic16f84 - перепад уровня читался, а прерывания не было. Оказалось, что прерывание было заведено через ТШ - а для него чуть-чуть уровня "логической единицы", которого для порта хватало - немножечко не дотягивало. Так что может еще резисторы придётся покрутить. А вообще, вам в другой теме сказали - используйте АЦП (если оно в микроконтроллере есть) для контроля нажатия кнопок.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
1. Я дребезг обрабатываю всегда. Делайте как вам удобно. Сам никогда и ни разу не пользовался такой функцией или макросом. Обычно этим занимаются таймеры. 2. Я обычно читаю даташит и там написано.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Доброго времени суток. Нигде не могу найти кряк на XC8. Но нашел на HI-TECH (причем Pro). Что лучше, XC8 без всякой оптимизации, или HI-TECH с максимальной. Нашел еще кряк на MCC18, о котором выше писал Аlex, но как-то стремно его использовать, мало кто им пользуеться. Также нашел на ССS, но почитав понял, что он как CodeVision для AVR (галочки-кнопочки). Учусь на 16 ПИКах, в будущем возможны 18 ПИКи. Может кто поделится таблеткой от XC8 ? (можно в личку).
Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Пт дек 15, 2017 19:48:13
Открыл глаза
Зарегистрирован: Вс май 28, 2017 19:07:32 Сообщений: 63
Рейтинг сообщения:0
Кто может объяснить, почему не работает код (моделирую в протосе)?
Смысл кода:
Осваиваю АЦП микроконтроллера PIC18F25K80, учусь так скажем. При включении МК АЦП должен начать работать и, если на входе больше 1 Вольта, то включить светодиод. В протосе ничего этого нет.
Код:
Спойлер
Код:
/* * File: newmain.c * Author: newbi * * Created on 15 декабря 2017 г., 15:44 */
// Подключаем библиотеки #include <stdio.h> // Стандартная библиотека Си для ввода-вывода #include <stdlib.h> // Стандартная библиотека Си для контроля #include <xc.h> // Библиотека компилятора XC8 для работы с PIC
// Определение параметров микроконтроллера #define _XTAL_FREQ 16000000 // Тактовая частота 16 МГц (см. OSCCON)
// Определение параметров для подключение периферии #define KEYBOARD RA0 // Определяем порт для подключения клавиатуры через АЦП // ВАЖНО: ПОРТ ДОЛЖЕН ПОДДЕРЖИВАТЬ АНАЛОГОВЫЕ СИГНАЛЫ (НАЗЫВАТЬСЯ AN)
Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Пт дек 15, 2017 20:37:16
Открыл глаза
Зарегистрирован: Вс май 28, 2017 19:07:32 Сообщений: 63
Рейтинг сообщения:0
Немножко переделал код:
Спойлер
Код:
/* * File: newmain.c * Author: newbi * * Created on 15 декабря 2017 г., 15:44 */
// Подключаем библиотеки #include <stdio.h> // Стандартная библиотека Си для ввода-вывода #include <stdlib.h> // Стандартная библиотека Си для контроля #include <xc.h> // Библиотека компилятора XC8 для работы с PIC
// Определение параметров микроконтроллера #define _XTAL_FREQ 16000000 // Тактовая частота 16 МГц (см. OSCCON)
// Определение параметров для подключение периферии #define KEYBOARD AN0 // Определяем порт для подключения клавиатуры через АЦП // ВАЖНО: ПОРТ ДОЛЖЕН ПОДДЕРЖИВАТЬ АНАЛОГОВЫЕ СИГНАЛЫ (НАЗЫВАТЬСЯ AN)
// Функция обработки прерывания /*void interrupt isr (void) { // ---------- Прерывание АЦП ---------- if (PIR1bits.ADIF && PIE1bits.ADIE) // Обработали прерывание от AD (АЦП) { LATAbits.LATA0 = 0; // Метка конца преобразования PIR1bits.ADIF = 0; // Сброс прерывания АЦП chislo = 5/(256*ADRESH); g_bStat = 1; } ADCON0bits.GO = 0 ; // Метка начала преобразования } */
Проблема, как я понял, в том, что условие chislo > 0 никогда не выполяется (если в этом условии поставить RC7 = 0, вместо 1, а внизу поставить RC7 = 1, то тогда светодиод горит).
Отредактировал!
Последний раз редактировалось SpeedFighter Сб дек 16, 2017 06:31:45, всего редактировалось 3 раз(а).
Откройте даташит в разделе АЦП и определите по нему состояние каждого регистра. Какое значение Tad выбрано у Вас? А кроме того, запуск АЦП удобно производить с помощью таймера. Например 5-го. Еще раз, читайте даташит.
Вы сами объявили его как unsigned char. Значит оно может принимать только целые значения от 0 до 255. Все промежуточные результаты тоже будут ограничены этим диапазоном.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения