Pugnator, ну у Agassy, в конечном варианте же
PORTB.B7=~PORTB.B7;
MikroТрёп , Все о Microchip, Intel, Arm, Atmega
Classic forever!
Попробуй пересоздать проект в протеусе. бывало всякое.
Ну и самое главное - изменяются ли флаги прерываний, если используешь COFF то ставь на паузу и Debug-Watch Window и смотри что там происходит
Ну и самое главное - изменяются ли флаги прерываний, если используешь COFF то ставь на паузу и Debug-Watch Window и смотри что там происходит
Excuses are like assholes: everybody's got one
Pugnator
Попробуй пересоздать проект в протеусе. бывало всякое.
Ну и самое главное - изменяются ли флаги прерываний, если используешь COFF то ставь на паузу и Debug-Watch Window и смотри что там происходит
Флаги меняются! Все ОК! Это еще со старым проектом...
Pugnator
Oxygen, не,не. протеус кварц не симулирует внешний так и так.
PORTB.B7^=PORTB.B7;
Такое работать не будет
MicroC PRO, такой синтаксис отрабатывает на ура!
Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
---
Difficult we made yesterday impossible we are making now!
Agassy, сделай так. в основном цикле поставь мигаться другой диод
for(;
{LED=~LED;delay_ms(1000);}
И смотри. Если он не будет мигать - значит у тебя зависло в прерывании - ты не сбросил какой-то флаг
for(;
И смотри. Если он не будет мигать - значит у тебя зависло в прерывании - ты не сбросил какой-то флаг
Excuses are like assholes: everybody's got one
Oxygen
а ты уверен что никакое другое прерывание не вызывается? Ведь в конечном коде ты инвертируешь при любом прерывании....
думал, про это, потому пытался ввести такой вот иф
if (PIR1.TMR1IF == 1)
не помогло
Pugnator
Agassy, сделай так. в основном цикле поставь мигаться другой диод
for(;{LED=~LED;delay_ms(1000);}
...
мысль!!!
ща запытаем!
Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
---
Difficult we made yesterday impossible we are making now!
Так-с товарищи! есть положительная динамика! 
Использовал порт RB4, получил на выходе меандр с частотой 0,5Hz
Какие будут мысли, по данному поводу?
попробовал уйти на RB5-работает! RB6, RB7 - не хочет, мистика?
bit LED_B4 at RB4_bit;
ANSEL;
ANSELH;
C1ON_bit; // Disable comparators
C2ON_bit;
void main() {
ANSEL = 0; // All I/O pins are configured as digital
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
TRISA = 0b00100000;
TRISB = 0b00001000;
PORTA = 0x00;
PORTB = 0b00000000;
INTCON.PEIE = 1; // разрешены все прерывания от переферии
INTCON.GIE = 1; // разрешены все глобальные прерывания
// Set timer TMR1
T1CON = 1;
// Timer1 Registers:
// Prescaler=1:4; TMR1 Preset=3036; Freq=1,00Hz; Period=1 000 000 000 ns
// bit 0 enables timer
T1CON.TMR1ON = 0;
// bit 1 Timer1 Clock Source Select bit: 0=Internal clock (FOSC/4)
T1CON.TMR1CS = 0;
// bit 2 Timer1 External Clock Input Synchronization Control bit: 1=Do not synchronize external clock input
T1CON.F2 = 1;
// bits 5-4 Prescaler Rate Select bits
T1CON.T1CKPS1 = 1;
T1CON.T1CKPS0 = 0;
// bit 3 Timer1 Oscillator Enable Control: bit 1=on вкл. такт.генератор TMR1
T1CON.T1OSCEN = 1;
// сброс флага прерывания по переполнению TMR1
PIR1.TMR1IF = 0;
// прерывание от TMR1 разрешено
PIE1.TMR1IE = 1;
// bit 0 enables timer
T1CON.TMR1ON = 1;
while (1) {continue;}
}
void interrupt() {
LED_B4=~LED_B4;
PIR1.TMR1IF = 0;
// preset for timer1 MSB register
TMR1H = 0xB;
// preset for timer1 LSB register
TMR1L = 0xDC;
}
Использовал порт RB4, получил на выходе меандр с частотой 0,5Hz
Какие будут мысли, по данному поводу?
попробовал уйти на RB5-работает! RB6, RB7 - не хочет, мистика?
Код
bit LED_B4 at RB4_bit;
ANSEL;
ANSELH;
C1ON_bit; // Disable comparators
C2ON_bit;
void main() {
ANSEL = 0; // All I/O pins are configured as digital
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
TRISA = 0b00100000;
TRISB = 0b00001000;
PORTA = 0x00;
PORTB = 0b00000000;
INTCON.PEIE = 1; // разрешены все прерывания от переферии
INTCON.GIE = 1; // разрешены все глобальные прерывания
// Set timer TMR1
T1CON = 1;
// Timer1 Registers:
// Prescaler=1:4; TMR1 Preset=3036; Freq=1,00Hz; Period=1 000 000 000 ns
// bit 0 enables timer
T1CON.TMR1ON = 0;
// bit 1 Timer1 Clock Source Select bit: 0=Internal clock (FOSC/4)
T1CON.TMR1CS = 0;
// bit 2 Timer1 External Clock Input Synchronization Control bit: 1=Do not synchronize external clock input
T1CON.F2 = 1;
// bits 5-4 Prescaler Rate Select bits
T1CON.T1CKPS1 = 1;
T1CON.T1CKPS0 = 0;
// bit 3 Timer1 Oscillator Enable Control: bit 1=on вкл. такт.генератор TMR1
T1CON.T1OSCEN = 1;
// сброс флага прерывания по переполнению TMR1
PIR1.TMR1IF = 0;
// прерывание от TMR1 разрешено
PIE1.TMR1IE = 1;
// bit 0 enables timer
T1CON.TMR1ON = 1;
while (1) {continue;}
}
void interrupt() {
LED_B4=~LED_B4;
PIR1.TMR1IF = 0;
// preset for timer1 MSB register
TMR1H = 0xB;
// preset for timer1 LSB register
TMR1L = 0xDC;
}
Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
---
Difficult we made yesterday impossible we are making now!
Agassy, Нет, просто надо читать даташит
RB6-RB7 это ноги для второго кварца для таймера, это видно даже по обозначению. Чтобы ноги освободить, надо включить таймер на работу от общего генератора. В протеусе не очевидно, ибо кварцы вообще не симулируются.
И зачем ты пишешь
while(1){continue;}?
в твоем случае просто
while(1){}
Кроме того, в данном случае это избыточно, так как у тебя весь код крутится в прерывании,а этим циклом ты просто вешаешь процессор и сажаешь батарею.
В крайнем случае, если нужно держать живым код (например чтоб ЖКИ обновлялся иногда), лучше уводить его в сон или в idle. А пробуждаться он будет от прерывания
Для микроконтроллеров PIC16F627/628, когда включен генератор тактовых импульсов (T1OSCEN=1) выводы
RB7/T1OSI и RB6/T1OSO/T1CKI настроены как входы. Значение битов TRISB<7:6> игнорируется.
RB6-RB7 это ноги для второго кварца для таймера, это видно даже по обозначению. Чтобы ноги освободить, надо включить таймер на работу от общего генератора. В протеусе не очевидно, ибо кварцы вообще не симулируются.
И зачем ты пишешь
while(1){continue;}?
в твоем случае просто
while(1){}
Кроме того, в данном случае это избыточно, так как у тебя весь код крутится в прерывании,а этим циклом ты просто вешаешь процессор и сажаешь батарею.
В крайнем случае, если нужно держать живым код (например чтоб ЖКИ обновлялся иногда), лучше уводить его в сон или в idle. А пробуждаться он будет от прерывания
Excuses are like assholes: everybody's got one
Pugnator
Agassy, Нет, просто надо читать даташит
RB6-RB7 это ноги для второго кварца для таймера, это видно даже по обозначению. Чтобы ноги освободить, надо включить таймер на работу от общего генератора. В протеусе не очевидно, ибо кварцы вообще не симулируются.
Ок! Спасибо! даташит читал, но в первом грубом приближении
понадеялся на:
Код
TRISB = 0b00001000;
будет уроком на будущее!
И зачем ты пишешь
while(1){continue;}?
в твоем случае просто
while(1){}
тут как бы, надо понимать, что это только часть кода, поэтапное написание/отладка и безусловно в while будет крутиться, свой кусок
В крайнем случае, если нужно держать живым код (например чтоб ЖКИ обновлялся иногда), лучше уводить его в сон или в idle. А пробуждаться он будет от прерывания
ок, постараюсь учесть!
Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
---
Difficult we made yesterday impossible we are making now!
Кстати, чтобы не мучаться с внешним видом кода, можно поступить так.
Скачиваешь
http://sourceforge.net/projects/uncrustify/files/uncrustify/
От него нужен только исполняемый файл, кладешь его куда-нить
В аттаче лежит конфиг и баник, положить их рядом с экзешником (в аттаче полный набор с исполняемым). Соответсвующим образом поправить пути в bat файле.
Далее пройти по Tools-Option и добавить батник на горячую клавишу.
В данном примере вызывается по Ctrl-Alt-F
Этот конфиг я настраивал под себя и он размечает в классическом стиле C

Скачиваешь
http://sourceforge.net/projects/uncrustify/files/uncrustify/
От него нужен только исполняемый файл, кладешь его куда-нить
В аттаче лежит конфиг и баник, положить их рядом с экзешником (в аттаче полный набор с исполняемым). Соответсвующим образом поправить пути в bat файле.
Далее пройти по Tools-Option и добавить батник на горячую клавишу.
В данном примере вызывается по Ctrl-Alt-F
Этот конфиг я настраивал под себя и он размечает в классическом стиле C

Excuses are like assholes: everybody's got one
Коллеги!
По теме "СТАРТ/СТОП одной кнопкой", какую частоту опроса кнопки, предпочтительно установить?
10Hz-20Hz или хватить и 5Hz?
Заранее благодарен!
По теме "СТАРТ/СТОП одной кнопкой", какую частоту опроса кнопки, предпочтительно установить?
10Hz-20Hz или хватить и 5Hz?
Заранее благодарен!
Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
---
Difficult we made yesterday impossible we are making now!
Agassy, зачем её опрашивать, поллинг это крайне грустное затрачивание ресурсов процессора. У тебя даже в самых древних 10C PICах есть INTE. Этого прерывания достаточно.
Включаешь внутреннюю подтяжку на плюс, а кнопку на массу вешаешь
Включаешь внутреннюю подтяжку на плюс, а кнопку на массу вешаешь
Excuses are like assholes: everybody's got one
Pugnator
Agassy, зачем её опрашивать, поллинг это крайне грустное затрачивание ресурсов процессора....
а процессору собственно делать то больше, пока и нечего
и насколько помню, подтяжку по одному/конкретному порту - включить нельзя, только все скопом или заблуждаюсь?
и еще.. на опросе кнопки - завязано, два события "короткое" и "длинное" нажатие..которые вычисляется по тикам..
Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
---
Difficult we made yesterday impossible we are making now!
Agassy
а процессору собственно делать то больше, пока и нечеготока кнопка и висит....
и насколько помню, подтяжку по одному/конкретному порту - включить нельзя, только все скопом или заблуждаюсь?
и еще.. на опросе кнопки - завязано, два события "короткое" и "длинное" нажатие..которые вычисляется по тикам..
приду на работу - отпишу мысли
Excuses are like assholes: everybody's got one
ок! спасибо!
на всякий случай...алгоритм, который использую...
на всякий случай...алгоритм, который использую...
Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
---
Difficult we made yesterday impossible we are making now!
1)Запуск прерывания RB0/INT
2)Ждем прерывания по INT, ставим флаг triggered
В главном теле если triggered==TRUE
ждем delay_ms(500)
проверяем порт, если он все ещё High, то это долгое удержание, если нет - короткое
сбрасываем флаг
2)Ждем прерывания по INT, ставим флаг triggered
В главном теле если triggered==TRUE
ждем delay_ms(500)
проверяем порт, если он все ещё High, то это долгое удержание, если нет - короткое
сбрасываем флаг
Excuses are like assholes: everybody's got one