Форум микрочип - как да се запише и да разчита на импулси в памет PIC16F877

Как да се запише и да разчита на импулси в паметта на PIC16F877

Имате задача. С датчик образувани SS443A импулси с различна ширина в зависимост от честотата на въртене на магнита.

Е необходимо. Тези импулси трябва да се считат за PIC16F877 и записват броя на импулсите в PIC-а паметта.
Второто условие - това е необходимо, в зависимост от външната температура (как да се разчита, аз написах кода точка - използвайте DS18S20 енкодер) импулси да брои и записва броя на импулсите в различна област на паметта (както аз го разбирам, или не е възможно?) Самият алгоритъм както аз го разбирам: отчитане на температурата , импулси се броят до следващия температурата четене от температура стойност zavimosti - записано някъде микроконтролер и т.н. цикъл.

Проблем. Аз не съм добър в програмирането. На тази Моля, помогнете:
- при обяснението на алгоритъм за записване;
- примери за запис импулси в паметта на програмата;
- как тогава тези импулси се използват в математически изчисления.

Опитвам се да програмирате на C (използвайки microC Pro), моделирани в Протей.

Благодаря на всички ви предварително за разяснението!

Re: Как да се запише и да разчита на импулси в паметта на PIC16F877

Съобщение от lagent (Доклад 154369)

Имате задача. С датчик образувани SS443A импулси с различна ширина в зависимост от честотата на въртене на магнита.

Е необходимо. Тези импулси трябва да се считат за PIC16F877 и записват броя на импулсите в PIC-а паметта.
Второто условие - това е необходимо, в зависимост от външната температура (как да се разчита, аз написах кода точка - използвайте DS18S20 енкодер) импулси да брои и записва броя на импулсите в различна област на паметта (както аз го разбирам, или не е възможно?) Самият алгоритъм както аз го разбирам: отчитане на температурата , импулси се броят до следващия температурата четене от температура стойност zavimosti - записано някъде микроконтролер и т.н. цикъл.

Проблем. Аз не съм добър в програмирането. На тази Моля, помогнете:
- при обяснението на алгоритъм за записване;
- примери за запис импулси в паметта на програмата;
- как тогава тези импулси се използват в математически изчисления.

Опитвам се да програмирате на C (използвайки microC Pro), моделирани в Протей.

Благодаря на всички ви предварително за разяснението!

Някъде в микроконтролера.
Е, добре, по-добре да се обясни, че е необходимо да се направи събраните данни?

Re: Как да се запише и да разчита на импулси в паметта на PIC16F877

Съобщение от Еминем (Доклад 154385)

Някъде в микроконтролера.
Е, добре, по-добре да се обясни, че е необходимо да се направи събраните данни?

Ако знаех, че това, което част от паметта, и как да пишат. Аз не би написал "някъде".


Идеята е това. вземане на домашно метър вода с температурата на водата. Екранът показва общите водния дебит за различни температурни диапазони.

Имам няколко температурни диапазони - според тези граници е необходимо да се изчисли и запис в паметта на импулсите, и в точния момент: Можех да се предположи, че тези стойности от паметта.

Днес се опитвам да напиша една проста програма (по този microC Pro), която ще се считат за външни импулси и показва на LCD екрана.

// Комплект LCD-модул
sbit LCD_RS в RB4_bit;
sbit LCD_EN в RB5_bit;
sbit LCD_D4 в RB0_bit;
sbit LCD_D5 в RB1_bit;
sbit LCD_D6 в RB2_bit;
sbit LCD_D7 в RB3_bit;

sbit LCD_RS_Direction в TRISB4_bit;
sbit LCD_EN_Direction в TRISB5_bit;
sbit LCD_D4_Direction в TRISB0_bit;
sbit LCD_D5_Direction в TRISB1_bit;
sbit LCD_D6_Direction в TRISB2_bit;
sbit LCD_D7_Direction в TRISB3_bit;

Int cnt_tmp = 0;
дълго CNT = 0; // Counter
Int TMR1 = 0;

PORTB = 0xFF;
TRISB = 0xFF;

Lcd_Init (); // инициализира LCD-модул
Lcd_Cmd (_LCD_CLEAR); // ясен екран
Lcd_Cmd (_LCD_CURSOR_OFF); // деактивира курсора
Lcd_Out (1, 1, "SCHETCHIK:");

T1CON.TMR1ON = 1; // вкл. TMR1
T1CON.TMR1CS = 1; // външен часовник. сигнали
T1CON.T1SYNC = 1; // без синхронизирате външен takt.signal
T1CON.T1OSCEN = 0; // вкл. takt.generator TMR1

