Môže 16F877A urobiť?

C

crocklip

Guest
nazdar,

I am using PIC 16F877A --
Snažím sa nájsť obdobie signálu vstup pre vstup.Na to mám začať časovač (TMR0), kde platí vysoký vstupný pin prvýkrát.po 20 dôb vstupného signálu som zastaviť merač.Týmto spôsobom môžem rozdeliť hodnotu časovača v túto chvíľu o 20 a potom výsledok vynásobte dobu časovača.To by sa mi obdobie vstupného signálu ...Takže moja otázka je, či si PIC zvládnuť nasledujúci kód:

timer_time = (((0xff) * (overflow_acc) TMR0) * (1/0.000064));signal_period = (timer_time/20);

0.000064, kde je doba časovač (TMR0)

I'm using HI-TECH C kompilátor.

Any help by bolo skvelé,

Vďaka

 
Nazdar!
Myslím, že áno.Ale najlepší spôsob, ako zistiť, je to tak, aby simulovali kódu v MPLAB.Mimochodom prečo používate zachytiť porovnať modul contrller.Jednoducho uložte hodnoty 20 impulzov a pridať je získať celkový čas.
Pozdravy.

 
Hai,

Vyskúšajte si možnosť ČKS v PIC.To je najjednoduchší spôsob, ako nájsť časové obdobie medzi dvomi signálmi.Vyskúšajte si to

Pozdravy
Gopi

 
Hej,
Overil som si z modulu KS Číny, ktorá podporuje to, čo chcem robiť niečo, čo nie tam doesnt dovoľte mi použiť:
tam bude 6 rôznych vstupných signálov v Portbou, že musím ochutnať jeden po druhom, ale tam sú len dve porovnanie / zachytiť kolíkmi na PIC (CCP1, CCP2).

Každopádne som sa pokúsil simulovať programu pomocou vyššie uvedenej metódy, ale doesnt seem to byť schopný zvládnuť konkrétne linky.

Vďaka za pomoc

 
Nazdar!
Chcem ti niečo povedať, že vám pomôže.MPLAB, ak nie je simulácia, potom je veľká šanca, že to nebude fungovať, tak ako sa už stalo mne.Skúste lámanie rovnice do menších rovníc a pridajte výsledky získať výsledok pre úplné rovnice.Každopádne skúsiť svoje šťastie.
Pozdravy.

 
Všimol som si pár vecí o vašom kóde.Po prvé, máš na mysli použiť:

timer_time = (0x100 * overflow_acc TMR0) * 0.000064;

Ďalšie, zdá sa, že používate Prescaler z 64 na 4 MHz.Vy by ste byť presnejší, ak používate Prescaler 1 (pretože neviete, hodnotu v Prescaler).Samozrejme, budete musieť zvládnuť overflow_acc 64 krát častejšie.

Aj v prípade, timer_time je celé číslo a môžete vynásobiť 0.000064, ako navrhujem, budete voľné takmer všetky svoje presnosti.Niekedy vyjadrovať obdobia v nás?Je-li timer_time Reálnáhodnota, to nie je problém.

 
dobre, som použil 0xff, pretože keď sa to násobí pretečenie akumulátora výsledok bude skutočná výška času časovača cyklicky striedajú.0xff je najvyššia hodnota 8-bitov je prírastok do prasknutia.
Chcel by som byť viac ako šťastný, aby ste mohli písať / email krátkom programe, ak by vám pomôcť mne!
Vďaka zatiaľ

 
Myslím, že nie som pochopenie povahy vášho problému.

Predpokladám, že nasledujúce:

1.Váš kód preloží, ale dostanete podivný výsledok, keď simulovať.
2.Keď ste načasovanie, všetko pretečeniu TMR0 ste prírastok overflow_acc cez prerušenia alebo volebných TOIF alebo čokoľvek iného.
3.Čas potrebný k TMR0 pribúda, je jedným 0.000064 sekúnd (64 uS).

Ak je to ten prípad, potom je táto doba

doba (v krokoch časovač) = overflow_acc * 256 TMR0
čas (v sekundách) = čas (v krokoch časovač) * 0.000064 sekundy za prírastok
obdobie = čas (v sekundách) / 20

Môžete to urobiť v jednom riadku:

signal_period = (overflow_acc * 256 TMR0) * 0,000064 / 20;

Ak signal_period je celé číslo, navrhujem pořád signal_period v nás, aby mali by ste použiť:

signal_period = (overflow_acc * 256 TMR0) * 64 / 20;

Teraz, asi 255 (0xff) vs 256 (0x100).TMR0 pohybuje v rozmedzí od 0x00 až 0xff.Máte-li počet cyklov trvá pretečeniu dostanete 0x100 (0xff - 0x00 0x01).Predpokladajme, za druhé ste overflow_acc = 2 a TMR0 = 255.Použitie 255 * overflow_acc TMR0 dostanete 765.Teraz, lets prírastok ešte raz, aby pretečeniu TMR0 a my prírastku overflow_acc.Teraz máme overflow_acc = 3 a TMR0 = 0.Použitie 255 * overflow_acc TMR0 dostanete 765.Vidíte problém?

Dajte mi vedieť, ak sú moje predpoklady sú nesprávne.

 
Jon,

