Форум микрочип - как да се запише и да разчита на импулси в памет 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-паметта на микроконтролера или зададете отделна памет, няма други възможности?