Страница 17 из 103
Re: Програмирование pic на СИ.
Добавлено: Сб авг 17, 2013 14:22:44
Bkmz
Подскажите, где я не прав? Нужно сделать тахометр. Вроде как и ничего сложного, но не могу получить четкого значения выдержки по времени через таймер.
PIC16F874A
Код: Выделить всё
#include "htc.h"
#include "pic.h"
__CONFIG (LP & WDTDIS & PWRTEN & LVPDIS & PROTECT);
#define _XTAL_FREQ 16000000
#define D0 RB0
#define bs(var, bitno) ((var) |= 1UL << (bitno))
#define bc(var, bitno) ((var) &= ~(1UL << (bitno)))
unsigned int n, count, freq, d1;
bit cnt_rd=0;
void interrupt encod (void){
if (INTF){
INTF=0;
count++;
}
if (T0IF) {
T0IF=0;
TMR0=100; //предустановка таймера для 10мс
n=count;
count=0;
cnt_rd=1;
}
}
void init (void){
OPTION=0b01000111;
PORTA=0;
PORTB=0;
PORTC=0;
PORTD=0;
PORTE=0;
TRISA=0b00101111;
TRISB=255;
TRISC=0;
TRISD=0;
TRISE=0b00000100;
ADCON1=6;
INTCON=0b10110000;
TMR0=7;
}
void main(void){
init ();
while (1){
if (cnt_rd) {
freq=83.34*n/10;
cnt_rd=0;
d1=freq;
}
}
}
Re: Програмирование pic на СИ.
Добавлено: Сб авг 17, 2013 16:12:31
Аlex
Во первых, не понятно, что означает фраза
не могу получить четкого значения выдержки по времени через таймер
Разъясните подробнее.
Во вторых. У Вас в выражении
freq=83.34*n/10; используются числа с точкой, а переменные имеют целый тип.
Re: Програмирование pic на СИ.
Добавлено: Сб авг 17, 2013 18:26:39
HHIMERA
Аlex писал(а):Во вторых. У Вас в выражении freq=83.34*n/10; используются числа с точкой, а переменные имеют целый тип.
А ты ничего не путаешь???
Неявное преобразование типов... и что???
А вот с превышением разрядной сетки... это да, лажа... при n = 65535 там будет явный бред...
По хорошему
freq должно быть
unsigned long...
Re: Програмирование pic на СИ.
Добавлено: Сб авг 17, 2013 20:36:51
drakon
Всем привет! посоветуйте пожалуйста простой компилятор Cи для pic (типа как CVAVR для AVR). завалялось несколько pic12f, надо их в дело пустить.
Re: Програмирование pic на СИ.
Добавлено: Сб авг 17, 2013 21:01:15
Аlex
HHIMERA писал(а):А ты ничего не путаешь???

Да нет, ничего.
Может в данном случае всё явно приведётся и посчитается нормально, но с таким подходом к программам, в другом случае, можно ненароком и "в лужу сесть"

Напишет когда-нибудь своё выражение таким образом :
freq=n/10*83.34; , подумав, что всё нормально, и пипец

Хотя в обоих случаях, при типе переменной
n =
float, результат будет одинаковым.
to
drakon. Что значит "простой" ?
Re: Програмирование pic на СИ.
Добавлено: Сб авг 17, 2013 21:23:38
drakon
не IAR.
Re: Програмирование pic на СИ.
Добавлено: Сб авг 17, 2013 23:28:16
HHIMERA
Аlex писал(а):Да нет, ничего.
Неужели???
Может в данном случае всё явно приведётся и посчитается нормально
Во первых... не "может", а приведётся, правила приведения знать надобно...
Напишет когда-нибудь своё выражение таким образом :
freq=n/10*83.34; , подумав, что всё нормально, и пипец

Хотя в обоих случаях, при типе переменной
n =
float, результат будет одинаковым.
Во вторых... одинаковым, но неправильным... превышение сетки...
В третьих...
n может использоваться ещё где-то... жирновато будет для float...
В четвёртых... приведение типа можно сделать прямо в строке...
И в пятых... в случае ХайТеч... будет разный размер кода...