Ste na mieste s predpokladmi.Naozaj nevidím dôvod, prečo by nemala program simulovať správne a jeho bytia frustrujúce pre mňa príliš dlho.Program je vzorka frekvencie gitary reťazec a nastaviť jeden pin-li jeho príliš vysoké, a iné, ak jej príliš nízka, a to ako v prípade jej rovnaké.Myslím, že som mal jednoducho patria kód v tento post, aby bolo pre vás jednoduchšie.Na niektorých miestach som komentoval z predchádzajúcich kód, ktorý som používal pred Vaše námety tak jednoducho ignorovať, že veci.
Hope this can help,
vďaka

/ / Kód vzorky na vstupe gitary string (E)
/ /, Ktorého signál je vstup na pin RB1
/ / Ak frekvencia signálu je príliš vysoká, potom
/ / Rb0 ide vysoká.Je-li k nízkej RB2 ide vysoká.

# Include <pic.h>
# Include <htc.h>
# Include <math.h>
# Define TIMER_PERIOD 0.000064# Define E_STRING 110 / / frekvencia E string

# Define CENTER_COUNT 1/E_STRINGvolatile unsigned int overflow_acc;/ / Gitara vedomie span
/ / # # # # # # # # # #
/ / EF GA BC D EF GA BC DE
/ / 1 2 3 4 * 5 6
/ /
char blízkosti reload = 0;
/////////////// Rutinné servis pre časovač 0 prerušenia ////////////////////////
void prerušenia
timer0_isr (void)
(
if (reload == 0) (
/ / Vplyv zmien na Portbou vždy, keď sa dosiahne požadované našej doby.
/ / Poznámka: tento načasovanie bude obsahovať chybou.
overflow_acc ;
/ / Vplyv zmeny na Portbou
)
reload -;
T0IF = 0;
)
////////////////////////////////////////////////// ///////////////////////////////------------------------------------------------ ----------------------------
/ / Hlavná slučka
//------------------------------------------------ ----------------------------

int main (void)

(
//------------------------------
/ / Inicializácia
//------------------------------
double timer_time;
int signal_period;
int all_timer;
int pretečeniu;
unsigned int i;
TRISB = 2; / / RB1 je vstup
/ / Rb0 je výstupu, vysokej LED
/ / RB2 je výstupu, LED Low
RB1 = 0; / / bez pullups aktívny

T0CS = 0;
/ / PS2 = 1; / / nastavenie Prescaler do 1:64
/ / PS1 = 0, / /'''''''''' '
/ / PS0 = 1, / /'''''''''' '
/ / PSA = 0; / / SET Prescaler TO TMR0

TMR0IE = 1; / / povoliť prerušenie pre časovač pretečeniu
GIE = 1; / / globálne prerušenie povoliť

while (1)
if (RB1)
(break;)while (1)
(
overflow_acc = 0;
TMR0 = 0x00;
for (i = 0; i <20; aj )// cyklus až 20 dôb
(While (1)
if (! RB1)
(break;)
while (1)
if (RB1)
(break;)
)signal_period = (overflow_acc * 256 TMR0) * 64 / 20;
/ / Timer_time = (((0xff) * (overflow_acc) TMR0) * (TIMER_PERIOD));
/ /
/ /
/ / Pretečeniu = ((0xff) * (overflow_acc));
/ / All_timer = (pretečeniu TMR0 );
/ / Timer_time = ((all_timer) * (TIMER_PERIOD));

/ / Signal_period = (timer_time/20);

if (signal_period <= CENTER_COUNT)
Rb0 = 1;
if (signal_period> = CENTER_COUNT)
RB2 = 1;

)

)

 
Zmena

# Define CENTER_COUNT 1/E_STRING

do

# Define CENTER_COUNT 1000000/E_STRING

Potom skúste to.Tiež pomôcť s presnosťou, vymeňte

signal_period = ****

s

time_stop = TMR0;
signal_period = (overflow_acc * 256 time_stop) * 64/20;

time_stop môže byť unsigned byte.

Pre vašu aplikáciu, nemáte naozaj potreba toľko precízne ako signal_period sa dostanete, ale pravdepodobne bude fungovať aj napriek tomu.

Možno, že bude fungovať

 
Pôvodne som začínal simulácia výstup RB2 bude vysoká, bez ohľadu na vstupnej frekvencii.Teraz som dostať Rb0 vysoká bez ohľadu na to, čo.BTW 64us by nemala byť 1us pre časovač obdobie?(časovač freq = 1MHZ).
Rovnako som pomocou PIC simulator IDE a možno problém spočíva simulátore.Pôjdem do toho a program čip s tým, čo som si a uvidíme, čo sa stane.Vďaka za všetku pomoc.

 
Môžete použiť buď 1us alebo Prescaler 64.Dvaja sa navzájom vylučujú, takže čo robíte, je konzistentné v celom programe.

Páči sa mi vaša pôvodný kód, kde ste vymenoval konštanty (TIMER_PERIOD) atď

Krokom (alebo prestávku v rámci) si simuláciu a snažiť sa pochopiť, čo sa deje.

Veľa šťastia

 
Nazdar,

Snažil som sa kód s čipom a zahnutý to.Tentoraz sa však na rozdiel od simulátore, som vôbec žiadny výstup.Jestli to niekto dokáže zobraziť akýkoľvek problém s kódom by som sa rád počujem.
Kto to bol, kto povedal: "Ak experiment funguje, potom sa niečo pokazilo"?

 

Welcome to EDABoard.com

Sponsor

Back
Top