PIR1.TMR1IF = 0; // нулиране преливник прекъсват флаг TMR1
PIE1.TMR1IE = 1; // прекъсва от TMR1 оставя
INTCON.PEIE = 1; // Активиране всички прекъсва от периферията
INTCON.GIE = ​​1; // даде възможност на всички глобален прекъсване

CNT = 0; // Нула променливите
cnt_tmp = 0; // брояч


// основната линия
докато (1)
ако (RA1_bit) // Ако натиснете бутона за рестартиране
Delay_ms (40);
CNT = 0; // Нула променливите
cnt_tmp = 0; // брояч
TMR1 = 0;
>

ако (PIR1.TMR1IF PIE1.TMR1IE) // Ако таймерът
PIR1.TMR1IF = 0; // Clear флага
cnt_tmp ++; // нарастване на високо байт на брояча
>

// CNT = (дължина) (cnt_tmp * 65536) + TMR1;
CNT = (дължина) (cnt_tmp + TMR1);
// CNT = cnt_tmp + TMR1; // разгледа всички променливи
LongToStr (CNT, текст);
Lcd_Out (2, 1, текст);

Резултати. Той не иска да бъде разгледано.
Мисля, че проблемът е условието:

ако (PIR1.TMR1IF PIE1.TMR1IE) // Ако таймерът
PIR1.TMR1IF = 0; // Clear флага
cnt_tmp ++;
>

Опита в лист - да се прецени единствено условие: ако (PIR1.TMR1IF = 1). В резултат на това всички последователни вярва, дори когато няма пулс.

Кажи ми какво не е наред?

Освен това, сложих файла на проекта в Протей и код ми!

Благодаря предварително за вашата помощ!

Re: Как да се запише и да разчита на импулси в паметта на PIC16F877

Подобно на всички работи - импулси вярва прекъсване на обработката работи също.
Но има един въпрос. Защо понякога е 1 импулс изостава показанията на LCD екрана на показанията на метър, или обратното води до един импулс, или същите, както правилно. В това, което може да се окаже проблем, или е podhovi Протей?

// Комплект LCD-модул
sbit LCD_RS в RB4_bit;
sbit LCD_EN в RB5_bit;
sbit LCD_D4 в RB0_bit;
sbit LCD_D5 в RB1_bit;
sbit LCD_D6 в RB2_bit;
sbit LCD_D7 в RB3_bit;

sbit LCD_RS_Direction в TRISB4_bit;
sbit LCD_EN_Direction в TRISB5_bit;
sbit LCD_D4_Direction в TRISB0_bit;
sbit LCD_D5_Direction в TRISB1_bit;
sbit LCD_D6_Direction в TRISB2_bit;
sbit LCD_D7_Direction в TRISB3_bit;

овъгляване текст [10]; // кодови номера за борба
дълго cnt_tmp = 0; // да брои прекъсва
дълго CNT = 0; // контра импулси

PORTB = 0xFF;
TRISB = 0;

Lcd_Init (); // инициализира LCD-модул
Lcd_Cmd (_LCD_CLEAR); // ясен екран
Lcd_Cmd (_LCD_CURSOR_OFF); // деактивира курсора
Lcd_Out (1, 1, "SCHETCHIK:");

T1CON.TMR1ON = 1; // вкл. TMR1
T1CON.TMR1CS = 1; // външен часовник. сигнали
T1CON.T1SYNC = 1; // без синхронизирате външен takt.signal
T1CON.T1OSCEN = 0; // вкл. takt.generator TMR1

PIR1.TMR1IF = 0; // нулиране преливник прекъсват флаг TMR1
PIE1.TMR1IE = 1; // прекъсва от TMR1 оставя
INTCON.PEIE = 1; // Активиране всички прекъсва от периферията
INTCON.GIE = ​​1; // даде възможност на всички глобален прекъсване

TMR1L = 0b00000000; // нулиране TMR1
TMR1H = 0b00000000;

CNT = 0; // нулиране на променлива брояч
cnt_tmp = 0;

*************** // основната линия ***********************
докато (1) ако (RA1_bit) // Reset Button
Delay_ms (30);
CNT = 0; // нулиране на променлива брояч
cnt_tmp = 0;
TMR1L = 0b00000000; // нулиране TMR1
TMR1H = 0b00000000;
>

CNT = ((TMR1H<<8)+TMR1L)+(cnt_tmp*65536); // считать всё в переменную
LongToStr (CNT, текст);
Lcd_Out (2, 1, текст);

ако (PIR1.TMR1IF) // прекъсне TMR1
cnt_tmp ++; // увеличаване на променливата с 1
PIR1.TMR1IF = 0; // нулиране на флага
TMR1L = 0b00000000; // нулиране TMR1
TMR1H = 0b00000000;
>
>
>

И още един въпрос. Аз разбирам от предишни постове - аз може да записва само данни в EEPROM-паметта на микроконтролера или зададете отделна памет, няма други възможности?