Перейти к содержанию

crazz

Рекомендуемые сообщения

Переписал используя ваши поправки, теперь все просто:

Otschet  bsf         STATUS,5
        clrf        OPTION_REG
        movlw       b'10000101'  ; TMR0 1:64 (16,384ms)
        movwf       OPTION_REG
        bcf         STATUS,5
        movlw       .10
        movwf       Secund       ; количество секунд
loop     movlw       .61
        movwf       SecL         ; Переменная однои секунды.
        bsf         Flag,0       ; Начнем отсчет( сбросится в прерывании когда досчитает)
        decf        Secund,0       ; Декремент, сохраняется в W
        call        TABLE
        movwf       PORTB
        btfsc       Flag,0       ; секунда прошла?
        goto        $-1          ; Подождем
        movf        Secund       ; Проверим на ноль
        btfss       STATUS,2     ; Если ноль, флаг =1
        goto        loop         ; Если флаг не поднят, то не = 0.
        goto        OGID         ; если поднят, то =0. Здесь больше делать нечего.

;========================================
TABLE      addwf       PC,F        ; Содержимое счетчика команд PC увеличивается
                                   ; на величину содержимого аккумулятора W.
           retlw       b'00111111' ; ..FEDCBA = 0              Происходит скачек по таблице
           retlw       b'00000110' ; .....CB. = 1               на строку со значением, 
           retlw       b'01011011' ; .G.ED.BA = 2               записанным в аккумуляторе,
           retlw       b'01001111' ; .G..DCBA = 3               и далее - возврат по стеку.
           retlw       b'01100110' ; .GF..CB. = 4       
           retlw       b'01101101' ; .GF.DC.A = 5      
           retlw       b'01111101' ; .GFEDC.A = 6        
           retlw       b'00000111' ; .....CBA = 7                                     
           retlw       b'01111111' ; .GFEDCBA = 8                                     
           retlw       b'01101111' ; .GF.DCBA = 9                                

у меня поздно уже, может я что-то испортил. Проверьте, очень признателен за вашу помощь.

Да и завтра надо будет в такои же участок кода втсроить опрос кнопки на отмену, то есть отсчет 10 секунд начался - индикатор считает и одновременно надо опрашивать кнопку на отмену всего этого.

Изменено пользователем Andrey_Ch8

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Ну вот теперь вроде нормально. Должно заработать.

А кнопку можешь опрашивать в прерывании по таймеру и выставлять флаг. А в основном цикле следить за этим флагом.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

чем спрашивать "будет работать или нет" мог бы и сам запустить и проверить. А потом уже в случае чего, спрашивать почему НЕработает :D .

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Андрей.

Маленький и ненавязчивый совет в догон.

По стилю написания Вами программ чувствуется, что начинали Вы с "самоучителя" господина Корабельникова.

Так вот мой совет - забудьте обо всем, что Вы там вычитали. Иначе с каждой задачей Вы будете иметь кучу проблем.

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

И я поддерживаю Алекса, что наилучшим ходом в этом направлении будет переход на Си. К АСМу Вы сможете вернуться только после овладения структурой программирования на языке высокого уровня, если конечно захотите возвращаться на АСМ... :rolleyes:

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Alex, просто перебрал ВАШ код так как я его понимаю............так совсем ничего не работает :(

Подскажите что не так.

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

//==================================================================

#include<p18f452.h>

#include <delays.h>

void main (void);

void key_press(char key_num);

void keyboard(void);

// Сегменти (цифри) 0 1 2 3 4 5 6 7 8 9

unsigned char const digit[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

unsigned char ind[4]; // Буфер iндикаторiв [1-4]

const char key[12] = {1,2,3,4,5,6,7,8,9,10,0,10};

char buf_key[10];

char key_flag=0;

void main()

{

char tmp,i;

TRISC=0b00000000;

PORTC=0b11111111;

TRISD=0b11110000;

PORTD=0b11110000;

TRISB=0b11100001;

PORTB=0b00011110;

key_flag=0;

T1CONbits.RD16=0;

T1CONbits.T1CKPS0=0;

T1CONbits.T1CKPS1=0;

T1CONbits.T1OSCEN=0;

T1CONbits.T1SYNC=0;

T1CONbits.TMR1CS=0;

T1CONbits.TMR1ON=1;

PIR1bits.TMR1IF=0;

PIE1bits.TMR1IE=1;

RCONbits.IPEN=1;

INTCONbits.GIE=1;

INTCONbits.PEIE=1;

IPR1bits.TMR1IP=1;

ind[0] = ~digit[10];

ind[1] = ~digit[10];

ind[2] = ~digit[10];

ind[3] = ~digit[10];

//---------------------//

while (1)

{

//----- Задержка 1 сек. -------//

Delay1KTCYx(1);

Delay1KTCYx(1);

//-----------------------------//

//-------------//

while(key_flag)

{ //

tmp=buf_key[0];

INTCONbits.GIE=0;

for(i=0;i<9;i++)

{

buf_key = buf_key[i+1];

}

key_flag--;

INTCONbits.GIE=1;

key_press(tmp);

}

//---------------------------------------------------------------//

}

}

//******************************************************//

void key_press(char key_num) // Обработчик нажатой кнопки. key_num - номер нажатой кнопки

{

char i,cod;

for(i=0;i<3;i++)

{ // Двигаем буфер индикаторов влево

ind = ind[i+1];

}

cod = key[key_num]; // Выдираем код нажатой кнопки из таблицы

ind[3] = ~digit[cod]; // В 4-ый индикатор пихаем код

}

//******************************************************//

//***** обработчик прерываний ***********************//

void interrupt(void)

{

static unsigned char ind_num=0; // Номер индикатора

static char cnt_ms=10; // Счётчик mS для опроса кнопок

if (PIR1bits.TMR1IF==1) //Перевірка, чи відбулося переповнення таймера 1

{

PIR1bits.TMR1IF=0; //скинути прапорець переривань

ind_num++; // Следующий индикатор

if(ind_num>3)

ind_num=0; // Если зашкалило, выбираем первый

PORTD &=0b11110000; // Гасим индикаторы

PORTC=ind[ind_num]; // Выводим в порт значение текущего индикатора из буфера

PORTD |=(1<<ind_num); // Зажигаем текущий индикатор

if(!--cnt_ms)

{ // Отсчитываем 10 mS

cnt_ms=10;

keyboard(); // Вызываем процедуру опроса кнопок

}

}

}

//***************************************************//

void keyboard() // процедуру опроса кнопок

{

char i;

static char H_num=0; // Номер опрашиваемой строки

char key_num; // Порядковый номер опрашиваемой кнопки

char key_par[12]; // Текущие состояния кнопок

static char key_tmp[12]; // Предыдущие состояния кнопок

H_num++; // Следующая строка

if(H_num>3)

{ // Если зашкалило - выбираем первую строку

H_num=0;

}

key_num =H_num*3; // Смещаем номер опрашиваемой кнопки относительно номера строки

//RB1=1;RB2=1;RB3=1;RB4=1; // На всех строках 1-чки

PORTBbits.RB1=1;

PORTBbits.RB2=1;

PORTBbits.RB3=1;

PORTBbits.RB4=1;

if(H_num==0) // 0 на 1-ой строке

PORTBbits.RB4=0;

if(H_num==1) // 0 на 1-ой строке

PORTBbits.RB3=0;

if(H_num==2) // 0 на 1-ой строке

PORTBbits.RB2=0;

if(H_num==3) // 0 на 1-ой строке

PORTBbits.RB1=0;

if(!PORTBbits.RB5) // Если в 1-ом стобце лог.0

key_par[key_num]=1; // текущее состояние кнопки - нажато

else // иначе

key_par[key_num]=0; // cостояние - отжато

key_num++; // Номер кнопки +1

if(!PORTBbits.RB6)

key_par[key_num]=1;

else

key_par[key_num]=0;

key_num++; // Номер кнопки +1

if(!PORTBbits.RB7)

key_par[key_num]=1;

else

key_par[key_num]=0;

//---- Сохраняем текущие состояния кнопок ----//

//---- и смотрим изменения состояний ---------//

for(i=0;i<12;i++)

{

if(key_tmp && !key_par) { // Если предыдущее состояние было нажато и текущее отжато

buf_key[key_flag] = i; // Сохраняем в буфер номер нажатой кнопки

key_flag++; // Увеличиваем флаг/счётчик на 1

}

key_tmp = key_par; // Сохраняем текущие состояния

}

//-------------------------------------------//

}

//============================================================

//===========================================================

work03.rar

Ссылка на комментарий
Поделиться на другие сайты

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

Что конкретно не работает ? Если ошибки, то какие ...

Ссылка на комментарий
Поделиться на другие сайты

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

Что конкретно не работает ? Если ошибки, то какие ...

Код компилятор принимает как правильный, никаких ошибок.........но когда я его подключаю к протеусу...ничего не происходит.

И как должен обработчик оформляется?

Ссылка на комментарий
Поделиться на другие сайты

При написании прерываний на Си, ошибка в синтаксисе обработчика приводит к размещению подпрограммы не по вектору прерываний и без стандарного выхода с разрешением прерываний. А ошибку компилятор не выдает.

Это как пример.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Так оно и есть.

void interrupt(void) Компилятор посчитал за обычную функцию.

Причём у меня было написано void interrupt _isr(void)

Видимо компилятор ругнулся на _isr, и wi3ik решил это "слово" убрать :)

И как должен обработчик оформляется?
Вы меня поражаете... :blink: Вы уже писали программу с обработчиком, причём коментарии даже есть. А теперь задаёте такой тупиковый вопрос :wacko:
Ссылка на комментарий
Поделиться на другие сайты

void interrupt(void) Компилятор посчитал за обычную функцию.

Чудной компилятор. По идеи "interrupt" должно быть ключевым (зарезервированным) словом и при использование в качестве имени функции компилятор должен был бы выдать ошибку.

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

Совсем даже не чудной. Резервирование слов при разработке компиляторов - это взгляд разработчиков этого компилятора на язык. Английский язык.

Более подходящим, в данном случае, им показалась англоязычная аббревиатура от Interrupt Service Routine - ISR. Что вполне логично....

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

wi3ik, скажте где можно взять Ваш компилятор ? Только не на всяких депозитах и рапидах, а на нормальном источнике.

Этот компилятор дал мне мой преподаватель.....

http://fileshare.in.ua/3919783

Ссылка на комментарий
Поделиться на другие сайты

Насколько я понимаю этот компилятор платный. На торренте есть.

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

Здравствуите, мне тут уже обьясняли но я прочитал прошлые страницы, что-то не нашел. Я тут свою программу переписывать собрался на другои контроллер. PIC16F873A, так вот там несколько таимеров, непоиму как мне сделать прерывания от TMRO и TMR1 более наглядными, то есть через каждые 20мС?

Не цитируите полностью предыдущее сообщение!!!

Ссылка на комментарий
Поделиться на другие сайты

Заюзайте TMR1, проинициализируйте его, и в обработчике переустанавливайте на 20000 тактов (при 4 Мгц кварце).

Насколько я понимаю этот компилятор платный.
По этому я и попросил wi3ik'а дать ссылку откуда можно качнуть с таблЭткой. Тем более что это нужно для него :)
Ссылка на комментарий
Поделиться на другие сайты

Это же Mplab, он у меня есть. А сам Си компилятор где скачать ?

В архиве, который я в ссылку закинул есть дополнение (как мне объяснили)которое ставится к МПлабу.

Вот ссылка отдельно на его

http://fileshare.in.ua/3922953

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Доброе время суток всем.

У меня возник следующий вопрос. Пользуюсь Mplab, компилятор MCC18(пишу на си). Так вот, на просторах интернета есть примеры для работы стаймером TMR0, например

 TMR0 =  0;		    // обнуляем счётчик
  while (TMR0 < DELAY) { } // просто ждём

Однако мой компилятор ругается на TMR0. В заголовочном файле <p18f2550.h> определены регистры TMR0L и TMR0H. Насколько я понял это младший и старший регистры. Но TMR0 8-разрядный, тогда получается, что TMR0L и TMR0H 4-разрядные. Правильно ли я думаю?

Если так, то строка TMR0 = 0; будет эквивалентна TMR0L=0; TMR0H=0;?

Изменено пользователем Noglamour
Ссылка на комментарий
Поделиться на другие сайты

Нулевой таймер в 18-х ПИКах может быть и одно и двух байтным, это определяется его контрол регистром. Но даже в однобайтном варианте регистра TMR0 нет, есть только TMR0L.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Содержимое спецрегистров с побитной функциональностью (в данном случае T0CON) лучше писать в бинарной форме. Да еще и с комментами.

На память не помню что есть 0хС7 ( помню только, что это 8-разрядный режим).

Остальное настолько же верно, насколько бессмысленно.

Проще делать цикл пересчета с предустановкой дополнительного кода и ожиданием переполнения по флагу прерывания. Код будет компактнее, а латентность выхода из цикла минимальная.

Но синтаксически и аппаратно приведенный пример правилен.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

описание из даташита b618729ae243.jpg

0xC7 = b'11000111'

правильным тогда будет код:

T0CON = b'11000111';
TMR0L = 0;
T0CONbits.TMR0ON = 1;
while (INTCONbits.TMR0IF == 0);
T0CONbits.TMR0ON = 0;
INTCONbits.TMR0IF = 0;

?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...