coco243 Postat Iunie 12, 2016 Partajează Postat Iunie 12, 2016 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
Bandi Szasz Postat Iunie 12, 2016 Partajează Postat Iunie 12, 2016 (editat) 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 Iunie 12, 2016 de bandi12 Link spre comentariu
mars01 Postat Iunie 12, 2016 Partajează Postat Iunie 12, 2016 (editat) 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 Iunie 12, 2016 de mars01 Link spre comentariu
coco243 Postat Iunie 12, 2016 Autor Partajează Postat Iunie 12, 2016 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
Bandi Szasz Postat Iunie 12, 2016 Partajează Postat Iunie 12, 2016 ASM - ul este mai greu de inteles decat C daca nu ai experienta in ASM. Link spre comentariu
coco243 Postat Iunie 12, 2016 Autor Partajează Postat Iunie 12, 2016 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
danpin Postat Iunie 12, 2016 Partajează Postat Iunie 12, 2016 (editat) "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 Iunie 12, 2016 de danpin Link spre comentariu
mars01 Postat Iunie 12, 2016 Partajează Postat Iunie 12, 2016 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
Liviu M Postat Iunie 12, 2016 Partajează Postat Iunie 12, 2016 @coco243: poti invata linistit asamblor, in mod sigur n-o sa-ti strice. Dar... oare de ce crezi ca s-au inventat manualele de utilizare pentru compilatoare? Exemplu de documentatii de la microchiop pentru XC8: - MPLAB® XC8 User’s Guide for Embedded Engineers - MPLAB® XC8 C Compiler User’s Guide Link spre comentariu
coco243 Postat Iunie 13, 2016 Autor Partajează Postat Iunie 13, 2016 (editat) 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 Iunie 13, 2016 de coco243 Link spre comentariu
mars01 Postat Iunie 13, 2016 Partajează Postat Iunie 13, 2016 (editat) 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): 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 Iunie 13, 2016 de mars01 Link spre comentariu
mars01 Postat Iunie 14, 2016 Partajează Postat Iunie 14, 2016 (editat) 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 Iunie 14, 2016 de mars01 Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum