Založen: Nov 11, 2015 Příspěvky: 107 Bydliště: Ostrava
Zaslal: út březen 01 2016, 10:02 Předmět: PIC18F a časování 1s s Timer0
Ahoj ,kdysi jsem si koupil PICKIT3 tak jsem ho chtěl ,až teď otestovat...
Začetl jsem se do knihy C pro mikrokontroléry PIC od Davida Matouška.
Tam popisuje jak udělat blikání s LED.
Problém je v tom že to popisuje s jiným mcu ,který má interní oscilátor.
a to tak že nastaví OSCCON =0b01110011 .
////////////////////////////////
otázka 1,Tady tkví první problém používám PIC18F452 a ten má jen
extrení oscilátor ,mám tam 4 MHz krystal-HS mode budu šahat při nastavení do OSCCONu?
////////////////////////////////
otázka 2, V knize se popisuje nastavení předděličky.... k tomu se se dělí knitočtem interního oscilátoru v knize 8Mhz /4 =2 mhz to znamená 0,5s je perioda.
Budu i ten kmitočet externího krystalu připojeného k PIC dělit 4 ?
////////////////////////////////
otázka 3, Z výše uvedené věty je zřejmé že budeme potřebovat 1 000 000 impulzů.
Jak proboha k tomu přišel to vycházelo jedině 2Mhz * 0,5s atohle nevím co je jak to nazvat co vlastně počítal atd.
Dále se v knize odhadne že 65536 x 16 = 1 048 576 , protože máme 16 bitovou šíři Timeru0 a nastavená předdělička je 16 to znamená nejbližší výsledek impulzů nebo co to je?
///A pak se řekne že 1 000 000 /16 = 62500 - tohle chápu.
////////////////////////////////
Dále se vydělí 8Mhz/4=2, 2Mhz/16 =125 Khz >>> T = 0,000008 s
Dále 0,5/0,000008 = 62500 impulzů
65536-62500 = 3036
A toto číslo se vloží do TMR0L a TMR0H aby mohl přetéct
////////////////////////////////
Zájímá mě tenhle ten postup, potřeboval bych objasnit Nastavení a výpočet ...díky doufám že se tu najde někdo přes PIC 18F.
Chtěl bych si nastavit třeba jedna sekunda a nebo libovolný čas pomocí Timer0.
kód:
#include <p18cxxx.h>
#pragma config OSC = INTIO2
#pragma config WDT = OFF
Viděl bych to asi takto:
OSCCON pouze přepíná zdroj pro systémové hodiny - a to mezi hlavním oscilátorem a Timerem1. Nezáleží tedy na tom, zdali máš interní nebo externí oscilátor. Já osobně bych toto nastavení ponechal podle původního článku.
Standardně trvá jedna instrukce procesoru 4 takty oscilátoru, proto to dělení 4. Když máš oscilátor 4MHz, tak procesor provede 1 milion instrukcí za sekundu. Tím samozřejmě myslím instrukce, které trvají jeden takt procesoru (= 4 takty oscilátoru). Některé instrukce podprogramů mohou trvat dva takty a některé instrukce rozhodování mohou trvat jeden nebo dva takty - viz tady (strana 9): http://asix.cz/download/museum/other/pic_krok_za_krokem.pdf
Takže když chceš blikat v rytmu jedné sekundy, potřebuješ udělat buď:
1. cyklus, počet opakování třeba 250 000 (když bude mít jedna iterace cyklu 4 instrukce)
nebo
2. nastavit přerušení časovače tak, aby proběhlo vždy po jedně sekundě
Výhodou prvního řešení je teoretická jednoduchost, ale program se v tu chvíli "zastaví" a bude čekat.
Výhodou druhého řešení, které je jistě profesionálnější, je to, že program si dál vesele běží, uživatel může mačkat tlačítka, displej zobrazuje znaky a jednou za sekundu se provede obsloužení od časovače. Ale to je pár instrukcí takže nikdo ani nepozná, že se to provedlo.
Založen: Nov 11, 2015 Příspěvky: 107 Bydliště: Ostrava
Zaslal: út březen 01 2016, 14:30 Předmět:
Zkoušel jsem to zkuste někdo prosím udělat výpočet pro 4 Mhz oscilátor...
1.bod zkoušel jsem dát do smyčky for hodnotu 250 000 a ani trochu se to nepřibližuje intervalu jedné sekundy....
co se trošku přibližuje je for
kód:
(i = 0; i < 62500; i++)
v knize v originálu bylo 50 000 zajímalo by mě jak se k tomu došlo...
tady asi dělám chybu že počítám s předdeličkou
2. který výpočet je správný v mém případě pro TIMER0 ?
kód:
// TCY = 4/FOSC = 4/48MHz ~= 83.33 ns.
Timer increments every 83.33 ns * prescaler = 83.88 ns * 256 = 21.33 us // So, for a half second delay, the timer value would be .5/(21.33 uS) ~= 23441.
takže lets do the math
v knize je 62500
používá se interní oscilátor 8Mhz dělička je 16 blikání 0,5 s
8/4 = 2
perioda = 0,5 us
0,5 us * 16 = 8 us
0,5/8us = 62500
něco takového jsem myslel
ještě vědět jak určit správně pro smyčku for 62500 tam odpovídá tak okolo 1sekundy.
Proč výpočet na téhle stránce má 2x nasobení předděličkou ,
myslím to Overflow Period .
Založen: Nov 11, 2015 Příspěvky: 107 Bydliště: Ostrava
Zaslal: út březen 01 2016, 16:51 Předmět:
už to šlape ,přibližně přesně tady poslílám program na posouzení
na ten OSCON jsem nešahal podle mě tam ani není je to jen pro interní oscilátor ,aspoň jsi to myslím - v datasheetu PIC18F452 se o něm nepíše.
kód:
#include<xc.h>
#pragma config OSC = HS
//#pragma config FCMEN = OFF // OR this way
//#pragma config BORV = 3
#pragma config WDT = OFF
#pragma config LVP = OFF
//#pragma config CPB = OFF
//#pragma config CPD = OFF
Založen: Sep 28, 2005 Příspěvky: 1312 Bydliště: ZČ + JM
Zaslal: út březen 01 2016, 19:51 Předmět:
citace:
Proč výpočet na téhle stránce má 2x nasobení předděličkou ,
myslím to Overflow Period .
A není to náhodou jednou dělička 256 a podruhé 256 tiků, než přeteče timer?
20MHz xtal, hodiny pro timer jsou 4x pomalejší (tedy 5MHz), děličkou 256 se dostaneme na 5MHz/256=19531Hz, takže se jednička do timeru přičítá touto rychlostí. Timer přeteče když napočítá 256 svých tiků, tedy vyvolá přerušení s frekvencí 19531/256=76Hz. Takže když napočítám 76 přerušení, mám asi sekundu. _________________ Kampaň, účelovka, nepodepsal, Palermo, ODS, Kalousek, je líp a jsou na to čísla, nastudujte si to.
Mě by jen zajímalo proč to řešíš tak problematicky. Pokud se použije HW timer,tak je možnost v přerušení řešit globální proměnou ,kdy na její stav se čeká v hlavní smyčce,případně tu část kódu řešit přímo v přerušení a v hlavní smyčce zpráv zpracovávat něco jinýho.
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.