Re: Програмирование pic на СИ.
Добавлено: Вс авг 18, 2013 11:45:00
Bkmz
Аlex писал(а):Во первых, не понятно, что означает фраза
не могу получить четкого значения выдержки по времени через таймер
Разъясните подробнее.
В строке "TMR0=100; //предустановка таймера для 10мс" ставлю брекпоинт, и протеус каждые раз разные значения показывает, т.е. в цикле ровно 10мс не получается, соответственно значение переменной count меняется на 1. Как получить стабильное значение в 10мс? Если убрать прерывание по входу, то все нормально. Или на данном контроллере невозможно так точно сделать?
Аlex писал(а):Во вторых. У Вас в выражении freq=83.34*n/10; используются числа с точкой, а переменные имеют целый тип.
Ну с этим гораздо проще, не заморачивайтесь. Вообще идеально было бы получить отсчет по таймеру в 1 секунду, и тогда freq=n/12, но там у меня вообще засада, погрешность слишком большая получается.
Re: Програмирование pic на СИ.
Добавлено: Вт авг 20, 2013 23:36:36
LuckyLex
Повторил код из учебника. использую 12ф629, среда CCS
некорректно работает код дребезга контактов, на нажатие нормально срабатывает, но после отжатия светодиод не перестаёт гореть, не пойму , что нет так. С подтяжкой всё, ок, думал может внутренние резисторы не вкл. Добавил на 12к, при нажатии кнопки падает напряжение до 1.8, после отжатия поднимается обратно до 4.9в
Подскажите пожалуйста)
Спойлер
void main()
{
unsigned char sGPIO; // shadow copy of GPIO
unsigned char db_cnt; // debounce counter
// Initialisation
setup_counters(RTCC_INTERNAL,RTCC_DIV_1); // enable weak pull-ups
output_a(0); // start with LED off
sGPIO = 0; // update shadow
// Main loop
while (TRUE) {
// wait until button pressed (GP3 low), debounce by counting:
for (db_cnt = 0; db_cnt <= 10; db_cnt++) {
delay_ms(10); // sample every 1 ms
if (input(PIN_A4) == 1) // if button up (GP3 high)
db_cnt = 0; // restart count
} // until button down for 10 successive reads
// toggle LED on GP1
sGPIO ^= 0b000100; // flip shadow GP1
output_a(sGPIO); // write to GPIO
// wait until button released (GP3 high), debounce by counting:
for (db_cnt = 0; db_cnt <= 10; db_cnt++) {
delay_ms(10); // sample every 1 ms
if (input(PIN_A4) == 0) // if button down (GP3 low)
db_cnt = 0; // restart count
} // until button up for 10 successive reads
} // repeat forever
}
Re: Програмирование pic на СИ.
Добавлено: Ср авг 21, 2013 16:44:52
Аlex
Добавил на 12к, при нажатии кнопки падает напряжение до 1.8, после отжатия поднимается обратно до 4.9в
Подскажите пожалуйста)
А программа тут причём ? И тем более язык Си

Re: Програмирование pic на СИ.
Добавлено: Ср авг 21, 2013 18:00:39
LuckyLex
Аlex писал(а):Добавил на 12к, при нажатии кнопки падает напряжение до 1.8, после отжатия поднимается обратно до 4.9в
Подскажите пожалуйста)
А программа тут причём ? И тем более язык Си

