serenbkii Опубликовано 16 июня, 2013 Поделиться Опубликовано 16 июня, 2013 Компилятор Atmel Studio 6.1. Пробовал все предложеные варианты. Никак не получается побитово с портами общаться. Запись типа portc == 0b00000001 лишает возможности использовать целых 7! пинов порта. В соседней ветке предложили использовать if(~PINC&(1<<0)) и if((PINC^(1<<0))&(1<<0)) вроде получалось, после долгих попыток подставлять разные числа и варианты, сейчас опять ничего не получается. код с предыдущего сообщения проверил, компилится, но в протеусе не работает. Может компилятор сменить? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 16 июня, 2013 Поделиться Опубликовано 16 июня, 2013 Т.е. если не работает в протеусе, то виноват компилятор ? Отличная логика Не много ли чести протеусу ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
serenbkii Опубликовано 16 июня, 2013 Поделиться Опубликовано 16 июня, 2013 Ни в коем случае. Дело в том, что я ещё не видел на форуме упоминаний атмел студии, вот и подумал, что её среда разработки и компил не могут нормально подхватить код, который у всех работает нормально. Обучение только началось и знаний почти ноль, даже базовые знания Си++ ещё толком не освоены и потихоньку доходят до понимания. А вера протеусу из- за того, что возможности работать на реальном железе пока нет, жду прихода комплектующих и инструмента. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Alex Опубликовано 16 июня, 2013 Поделиться Опубликовано 16 июня, 2013 Конструкции, типа if(var&(1<<n)){...} // Проерка бита n в переменной var на еденицу if(!(var&(1<<n))){...} // Проерка бита n в переменной var на ноль должны работать в любом компиляторе. Вместо var вставляем порт, вместо n - номер тестируемого бита. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 16 июня, 2013 Поделиться Опубликовано 16 июня, 2013 (изменено) код с предыдущего сообщения проверил, компилится, но в протеусе не работает. Может компилятор сменить? Это может быть,никак не запомню какой из операторов, "&" или "&&" когда использовать, обычно проверяю отдельно. Возможно стоит поменять оператор. Сразу же предупредил что правильность работы программы гарантировать не могу, код был как пример обращения к биту в байте по номеру. Второе, как и куда подключена кнопка? Должна замыкать PC0 и землю. При этом на PORTB будет "цветомузыка". И, кстати, было бы неплохо указать тактовую частоту, либо компилятору либо #define F_CPU 1000000 //1МГц внутреннее тактирование в коде. Изменено 16 июня, 2013 пользователем COKPOWEHEU 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
serenbkii Опубликовано 16 июня, 2013 Поделиться Опубликовано 16 июня, 2013 (изменено) Конструкции, типа if(var&(1<<n)){...} // Проерка бита n в переменной var на еденицу if(!(var&(1<<n))){...} // Проерка бита n в переменной var на ноль должны работать в любом компиляторе. Спасибо. Работает. Второе, как и куда подключена кнопка? Должна замыкать PC0 и землю. При этом на POERB будет "цветомузыка". И, кстати, было бы неплохо указать тактовую частоту, либо компилятору либо #define F_CPU 1000000 //1МГц внутреннее тактирование в коде. подключено верно, приложил схему. Частота у меня указана, без частоты паузы не выставляются. Изменено 16 июня, 2013 пользователем serenbkii 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
a_sergeevich Опубликовано 22 июля, 2013 Автор Поделиться Опубликовано 22 июля, 2013 Почему у тебя в программе нету так называемого антидребезга, в протеусе может и будет работать, а в реале нет, а учиться правильно делать надо сразу, чтобы потом не было вопросов типа, почему в протеусе пашет, а в железе нет. Реализуется с помощью цикла for if (var & ( 1<< n )) кнопка нажата { for ( i=0; i <= 10; i++ ); выдержка if (var & ( 1<< n )) снова проверяем нажата ли кнопка { выполняем все необходимые действия } } Короче как-то так. 0 Будьте проще и люди к вам потянутся. Ссылка на комментарий Поделиться на другие сайты Поделиться
Lyt Опубликовано 27 июля, 2013 Поделиться Опубликовано 27 июля, 2013 Передача аргумента в прерывание - только с использованием глобальных переменных? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 27 июля, 2013 Поделиться Опубликовано 27 июля, 2013 Передача аргумента в прерываниеИнтересно, какие Вы хотите аргументы передавать в прерывание, и "кто" их будет передавать ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lyt Опубликовано 27 июля, 2013 Поделиться Опубликовано 27 июля, 2013 ну, неправильно выразился. я хочу в обработчике инкрементировать переменную и потом с ней работать в основном цикле 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 27 июля, 2013 Поделиться Опубликовано 27 июля, 2013 Тогда только через глобальную переменную. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 10 августа, 2013 Поделиться Опубликовано 10 августа, 2013 сюр какой-то.... среда MPLAB IDE 8.92 подключил С18 v3.43 создал проект для pic18f2550 из папки примеров взял код типа дрыгаем ногами по таймеру0 #include <p18cxxx.h> #include <timers.h> #define NUMBER_OF_LEDS 8 void timer_isr (void); static unsigned char s_count = 0; #pragma code low_vector=0x18 void low_interrupt (void) { _asm GOTO timer_isr _endasm } #pragma code #pragma interruptlow timer_isr void timer_isr (void) { static unsigned char led_display = 0; INTCONbits.TMR0IF = 0; s_count = s_count % (NUMBER_OF_LEDS + 1); led_display = (1 << s_count++) - 1; PORTB = led_display; } void main (void) { TRISB = 0; PORTB = 0; /* * Enable the TMR0 interrupt, setting up the timer as an internal * 16-bit clock. */ OpenTimer0 (TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT); INTCONbits.GIE = 1; while (1) { } } откомпилировал, ошибок нет, подключаю протез - не работает, подключаю сим млаба,смотрю файл регистров - вижу следующие: T0CON=0b10011111 (таймер вкл, 16бит вкл, такт от OSC без прескалера) TMR0L - приращение есть.... TMR0H -приращения нет.... собственно в прерывание не попадаем.... что не так? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 10 августа, 2013 Поделиться Опубликовано 10 августа, 2013 может попробовать volatile unsigned char s_count = 0; В Пиках не смыслю, но может поможет. volatile - указание компилятору, что, даже в целях оптимизации, значение переменной должно всегда сбрасываться в память после изменения (они-то идут в регистрах а не ОЗУ). Что дает static в приложении к глобальной переменной - не знаю, просветите кому не лень. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
BerZerKku Опубликовано 11 августа, 2013 Поделиться Опубликовано 11 августа, 2013 Что дает static в приложении к глобальной переменной - не знаю, просветите кому не лень.Ограничивает область видимости данным файлом.Назначение модификатора volatile - отключить оптимизацию. http://www.edaboard.com/thread197899.html - вот похожая тема, почитайте, большинство встречаемых проблем давно уже разобраны на просторах интернета. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 11 августа, 2013 Поделиться Опубликовано 11 августа, 2013 http://www.edaboard....read197899.html - вот похожая тема, почитайте Спб. почитал... там нет решения... с таймером я разобрался - нужно было смотреть регистр TMR0_internal...то же дошел до прямой инициализации таймера и прерывания, ничего не поменялось... проблема осталась и она в другом: по переполнению таймера программа в симе вместо перехода на вектора прерывания переходит на вектор сброса... :wall: 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 11 августа, 2013 Поделиться Опубликовано 11 августа, 2013 Назначение модификатора volatile - отключить оптимизацию. Только для данной переменной. Вообще, volatile используется именно тогда, когда переменная должна изменяться или использоваться в прерывании. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 11 августа, 2013 Поделиться Опубликовано 11 августа, 2013 IMXO, по умолчанию (если не включать приоритеты) у всех модулей высокий приоритет. Соответственно, обработчик должен лежать по 0x08, а не 0x18. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 11 августа, 2013 Поделиться Опубликовано 11 августа, 2013 это понятно... тогда по переполнению таймера прога должна уходить на 0х08 и благополучно доходить до 0х18 или нет? а оная в симе уходит на 0х00 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 11 августа, 2013 Поделиться Опубликовано 11 августа, 2013 или нет?Конечно или нет. Т.к. что там находится по адресу 0x08, до адреса 0x18, неизвестно.В любом случае, сделай обработчик высоких приоритетов, или включи приоритеты и дай таймеру низкий приоритет. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 11 августа, 2013 Поделиться Опубликовано 11 августа, 2013 Т.к. что там находится по адресу 0x08, до адреса 0x18, неизвестно.В любом случае, сделай обработчик высоких приоритетов, или включи приоритеты и дай таймеру низкий приоритет. по адресам 0х04 и 0х14 компилятор ставит return 0 но все равно не понятно почему в случае отсутствия ОВП переход идет на 0х00 , а не на 0х08 или 0х18... так и сделал...добавил обработчик высокого приоритета , назначил приоритет для таймера все пошло... #include <p18cxxx.h> //#include <timers.h> //#pragma config OSC = HS, OSCS = OFF #pragma config PWRT = OFF #pragma config BOR = OFF #pragma config WDT = OFF //#pragma config CCP2MUX = OFF #pragma config LVP = OFF #define NUMBER_OF_LEDS 8 void timer_isr (void); void button (void); static unsigned char s_count = 0; #pragma code high_vector_section=0x8 void high_vector (void) { _asm GOTO button _endasm } #pragma code low_vector=0x18 void low_interrupt (void) { _asm GOTO timer_isr _endasm } #pragma code #pragma interruptlow timer_isr void timer_isr (void) { static unsigned char led_display = 0; /* * Clears the TMR0 interrupt flag to stop the program from processing the * same interrupt multiple times. */ INTCONbits.TMR0IF = 0; TMR0H=0xff; TMR0L=0x50; LATB = LATB^0b00000110; } #pragma interrupt button void button (void) { _asm nop nop _endasm } void main (void) { /* * Initialize the special function registers TRISB and PORTB. */ ADCON1=0xff; TRISB = 0; PORTB = 0; /* * Enable the TMR0 interrupt, setting up the timer as an internal * 16-bit clock. * Enable global interrupts. */ TMR0H=0xff; TMR0L=0x50; T0CON = 0b10011111; INTCONbits.TMR0IF = 0; RCONbits.IPEN=1; INTCON2bits.TMR0IP = 0; INTCONbits.T0IE = 1; INTCONbits.GIEL = 1; INTCONbits.GIE = 1; while (1) { _asm nop nop _endasm INTCONbits.GIEL = 0; LATB = LATB^0b00000001; INTCONbits.GIEL = 1; } } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
TDSS Опубликовано 13 августа, 2013 Поделиться Опубликовано 13 августа, 2013 (изменено) del Изменено 13 августа, 2013 пользователем TDSS 0 Иван Сусанин - первый полупроводник Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 17 августа, 2013 Поделиться Опубликовано 17 августа, 2013 Вот что получилось. Самое то что надо было.http://forum.cxem.ne...ttach_id=233720 что бы получить такую последовательность можно просто прибавлять счетчик и проверять бит0 и бит3 асм для авиров не знаю вот код на Си while(1) { counter++; if(counter.bit0) { if(counter.bit3) { PORTB.RB3=1; } else { PORTB.RB4=1; } } else { PORTB.RB3=0; PORTB.RB4=1; } delay(); } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 17 августа, 2013 Поделиться Опубликовано 17 августа, 2013 PORTB.RB3=1; Такого Си не знает. Даже, в стиле cvavr (PORTB.3=1) тоже не знает. Именно Си знает что-то вроде PORTB |= (1<<3); Аналогично с counter.bit3, без извращений такое не сделать а с извращениями больно громоздко выглядит. Лучше уж if(counter & 0b00001001) для первого сравнения. Извращения это создание своей структуры typedef union{ unsigned char value; struct{ char bit0:1; char bit1:1; ... char bit7:1; }bits; }struct_name; к которой и обращаться надо как struct_name.value=0xAA; struct_name.bits.bit0=1; Может можно и покороче, но вряд ли проще чем с битовыми масками. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 17 августа, 2013 Поделиться Опубликовано 17 августа, 2013 PORTB.RB3=1; Такого Си не знает. ну это вопрос спорный... компиляторы для пиков очень даже понимают такую запись,так что это вопрос к компиляторам, если вы не заметили я писал что не знаю асм для авиров, но больше чем уверен, что команды работы с битами в асме для авиров есть, и такой код будет в два раза короче предложных и займет только один регистр для счетчика...для пиков на асме это выглядело бы так: cicle: incf counter,f btfss counter,0 goto label_1 btfsc counter,3 bsf PORTB,3 btfss counter,3 bsf PORTB,4 goto label_2 label_1 bcf PORTB,3 bcf PORTB,4 label_2 call Delay cicle_end goto cicle 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 17 августа, 2013 Поделиться Опубликовано 17 августа, 2013 PORTB.RB3=1; Такого Си не знает.Ерунду говорите, сударь. Это обычная структура, а RB3 - её битовое поле. Си очень хорошо это всё знает. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.