59 сообщений 59 4 спасибо за тему 4
Опции темы
Pugnator, ну у Agassy, в конечном варианте же
PORTB.B7=~PORTB.B7;
Classic forever!
Попробуй пересоздать проект в протеусе. бывало всякое.
Ну и самое главное - изменяются ли флаги прерываний, если используешь 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!
Agassy, сделай так. в основном цикле поставь мигаться другой диод
for(;;){LED=~LED;delay_ms(1000);}
И смотри. Если он не будет мигать - значит у тебя зависло в прерывании - ты не сбросил какой-то флаг
Excuses are like assholes: everybody's got one
Oxygen

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

думал, про это, потому пытался ввести такой вот иф
if (PIR1.TMR1IF == 1)
не помогло smile.gif

Pugnator

Agassy, сделай так. в основном цикле поставь мигаться другой диод
for(;;){LED=~LED;delay_ms(1000);}
...

мысль!!!
ща запытаем!
Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
Так-с товарищи! есть положительная динамика! smile.gif
Использовал порт RB4, получил на выходе меандр с частотой 0,5Hz bp.gif

Какие будут мысли, по данному поводу?
попробовал уйти на 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!
спс 1 Кто сказал спасибо Agassy
Agassy, Нет, просто надо читать даташит

Для микроконтроллеров 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 это ноги для второго кварца для таймера, это видно даже по обозначению. Чтобы ноги освободить, надо включить таймер на работу от общего генератора. В протеусе не очевидно, ибо кварцы вообще не симулируются.

Ок! Спасибо! даташит читал, но в первом грубом приближении ah.gif
понадеялся на:
Код

TRISB = 0b00001000;

будет уроком на будущее! smile.gif


И зачем ты пишешь
while(1){continue;}?
в твоем случае просто
while(1){}

тут как бы, надо понимать, что это только часть кода, поэтапное написание/отладка и безусловно в while будет крутиться, свой кусокwink.gif


В крайнем случае, если нужно держать живым код (например чтоб ЖКИ обновлялся иногда), лучше уводить его в сон или в idle. А пробуждаться он будет от прерывания

ок, постараюсь учесть!
Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
спс 1 Кто сказал спасибо Agassy
Кстати, чтобы не мучаться с внешним видом кода, можно поступить так.
Скачиваешь
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?

Заранее благодарен!
Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
Agassy, зачем её опрашивать, поллинг это крайне грустное затрачивание ресурсов процессора. У тебя даже в самых древних 10C PICах есть INTE. Этого прерывания достаточно.
Включаешь внутреннюю подтяжку на плюс, а кнопку на массу вешаешь
Excuses are like assholes: everybody's got one
Pugnator

Agassy, зачем её опрашивать, поллинг это крайне грустное затрачивание ресурсов процессора....

а процессору собственно делать то больше, пока и нечего smile.gif тока кнопка и висит....
и насколько помню, подтяжку по одному/конкретному порту - включить нельзя, только все скопом или заблуждаюсь?
и еще.. на опросе кнопки - завязано, два события "короткое" и "длинное" нажатие..которые вычисляется по тикам..
Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
Agassy

а процессору собственно делать то больше, пока и нечего smile.gif тока кнопка и висит....
и насколько помню, подтяжку по одному/конкретному порту - включить нельзя, только все скопом или заблуждаюсь?
и еще.. на опросе кнопки - завязано, два события "короткое" и "длинное" нажатие..которые вычисляется по тикам..

приду на работу - отпишу мысли
Excuses are like assholes: everybody's got one
ок! спасибо!

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

Критерием истины - является практика ! (с)
---
Difficult we made yesterday impossible we are making now!
+1 1 Кто согласен с автором Dolfinchik
1)Запуск прерывания RB0/INT
2)Ждем прерывания по INT, ставим флаг triggered

В главном теле если triggered==TRUE
ждем delay_ms(500)
проверяем порт, если он все ещё High, то это долгое удержание, если нет - короткое
сбрасываем флаг
Excuses are like assholes: everybody's got one

Войти, чтобы ответить.