Forumul de micro-cip - modul de înregistrare și numărul de impulsuri în memoria PIC16F877
Cum de a înregistra și numărul de impulsuri în memoria PIC16F877
Ai o sarcină. Cu impulsurile SS443A senzor Hall format din diferite lățimi în funcție de frecvența de rotație a magnetului.
Este necesar. Aceste impulsuri trebuie să fie luate în considerare și înregistrează PIC16F877 numărul de impulsuri în PIC-o memorie.
A doua condiție - este necesar, în funcție de temperatura exterioară (cum să numere, am scris punctul de cod - utilizarea DS18S20 encoder) impulsuri pentru a număra și înregistrează numărul de impulsuri într-o zonă de memorie diferită (așa cum am înțeles sau nu este posibil?) Algoritmul în sine așa cum am înțeles: citirile de temperatura , impulsuri sunt numărate până când temperatura următoare citirea de la o valoare a temperaturii zavimosti - înregistrată undeva microcontroler, și așa mai departe ciclu.
Problemă. Nu sunt bun la programare. Pe acest ajutor, vă rugăm:
- în explicarea algoritm de înregistrare;
- exemple de impulsuri de înregistrare în memoria programului;
- modul în care sunt apoi utilizate aceste impulsuri în calcule matematice.
Încerc să program în C (folosind MicroC Pro), modelat în Proteus.
Va multumesc tuturor anticipat pentru clarificare!
Re: Cum de a înregistra și numărul de impulsuri în memoria PIC16F877
Mesaj din lagent (Raportul 154369)
Ai o sarcină. Cu impulsurile SS443A senzor Hall format din diferite lățimi în funcție de frecvența de rotație a magnetului.
Este necesar. Aceste impulsuri trebuie să fie luate în considerare și înregistrează PIC16F877 numărul de impulsuri în PIC-o memorie.
A doua condiție - este necesar, în funcție de temperatura exterioară (cum să numere, am scris punctul de cod - utilizarea DS18S20 encoder) impulsuri pentru a număra și înregistrează numărul de impulsuri într-o zonă de memorie diferită (așa cum am înțeles sau nu este posibil?) Algoritmul în sine așa cum am înțeles: citirile de temperatura , impulsuri sunt numărate până când temperatura următoare citirea de la o valoare a temperaturii zavimosti - înregistrată undeva microcontroler, și așa mai departe ciclu.
Problemă. Nu sunt bun la programare. Pe acest ajutor, vă rugăm:
- în explicarea algoritm de înregistrare;
- exemple de impulsuri de înregistrare în memoria programului;
- modul în care sunt apoi utilizate aceste impulsuri în calcule matematice.
Încerc să program în C (folosind MicroC Pro), modelat în Proteus.
Va multumesc tuturor anticipat pentru clarificare!
Undeva în microcontroler.
Ei bine, mai bine să explice că este necesar să se facă datele colectate?
Re: Cum de a înregistra și numărul de impulsuri în memoria PIC16F877
Mesaj din Eminem (Raportează 154385)
Undeva în microcontroler.
Ei bine, mai bine să explice că este necesar să se facă datele colectate?
Dacă aș fi știut ce zona de memorie, și cum să scrie. N-ar fi scris „undeva“.
Ideea este aceasta. făcând apometru de casă cu temperatura apei. Ecranul LCD afișează debitul total de apă pentru diferite intervale de temperatură.
Am mai multe domenii de temperatură - în funcție de aceste intervale, este necesar să se calculeze și să înregistreze în memoria impulsurilor, iar la momentul potrivit: Aș putea presupune că aceste valori din memorie.
Astăzi, încercând să scrie un program simplu (în a face MicroC Pro), care ar fi considerate impulsuri externe și afișate pe ecranul LCD.
// Set LCD modul
sbit LCD_RS la RB4_bit;
sbit LCD_EN la RB5_bit;
sbit LCD_D4 la RB0_bit;
sbit LCD_D5 la RB1_bit;
sbit LCD_D6 la RB2_bit;
sbit LCD_D7 la RB3_bit;
LCD_RS_Direction sbit la TRISB4_bit;
LCD_EN_Direction sbit la TRISB5_bit;
LCD_D4_Direction sbit la TRISB0_bit;
LCD_D5_Direction sbit la TRISB1_bit;
LCD_D6_Direction sbit la TRISB2_bit;
LCD_D7_Direction sbit la TRISB3_bit;
int cnt_tmp = 0;
cnt lung = 0; // Counter
int TMR1 = 0;
PORTB = 0xFF;
TRISB = 0xFF;
Lcd_Init (); // inițializează LCD modul
Lcd_Cmd (_LCD_CLEAR); // ecran clar
Lcd_Cmd (_LCD_CURSOR_OFF); // dezactiveze cursorul
Lcd_Out (1, 1, "SCHETCHIK:");
T1CON.TMR1ON = 1; // incl. TMR1
T1CON.TMR1CS = 1; // ceas extern. semnalele
T1CON.T1SYNC = 1; // nu sincronizați takt.signal extern
T1CON.T1OSCEN = 0; // incl. takt.generator TMR1
PIR1.TMR1IF = 0; // reseta Overflow pavilion întrerupere TMR1
PIE1.TMR1IE = 1; // întrerupe din TMR1 permis
INTCON.PEIE = 1; // Activați toate întreruperile de la periferie
INTCON.GIE = 1; // Activați toate întrerupere la nivel mondial
cnt = 0; // Zero variabilele
cnt_tmp = 0; // counter
// bucla principală
în timp ce (1)
în cazul în care (RA1_bit) // Dacă apăsați butonul de resetare
Delay_ms (40);
cnt = 0; // Zero variabilele
cnt_tmp = 0; // counter
TMR1 = 0;
>
în cazul în care (PIR1.TMR1IF PIE1.TMR1IE) // Dacă temporizatorul
PIR1.TMR1IF = 0; // reseteaza fanionul
cnt_tmp ++; // incrementa octetul ridicat al contorului
>
// cnt = (long) (cnt_tmp * 65536) + TMR1;
cnt = (long) (cnt_tmp + TMR1);
// cnt = cnt_tmp + TMR1; // ia în considerare toate variabilă
LongToStr (cnt, text);
Lcd_Out (2, 1, text);
Rezultat. El nu vrea să fie luate în considerare.
Cred că problema este condiția:
în cazul în care (PIR1.TMR1IF PIE1.TMR1IE) // Dacă temporizatorul
PIR1.TMR1IF = 0; // reseteaza fanionul
cnt_tmp ++;
>
A încercat în foaie de date - ia în considerare numai condiție: dacă (PIR1.TMR1IF = 1). Ca urmare, toate consecutiv crede chiar și atunci când nu există nici un puls.
Spune-mi ce sa întâmplat?
În plus, am pus dosarul de proiect în Proteus și codul meu!
Multumesc anticipat pentru ajutor!
Re: Cum de a înregistra și numărul de impulsuri în memoria PIC16F877
La fel ca toate lucrările - impulsuri consideră întrerupere de prelucrare funcționează prea.
Dar există o întrebare. De ce este, uneori, un puls de 1 lag-uri citirile de pe ecranul LCD al citirilor contorului, sau invers conduce la un impuls, sau la fel ca ceea ce trebuie. În ceea ce poate fi problema, sau este podhovi Proteus?
// Set LCD modul
sbit LCD_RS la RB4_bit;
sbit LCD_EN la RB5_bit;
sbit LCD_D4 la RB0_bit;
sbit LCD_D5 la RB1_bit;
sbit LCD_D6 la RB2_bit;
sbit LCD_D7 la RB3_bit;
LCD_RS_Direction sbit la TRISB4_bit;
LCD_EN_Direction sbit la TRISB5_bit;
LCD_D4_Direction sbit la TRISB0_bit;
LCD_D5_Direction sbit la TRISB1_bit;
LCD_D6_Direction sbit la TRISB2_bit;
LCD_D7_Direction sbit la TRISB3_bit;
char textul [10]; // numere de cod pentru a contracara
cnt_tmp lung = 0; // pentru a conta întrerupe
cnt lung = 0; // impulsurile contra
PORTB = 0xFF;
TRISB = 0;
Lcd_Init (); // inițializează LCD modul
Lcd_Cmd (_LCD_CLEAR); // ecran clar
Lcd_Cmd (_LCD_CURSOR_OFF); // dezactiveze cursorul
Lcd_Out (1, 1, "SCHETCHIK:");
T1CON.TMR1ON = 1; // incl. TMR1
T1CON.TMR1CS = 1; // ceas extern. semnalele
T1CON.T1SYNC = 1; // nu sincronizați takt.signal extern
T1CON.T1OSCEN = 0; // incl. takt.generator TMR1
PIR1.TMR1IF = 0; // reseta Overflow pavilion întrerupere TMR1
PIE1.TMR1IE = 1; // întrerupe din TMR1 permis
INTCON.PEIE = 1; // Activați toate întreruperile de la periferie
INTCON.GIE = 1; // Activați toate întrerupere la nivel mondial
TMR1L = 0b00000000; // reset TMR1
TMR1H = 0b00000000;
cnt = 0; // resetați contorul variabilă
cnt_tmp = 0;
*************** // bucla principală ***********************
în timp ce (1) în cazul în care (RA1_bit) // Buton Reset
Delay_ms (30);
cnt = 0; // resetați contorul variabilă
cnt_tmp = 0;
TMR1L = 0b00000000; // reset TMR1
TMR1H = 0b00000000;
>
cnt = ((TMR1H<<8)+TMR1L)+(cnt_tmp*65536); // считать всё в переменную
LongToStr (cnt, text);
Lcd_Out (2, 1, text);
if (PIR1.TMR1IF) // întrerupe TMR1
cnt_tmp ++; // crește variabila de 1
PIR1.TMR1IF = 0; // pavilion resetare
TMR1L = 0b00000000; // reset TMR1
TMR1H = 0b00000000;
>
>
>
Și o altă întrebare. Am înțeles de la posturile anterioare - Nu pot înregistra numai date în EEPROM-memoria microcontrolerului sau pentru a seta o memorie separată, alte opțiuni?