Всмысле? наоборот показываю, что хардварно всё нормально, если вдруг возникнут вопросы о железе
upd сейчас всё нормально заработало, хз что было не так, наврено где-то отходило что-то)
Re: Програмирование pic на СИ.
Добавлено: Ср авг 21, 2013 20:22:34
money21
Господа! Использовал два примера из набора mikroC.
Один из них - про индикацию на двух 7-сегментных дисплеях, второй - про преобразование десятичного числа в маску для индикатора.
Но у меня число в маску не превращается и так и уходит на порт. В чём ошибка?
Спасибо!
Спойлер
Код: Выделить всё
int v, por1, por2, j, x, num;
int mask(int num) {
switch (num) {
case 0 : return 0x3F;
case 1 : return 0x06;
case 2 : return 0x5B;
case 3 : return 0x4F;
case 4 : return 0x66;
case 5 : return 0x6D;
case 6 : return 0x7D;
case 7 : return 0x07;
case 8 : return 0x7F;
case 9 : return 0x6F;
} //case end
}//~
void interrupt() {
if (v==0) {
PORTB = por2; // send mask for digit 3 to portb
PORTA = 1; // turn on 1st 7 seg., turn off 2nd
v = 1;
} else {
PORTB = por1; // send mask for digit 8 to portb
PORTA = 2; // turn on 2nd 7 seg., turn off 1st
v = 0;
}
TMR0 = 0; // clear TMRO
INTCON = 0x20; // clear TMR0IF and set TMR0IE
x = 1;
}//~
void main() {
trisC = 0;
OPTION_REG = 0x80; // pull up resistors
PORTA = 0; // clear porta (make sure both displays are off)
TRISA = 0; // designate porta pins as output
PORTB = 0; // clear portb (make sure LEDs are off)
TRISB = 0; // designate portb pins as input
TMR0 = 0; // clear TMRO
j = mask(x);
por1 = j;
por2 = j;
portC = 2;
INTCON = 0xA0; // enable T0IE
//wait for interrupt
}//~!
Re: Програмирование pic на СИ.
Добавлено: Вс авг 25, 2013 06:05:23
inSERter
drakon писал(а):Всем привет! посоветуйте пожалуйста простой компилятор Cи для pic (типа как CVAVR для AVR). завалялось несколько pic12f, надо их в дело пустить.
Присоединяюсь к вопросу. Да этого ассемблил, теперь пора и Си знать. Требования к компилятору следующие (в порядке приоритета):
1. Работа с PIC 10/12/16/18
2. Максимальное соблюдение стандартов
3. Безглючность
4. Наличие библиотек работы с LCD, цифровыми датчиками и подобной периферией.
5. Возможность с минимальным головняком портировать код на другие платформы, AVR, например, который тоже планирую изучать (данное требование пока неприоритетно, так, на будущее).
Есть ли на данный момент что-либо, отвечающее моим хотелкам? Не хочется наступать на грабли в самом начале. Пока определился с тройкой лидеров: Hi-Tech, CCS PCWHD, ну и microC вроде. Родной микрочиповский, как я понял, не работает с младшими камнями 10/12/16.
Re: Програмирование pic на СИ.
Добавлено: Вс авг 25, 2013 07:18:17
dosikus
Пункт 4 противоречит остальным .
По остальным подходит XC8 , CCS только при условии не юзанья встроенных функций и фич .
Да и изучать надо просто Си а не Си для каких то конкретных МК .
Re: Програмирование pic на СИ.
Добавлено: Пт окт 04, 2013 23:10:46
Alex_EXE
Не знаю на сколько уместен такой вопрос - но всё же:
Не могли бы, пожалуйста, подсказать, направить - где бы можно раздобыть последнею или предпоследнею версию Hi-Tech компилятора, желательно PRO версию, для PIC микроконтроллеров 12/16 серии. А то последнее время что-то много они достаточно вкусных камушков навыпускали, а мой инструментарий для работы с ними устарел. Да и может оптимизацию улучшили и на старые камушки удастся больше впихнуть всяких плюшек. Сейчас использую 9.7 версию.
Re: Програмирование pic на СИ.
Добавлено: Пт окт 04, 2013 23:17:28
Аlex
MPLAB XC, тот-же хайтек. На сайте всегда найдёте самую последнюю версию. Лекарство существует, ищите в сети.
Re: Програмирование pic на СИ.
Добавлено: Сб окт 05, 2013 16:23:43
Alex_EXE
Спасибо за наводку, что-то не обратил внимания.
Re: Програмирование pic на СИ.
Добавлено: Вс окт 13, 2013 16:04:18
uldemir
Вопрос к съевшим собаку на MPLAB C 18.
Я тут избалован ИАРовским компилятором под MSP430 и у меня не получается такая конструкция:
Код: Выделить всё
ADCON0 = (1<<VCFG0) | (0b0000<<CHS0) | (1<<ADON);
Понятно, что эти названия битов надо применять как
Код: Выделить всё
ADCON0bits.VCFG0 = 1;
ADCON0bits.CHS = 0;
ADCON0bits.ADON = 1;
Но это три команды... как написать внятно это одной командой? Какие соглашения приняты в этом компиляторе?
И еще: допустим, биты порта определены как #define DISP_RW 1. Можно ли в выражении LATEbits.RE1 = 1 единицу в "RE1" заменить определением DISP_RW ?
Re: Програмирование pic на СИ.
Добавлено: Вс окт 13, 2013 16:39:42
Аlex
В МСС18 так не получится, т.к. слова VCFG0, CHS0 и ADON не задефайнены, а обращение к этим битам идёт через структуры.
Тут два варианта. Либо пользоваться битовыми полями, как Вы привели выше, либо дефайнить слова и подставлять их в своё выражение.
Re: Програмирование pic на СИ.
Добавлено: Вс окт 13, 2013 17:28:52
uldemir
Это очень печально.