Sari la conținut
ELFORUM - Forumul electronistilor

Timer ore minute


coco243

Postări Recomandate

Salut,

 

Vreau sa realizez un timer de 24h.

Am: pic 18f2455 cu un oscilator de 20MHz

Dupa caluclele mele am o perioada a clock-ului de 0.2us

Daca folosesc TMR0 pe 16 biti am maxim 65536 de clock-uri pana se reseteaza TIMER-ul

Si ma gandesc sa folosesc un prescaler de 256 si o sa am:

 

 

65536de clock-uri x 0.2us x 256 = 3 355 443 us adica 3 secunde si ceva

 

Daca e bine pana aici, cum merg mai departe?

 

 

Multumesc,

Link spre comentariu
  • Răspunsuri 11
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • coco243

    4

  • mars01

    4

  • Bandi Szasz

    2

  • danpin

    1

Top autori în acest subiect

Poti obtine 1.0000128s cu urmatoarele setari 

T0CON = 0x86;TMR0H = 0x67;TMR0L = 0x69;

 

Calculezi cat inseamna 24h in secunde si la fiecare intrerupere decrementezi cu 1s cand ai ajuns la 0 inseamna ca a trecut timpul setat si faci operatia pe care il doresti.

Editat de bandi12
Link spre comentariu

Salut!

 

Mikroelectronica are un soft free foarte util numit Timer calculator. Il gasesti aici: http://www.mikroe.com/timer-calculator/

 

Conform acestui mic softulet, pentru a obtine o intrerupere pt un PIC seria 18F la fiecare, sa zicem 100ms, trebuie sa introduci in cod urmatoarele (presupun ca folosesti C):

//Timer0//Prescaler 1:8; TMR0 Preload = 3036; Actual Interrupt Time : 100 ms //Place/Copy this part in declaration sectionvoid InitTimer0(){  T0CON	 = 0x82;  TMR0H	 = 0x0B;  TMR0L	 = 0xDC;  GIE_bit	 = 1;  TMR0IE_bit	 = 1;} void Interrupt(){  if (TMR0IF_bit){     TMR0IF_bit = 0;    TMR0H = 0x0B;    TMR0L= 0xDC;    //Enter your code here  }} 

Functie de ce compilator folosesti, denumirile gen: GIE_bit sau TMR0IF_bit etc pot sa difere. Dar intelegi ideea.

 

Acum, partea unde scrie: 

//Enter your code here

se va executa odata la fiecare 100ms (pentru ca asa am setat Timer0 in functia InitTimer0().

 

Daca aici incrementezi o variabila de tip LONG (aceasta fie locala dar cu calificativul STATIC, fie este gloabala), poti sa pui o conditie ca atunci cand incrementarea ajunge la o valoare anume multiplu de 100ms (constanta sau poate fi o variabila globala de tip volatile) sa se seteze o variabila globala gen flag.

Cand aceasta variabila flag devine 1 (adica setata), fiindca ea va fi permanent testata in bucla principala, va genera in urma testarii un efect. gen aprinzi un LED, pornesti o goarna, activezi un releu etc.

Editat de mars01
Link spre comentariu

Va mutlumesc pentru informatii.

O sa incerc sa transform codul din C in ASM, deoarece sunt la inceput cu microcontrolerele si cred ca in limbaj de asamblare o sa le inteleg mai bine pt inceput.

Trec la treaba si daca ma impotmolesc revin.

 

multumesc

Link spre comentariu

Intuitia imi spune ca daca vreau sa stapanesc bine microcontrolerele trebuie sa stiu assembler, adica asa cred ca rebuie sa o iau, de la ASM. Mie unul mi se pare mai logic ASM-ul, citesti instruction set din datasheet si aplici. Poate nu am cautat eu destul de mult despre sintaxa programarii microcontrolerelor in C si de aceea mi se pare mai

accesibil asm-ul. In C nu am gasit documentatie care sa-mi spuna cum anume sa adresez registrii, sa setez biti, pragma-urile alea, etc dar ma gandesc ca prima data trebuie

sa invat sa controlez microcontrollerul in asm si sa trec dupa aceea la C. Daca gresesc va rog sa mi spuneti.

Link spre comentariu

"In C nu am gasit documentatie care sa-mi spuna cum anume sa adresez registrii, sa setez biti, pragma-urile alea, etc dar ma gandesc ca prima data trebuie sa invat sa controlez microcontrollerul in asm si sa trec dupa aceea la C"

 

Cauta pe net:

Advanced PIC Microcontroller Projects in C From USB to RTOS with the PIC18F Series    Author: Dogan Ibrahim

Embedded C programming-techniques and applications of C and pic mcus                       Author: Mark Siegesmund

MikroC manual    Mikroe

MikroC PRO for PIC Manual Mikroe

PIC Microcontroller and Embedded Systems  Author: Muhammad Ali Mazidi. Rolin D. McKinlay. Danny Causey

PIC Microcontrollers - Programming in C Author: Milan Verle

PIC Microcontrollers   Author: Milan Verle

Programming 8-Bit PIC Micro Controllers in C      Author: Martin Bates

 

Spor la citit!

Editat de danpin
Link spre comentariu

Si nu in ultimul rand, foaia tehnica a controlerului folosit. Asa - numitul datasheet.

 

Acum ca nu prea stii despre ce este vorba pare mai usor ASM-ul. Dar de indata ce va trebui facut un proiect mai complicat o sa iasa peri albi si o sa consume mult timp.

Link spre comentariu

Multumesc pentru documentatie si opinii.

 

Am puricat putin topicul acela " invat programare de la 0" si MPLAB® XC8 C Compiler User’s Guide.

Am gasit intr-un final in topic setarea asta: #define _XTAL_FREQ 20000000, pusa asa ca paranteza, iar in documentatie (MPLAB® XC8 C Compiler User’s Guide) am gasit la search doar de  2 ori _XTAL_FREQ

fara explicatii, deci dupa mine e cam greu sa-ti dai seama despre __delay_ms(x). de aia mi se pare mie mai greu de gasit logica microcontrolerului in C. Deci intre #define _XTAL_FREQ 20000000 si __delay_ms(x) nu prea vad cum sa gasesti o logica fara sa fi ciit ceva despre TMR0, care e FFFF pe 16 biti si daca imparti frecv oscilatorului

la FFFF iti da tosc si asa mai departe. Sper sa nu fiu eu capos si sa ma cramponez, dar am gasit mai logic ASM-ul, cu timpul poate reusesc sa invat cum sa inclin balanta.

 

Si inca o intrebare: la un oscilator de 20MHZ si cu TMR0 pe 16 biti parca ai vreo 3 secunde si ceva pana la intrerupere, daca pui spre ex  _delay_ms(4000) ce se intampla,

chiar apare o intarziere se 4s?  se respecta? Avand in vedere ca depaseste numaru de cicluri ce le poate numara TMR0.

 

 

Sper sa nu par ciudat doar vreau sa vad si eu pe unde ma aflu si incotro sa o iau.

Multumesc,

Editat de coco243
Link spre comentariu

Am gasit intr-un final in topic setarea asta: #define _XTAL_FREQ 20000000, pusa asa ca paranteza, iar in documentatie (MPLAB® XC8 C Compiler User’s Guide) am gasit la search doar de  2 ori _XTAL_FREQ

 

Pai este simplu.

 

In manual se spune clar ca functia (de fapt un macro adica o grupare de instructiuni) __delay_ms() are nevoie sa stie care este frecventa de lucru a controllerului.

Compilatorul nu are de unde sa stie ce frecventa veti folosi (ce cuartz etc) daca nu ii spunem.

 

Iar linia:

#define _XTAL_FREQ 20000000

ii spune ca atunci cand face preprocesarea oriunde da de cuvantul cheie _XTAL_FREQ sa il inlocuiasca cu 20000000. iar acest numar 20000000 este folosit de functia _delay_ms(val_delay) ca sa afle cate instructiuni NOP sa execute pentru a obtine un delay cu valoarea 'val_delay' milisecunde.

 

deci dupa mine e cam greu sa-ti dai seama despre __delay_ms(x)

 

In manual scrie clar la pagina 330 ce face functia __delay_ms(x):

Posted Image

 
 
Deci intre #define_XTAL_FREQ 20000000 si __delay_ms(x) nu prea vad cum sa gasesti o logica fara sa fi ciit ceva despre TMR0, care e FFFF pe 16 biti si daca imparti frecv oscilatorului la FFFF iti da tosc si asa mai departe
 
Tosc se obtine asa:
Tosc = 1/Fosc
unde Fosc este frecventa de lucru a controllerului.
 
Daca se imparte Tosc la 0xFFFF se obtine intervalul de timp al unui rollover mai precis la un Fosc = 20MHz, timerul pe 16 biti are un rollover (revine la valoarea zero) la  fiecare 3,27675 ms.

 

 

Si inca o intrebare: la un oscilator de 20MHZ si cu TMR0 pe 16 biti parca ai vreo 3 secunde si ceva pana la intrerupere, 

 

Sunt 3.27675 milisecunde si nu 3.27675 secunde. 

Tosc = 1/Fosc = 1/20000000 = 0.05 microsecunde0xFFFF (in hex) = 65535 (decimal)=>In cazul unei intreruperi (data la rollover) aceasta va avea loc la:0.05 microsecunde * 65535 = 3276.75 microsecunde = 3.27675 milisecunde

daca pui spre ex _delay_ms(4000) ce se intampla,

chiar apare o intarziere se 4s? se respecta? Avand in vedere ca depaseste numaru de cicluri ce le poate numara TMR0. 

 

Cand apare o intrerupere se executa functia asociata intreruperii. 

Daca intreruperea are loc in mijlocul functiei __delay_ms(x) (aceasta functie este una formata dintr-o serie de instructiuni NOP, instructiunea NOP nu face nimic doar consuma timp de procesor) atunci se intrerupe __delay_ms(x) unde este, se executa functia asociata intreruperii care dureaza atat cat dureaza (de regula se doreste sa tina "cat mai putin" dar functie de ce face, poate sa dureze "mai mult"), apoi se revine la functia __delay_ms(x) si se executa continutul acesteia pana se va termina.

In acest fel, timpul de la inceperea functiei __delay_ms(4000) pana la terminarea acesteia va fi aprox 4000 ms + timpul de executie al functiei asociata intreruperii.

 

Am impresia ca ai o confuzie: crezi ca functia __delay_ms(x) este facuta cu un TIMER. Dar nu este asa:

http://microchip.wikidot.com/faq:26

 

Si o nota: timerele merg in paralel cu controllerul. Controllerul nu asteapta dupa un timer si doar daca timer-ului ii este asociata o intrerupere, cand apare flag-ul de intrerupere se va opri procesorul si va executa functia asociata intreruperii.

 

Sper ca acum este mai clar.

Editat de mars01
Link spre comentariu

Daca se imparte Tosc la 0xFFFF se obtine intervalul de timp al unui rollover mai precis la un Fosc = 20MHz, timerul pe 16 biti are un rollover (revine la valoarea zero) la  fiecare 3,27675 ms.

Numai pot edita acum, era tarziu cand am postat si textul citat cam ilogic asa ca am gresit.

 

Corect este:

Daca se imparte Fosc la 0xFFFF se obtine frecventa cu care apare un rollover pe secunda, mai precis la o Fosc = 20MHz, timerul pe 16 biti are un rollover (revina la valoarea zero) la fiecare 3.27675 ms.

Editat de mars01
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări