Print

код за урока за таймерите в пик процесорите -

link here >>> http://karadev.net/basto/?dir=timer_pic1829

препоръчително използване на NOTEPAD++ с настройка за разпознаване на С/С++ код за да можете да видите различните регистри, променливи и другите особенности на езика за програмиране на пик процесорите.

симулацията е в програмата протеус, версия последна има я в нета, или си начертайте собствена схема според графиките в предните уроци. успех

========================= MAIN.C =============================

#include <xc.h>
//#include <pic16f1829.h>
#include "initcpu.h"
#include "main.h"
#include "fuse.h"
#include "timers.h"            // here is interrupt function
//#include "lcd.h"            // for later use in this project

void main(void)
{    init_cpu();
        //PORTB = 8;
    while(1)
    {    
    // increase Postscaler value 0<>15
    if(T2OUTPS_plus == 1)
        { __delay_ms(350); //delay for button
            T2CONbits.T2OUTPS++;
             // sum + 16 for start count from RB4
            PORTB = PORTB + 16; // indicator plus + 1
            if(T2CONbits.T2OUTPS == 0)
            { PORTB = 0;} // null indicator
        }
    
     // decrease Postscaler value 0<>15
    if(T2OUTPS_minus == 1)
        {__delay_ms(350);//delay for button
            T2CONbits.T2OUTPS--;
            PORTB--; // indicator minus - 1
            if(T2CONbits.T2OUTPS == 0)
            { PORTB = 0; } // null indicator
        }
    
    // increase Prescale value 0<>3
    if(T2CKPS_plus == 1)
        {__delay_ms(350);//delay for button
            T2CONbits.T2CKPS++;PORTA++;
            if(T2CONbits.T2CKPS == 0)
            {
            PORTA = 0;    
            }
        }
} // END WHILE


} // END MAIN

========================= TIMERS.C =============================
функцята която обработва прекъсвате е предварително дефининирана в ХС8 и трябва само да я извиката както е показано в кода по-долу. вътре във функцията нулирате флага на таймера и след това изпълнявате командите който ви трябват. колкото и софтуер да напишете в таймера честотата на който  и да използвате таймер няма да се промени. което е целта на задачата.

========================= TIMERS.C =============================

#include <xc.h>
#include "main.h"
#include "timers.h"

unsigned char flag_timerirq = 0;

void __interrupt() timer2(void)
{    PIR1bits.TMR2IF = 0;
    //======================
    // check on scope for frequency VARIANT 1
    //notused6 = 1; //PORTAbits.RA5
    //notused6 = 0; //PORTAbits.RA5
    //======================
    // check on scope for frequency VARIANT 2
    if(flag_timerirq == 0) // full period freq
            {                    // multypile by 2 for
            LATA5 = 1;        // real frequency
                flag_timerirq = 1;
            }
        else
            {    LATA5 = 0;
                flag_timerirq = 0;
            }


} // END OF INTERRUPT TIMER2

========================= INITSPU.C =============================

стартирането, инициализацията на таймера и настройката на делителите на таймера се правят във този файл. промяната на стойностите на делителите може да направите където и да е в софтуера, стига това да ви върши работа. четете внимателно пдф файловете кои регистри са само четене и кои може и да бъдат променяни ако се налага от смисъла на приложението.

========================= INITSPU.C =============================


#include <xc.h>
//#include <pic16f1829.h>
#include "main.h"

void init_cpu(void)
{
OSCCON = 0x72; // 4F - 1Mhz // 6A - 4Mhz
                // 0x72 - 8Mhz // 0x7A - 16Mhz
OPTION_REG = 0b10000000; // TIMER0 REG // pull up is DISABLE

CM1CON0 = 0b00000000;
CM1CON1 = 0b00000000;

CM2CON0 = 0b00000000;
CM2CON1 = 0b00000000;
                
ADCON0 = 0b00000000;
ADCON1 = 0b00000000;

CLKRCON = 0b00000000; // slew rate is OFF
MDCON = 0b00000000; // slew rate is OFF

ANSELA = 0b00000000;
TRISA  = 0b00001000; // /MCLR = 1 always
PORTA = 0x00;
WPUA = 0x00;

ANSELB = 0b00000000;
TRISB  = 0b00000000;
PORTB = 0x00;
WPUB = 0x00;

ANSELC = 0b00000000;
TRISC  = 0b00000111;
PORTC = 0x00;
WPUC = 0x00;

MDMSODIS = 1; // logic cell disables

GIE = 1 ; // enable general interrupts FOR ALL
PEIE = 1; // enable peripherial interrupts FOR ALL
TMR2IE = 1; // // enable TIMER2 interrupts
// set bits from pdf for timer prescaler and post scaller
T2CON = 0b00000000; // and timer2 on / off
T2CONbits.T2OUTPS = 0; //0-15 // Timerx Output Postscaler Select bits
T2CONbits.T2CKPS = 0; //0-3  // Timer2-type Clock Prescale Select bits
T2CONbits.TMR2ON = 1; // enable timer2 to start


}
========================= INITSPU.C =============================

Category: picprocesori
Hits: 198