Отговори на тема  [ 66 мнения ]  Отиди на страница Предишна  1, 2, 3, 4, 5  Следваща
PIC на 4.194304MHz ? 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Цитат:
#INT_TIMER1
void Tmr1Handler(void) {
static int8 counter = 128, r;

TMR1H = 0xFF; // interrupt every 7.8125s ( for 64Hz LCD refresh rate )
TMR1IF = 0;


Това дали ще ти зареди таймера? На 18-ките таймерите (без таймер2) се зареждат при запис в TMR0L. Преди това трябва да се зареди старшия байт. Тука не виждам токова нещо. Може би заради това ти греши. А може и аз да не съм видял нещо...


Пет Сеп 16, 2005 8:33 pm
Профил ICQ
Ранг: Напреднал
Ранг: Напреднал

Регистриран на: Нед Авг 14, 2005 1:08 pm
Мнения: 433
Местоположение: Казанлък
Мнение 
Pirev Gogo e prav ti napravo mi razbi ponjatieto za prekusvane na tmr1 s 32768 kvarc kak taka shte ti gubi na 2-3 4asa 2-3 min imam si 4asovni4e s takuv kvarc na mesec mi dava -1-2 min razlika ama na mesec ne na 2-3 4asa ajde opravi si softa i stiga ste pluli po PIC ne sa tooooolkova loshi imat si problemi ama 4ak puk takiva :oops: :D


Пет Сеп 16, 2005 9:22 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Без да се сърдите, ама и 2-мата не четете документацията за процесорите :D . Може и програмния код да не сте разгледали добре. Когато е вдигнат бит 7 на T1CON, тогава TMR1 се разглежда като 16-битов таймер, като първо се чете/записва TMR1H, след което по време на четене/запис на TMR1L се прехвърля от временния буфер на TMR1H и реалната ст-ст на TMR1H, т.е. получава се 16-битово четене, без да се налага допълнителна проверка, дали по време на четенето на TMR1L не се е променила ст-ста на TMR1H. Това важи за PIC18 серията. Ако обаче бит 7 на T1CON си е в 0, то четенето/писането на TMR1 си е както при PIC16, т.е. моят код си работи та пушек се вдига. Прочетете и 80233a.pdf, преди да хвалите MicroChip. Там самите "мастори" на професорите си описват, защо TMR1 изостава, когато се използва с външен кварц. Ако презаредиш TMR1H след първите 15-тина us, след възникването на прекъсването, TMR1L изпуска тактовите сигнали на кварцовия осцилатор. Ако прекъсването ти е на 1 секунда, нормално е да не се забележи, но когато ти е на 7.8125ms, можете да си представите защо за 2-3 часа, часовника изостава с 2-3 минути. Ако сте си правили часовник с този таймер, просто го направете да генерира прекъсване на 7.8125ms ( до 1 секунда ще Ви трябва и софтуерен брояч на 128 ), правете закъснение от 20-тина микросекунди, преди да презаредите TMR1H и сами ще се убедите в това. При мен забавянето на презареждането на TMR1H се получава, защото имам още 2 прекъсвания, които изяждат тези 15-тина микросекунди.
Хайде наслука, друг път четете по-внимателно документацията :D

P.P. Оппа, до една секунда с прекъсване през 7.8125ms трябва да имате брояч на 256.
П.П. Последно, вярното е 128. Sorry.


Последна промяна на Съб Сеп 17, 2005 1:00 pm, променена общо 1 път



Пет Сеп 16, 2005 9:44 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Прав си Пирев,
Е на това:
Цитат:
T1CON = 0b00001110; // 1:1 prescaler, do not synchronize, external clock from crystal
// two 8-bit registers

не съм му обърнал внимание...


Съб Сеп 17, 2005 10:51 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
Ako si namerish KVARC(32768) a ne kvarcov REZONATOR - moje i da stane....


Съб Сеп 17, 2005 11:14 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Пирев, не ми се смей, ама аз пак не разбрах защо имаш такъв проблем. По-точно, какво налага ползването на 16-битов брояч? Не става ли с прескелер и 8-битов? За 256 даже не е необходим прескалер. А за 1 секунда си правиш един софт брояч до колкото трябва. Всякакви проблеми с латентности и приоритети отпадат. Правил съм такова нещо с ПИК 16 и никакви проблеми не съм имал. Часовникът върви толкова точно, колкото е точен кристалът. Проблем може да възникне само, ако не можеш да облужиш прекъсването за 7 милисекунди, ама това е друг проблем.


Съб Сеп 17, 2005 11:56 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
TheWizard написа:
Ako si namerish KVARC(32768) a ne kvarcov REZONATOR - moje i da stane....

От постовете ми е от ясно по-ясно ,че работя с кварцов кристал 32.748 kHz, от Комет Електроникс. Явлението с изоставането на часовника, не зависи от това дали използваш кварц, резонатор или външен тактков сигнал !


Съб Сеп 17, 2005 12:03 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Авг 31, 2005 1:57 pm
Мнения: 1103
Мнение 
Pirev е изключително прав аз още преи 20тина поста казах че ще има проблеми ако правим часовник....... Не знам колко изцяло завършени устройства имате тези които постване но аз имам десетки така че не е достатъчно просто да подкараш някакво си прекъсване или част от програма когато се завърши цялото устройство може да се каже да направих ги и свичко е ОК ----> иначе си е чисто 4ешане на езика :lol:


Съб Сеп 17, 2005 12:13 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
bateAz написа:
Пирев, не ми се смей, ама аз пак не разбрах защо имаш такъв проблем. По-точно, какво налага ползването на 16-битов брояч? Не става ли с прескелер и 8-битов? За 256 даже не е необходим прескалер. А за 1 секунда си правиш един софт брояч до колкото трябва. Всякакви проблеми с латентности и приоритети отпадат. Правил съм такова нещо с ПИК 16 и никакви проблеми не съм имал. Часовникът върви толкова точно, колкото е точен кристалът. Проблем може да възникне само, ако не можеш да облужиш прекъсването за 7 милисекунди, ама това е друг проблем.

prescaler нямам, т.е. има си но е 1:1. Проблема е че искам да използвам sleep режима на процесора, като на TMR1 да ми са навързани часовник реално време + динамично управление на LCD 4-ри разредна индикация. Правя си TMR1 за прекъсване на 7.8125ms, което за електрода Back Plane на LCD-то си е честота 64 Hz ( две прекъсвания правят един период за LCD-то ), след което със брояч си отчитам 1 секунда. И аз си мислех, че проблем няма да има, тъй като след прекъсването на TMR1 имам точно 7.8125ms преди да му презаредя TMR1H. Но проблем има, защото от MicroChip казват, че след възникване на прекъсването от TMR1, а то възниквало на предния фронт на сигнала от 32.768 kHz, трябвало още преди да дойде следващото високо ниво на сигнала 32.768 kHz да бъде презареден TMR1, независимо дали ще пипаш само TMR1H или и TMR1L. Ако презаредиш TMR1 след този импулс, TMR1L си променял съдържането, като пропускал импулси от 32.768kHz, което си е точно изоставянето на часовника, за справка документ http://ww1.microchip.com/downloads/en/D ... 80233a.pdf ,страница 2.
При положние, че работя с основна тактова честота от 2.45MHz, или една инструкция ми е 1.632 us, а трябва най-късно до следващия високо плато на импулса от 32.768kHz да презаредя TMR1, е ясно, че дори да нямам други прекъсвания, пак няма да смогна, защото имам и няколко инструкции, с които се запазва стека, прави се проверка откъде е прекъсването и т.н.
Като вдигна основната честота над 4MHz и нямам други прекъсвания, проблем няма, работи си точно,защото имам време да реагирам. Само че на мен не ми трябва по-висока честата, поради съображения за консумация ( процесора се храни от батерия ). Реших да използвам възможността за приоритетите в прекъсванията, обаче се оказа, че и там има проблеми ( препълване на стека ! ) . После реших да използвам сигнала от TMR1 като основен, което е една възможност на PIC18F252, обаче и там има бъг, при който бъг вместо да ми падне консумацията, тя се увеличи. Въобще къде пипна по тоя процесор все нещо изниква.

Проблема засяга следните процесори: ( тъй като PDF документа е заключен и не мога да направя Copy/Paste списъка е в jpg формат )


Прикачени файлове:
pic16_pic18_tmr1_ext_clk_errata.jpg
pic16_pic18_tmr1_ext_clk_errata.jpg [ 156.81 KiB | Прегледано 3331 пъти ]


Последна промяна на Съб Сеп 17, 2005 12:57 pm, променена общо 2 пъти

Съб Сеп 17, 2005 12:27 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
void isrhandler(void)
{
_asm goto isr _endasm
}
#pragma code

void isr(void){ //T1_16BIT_RW 16-bit mode
static unsigned char counter = 128;
WriteTimer1(0xFF27); // 7.812500
PIR1bits.TMR1IF=0;
if( --counter ) return;
counter = 128;
}


Съб Сеп 17, 2005 12:51 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
void isrhandler(void)
{
_asm goto isr _endasm
}
#pragma code

void isr(void){//T1_8BIT_RW 8-bit mode
static unsigned char counter = 128;
WriteTimer1(0xFF00); // 8.941650
PIR1bits.TMR1IF=0;
if( --counter ) return;
counter = 128;
}


Съб Сеп 17, 2005 12:53 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
TheWizard написа:
void isrhandler(void)
{
_asm goto isr _endasm
}
#pragma code

void isr(void){//T1_8BIT_RW 8-bit mode
static unsigned char counter = 128;
WriteTimer1(0xFF00); // 8.941650
PIR1bits.TMR1IF=0;
if( --counter ) return;
counter = 128;
}


Съгласен съм ( без бой ), само че добави delay_us(20) така:
Код:
void isrhandler(void)
{
_asm goto isr _endasm
}
#pragma code

void isr(void){//T1_8BIT_RW 8-bit mode
static unsigned char counter = 128;

delay_us(20);

WriteTimer1(0xFF00); // 8.941650
PIR1bits.TMR1IF=0;
if( --counter ) return;
counter = 128;
}

и сподели после какво става :D


Съб Сеп 17, 2005 12:56 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
v momenta me myrzi da si analiziram sorsa - gorniia
Prosto go napisah i go zasiakoh s Debugera - StopWatch

Neshto greshkata ti e s prezarejdaneto na TMR0 = 0xFF00 vs 0xFF27


Съб Сеп 17, 2005 12:59 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
TheWizard написа:
v momenta me myrzi da si analiziram sorsa - gorniia
Prosto go napisah i go zasiakoh s Debugera - StopWatch

Neshto greshkata ti e s prezarejdaneto na TMR0 = 0xFF00 vs 0xFF27

Нямам никъде зареждане с 0xFF27 ! Имам зареждане на TMR1H само с 0xFF, тъй като ако правя презареждане на TMR1L, а се замотавам из другите прекъсвания, ще получа още по-голяма неточност.
Тъй като виждам, че все още не ми вярвате, прочетете http://ww1.microchip.com/downloads/en/D ... 80233a.pdf . Там MicroChip си признават ...
На симулатора няма как да имитираш реалните условия и бъговете в процесора. И аз като пусна моят си код през симулатора всичко си работи.


Съб Сеп 17, 2005 1:04 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
ami s 0xFF00 INTa ti e na 8.941650 mS
sys 0xFF27 INTa ti e na 7.812500 mS

VIJ: pusni si debugera s F = 4*32768
napravi TMR1 da e ot internal
sloji Breakpointers i ako ne viarvash - meri.....


Съб Сеп 17, 2005 1:08 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 66 мнения ]  Отиди на страница Предишна  1, 2, 3, 4, 5  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни