Понедельник, Май 25, 2020

Пример 6.18 PIC18 Си стр232-Таймер реального времени

//Таймер реального времени
#include<p18cxxx.h>
#pragma config OSC=RC
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config BOR=OFF
#pragma config MCLRE=OFF

void MyHighInt(void);

#pragma interrupt MyHighInt    //Это высокоприоритетное прерывание
#pragma code high_vector=0x08  //Это вектор по адресу 0х08
void high_vector(void){
    _asm GOTO MyHighInt _endasm
}
//----------------------Память данных------------------------------
#pragma udata access IntMyData
near char seconds;
near char minutes;
near char hours;
//---------------------Функции-------------------------------------
#pragma code
void DoTime(void)              //формирование сигнала счета каждую секунду
{
    TMR1H=0x80;                //предзагрузка таймера 1 значением 0х8000
    PIR1bits.TMR1IF=0;         //сброс прерывания от таймера 1
    seconds++;                 //прибавляем 1 к seconds
    if(seconds==60)            //если seconds равно 60
    {
        seconds=0;             //обнуляем секунды
        minutes++;             //и прибавляем 1 к минутам
        if(minutes==60)        //если минуты равны 60
        {
            minutes=0;         //обнуляем минуты
            hours++;           //прибавляем 1 к часам
            if(hours==24)      //если часы равны 24
                hours=0;       //обнуляем часы
        }
    }
}
void MyHighInt(void){
    if(PIR1bits.TMR1IF)
    {
        DoTime();
    }
    
}
void main(void){
    ADCON1=0x7f;              //выключаем АЦП

    RCONbits.IPEN=1;          //включение приоритетов прерываний
    TMR1L=0x00;               //инициализация счетчика
    TMR1H=0x80;
    T1CON=0x0F;               //Таймер1 вкл.,внешний синхроимпульс на RB6,синхронизации нет,генератор включен
    seconds=minutes=hours=0;  //сбросим переменные
    IPR1bits.TMR1IP=1;        //высокий приоритет прерывания переполнения Таймера1
    PIE1bits.TMR1IE=1;        //включить прерывание по переполнению Таймера1
    INTCONbits.GIEH=1;        //глобальное разрешение прерываний
    while(1){
    }
}

T1CON

IPR1

PIE1

 

#pragma udata
char timeString[12];

#pragma code
void getTimeString(char mode)
{
    char ptr=0;
    char tempHours=hours;
    char amPM='A';
    if(mode)
    {
        if(hours==12)
        {
            tempHours-=12;
            amPM='P';
        }
        if(tempHours==0)
            tempHours=12;
    }
    if((tempHours/10)==0){
        timeString[ptr++]=' ';
    }
    else{
        timeString[ptr++]=tempHours/10+0x30;
    }
    timeString[ptr++]=tempHours%10+0x30;
    timeString[ptr++]=':';
    timeString[ptr++]=minutes/10+0x30;
    timeString[ptr++]=minutes%10+0x30;
    timeString[ptr++]=':';
    timeString[ptr++]=seconds/10+0x30;
    timeString[ptr++]=seconds%10+0x30;
    if(mode)
    {
        timeString[ptr++]=' ';
        timeString[ptr++]=amPM;
        timeString[ptr++]='M';
    }
    timeString[ptr]=0;
}

//Пример 6.21 страница 236
#include<p18cxxx.h>
#pragma config OSC=RC
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config BOR=OFF
#pragma config MCLRE=OFF

void MyHighInt(void);

#pragma interrupt MyHighInt    //Это высокоприоритетное прерывание
#pragma code high_vector=0x08  //Это вектор по адресу 0х08
void high_vector(void){
    _asm GOTO MyHighInt _endasm
}
//----------------------Память данных------------------------------
#pragma udata access IntMyData
near short long time;
#pragma udata
char timeString[12];
//---------------------Функции-------------------------------------
#pragma code
void getTimeString(char mode)
{
    char ptr=0;
    char hours=time/3600;
    char amPM='A';
    char minutes=(time%3600)/60;
    char seconds=(time%3600)%60;
    if(mode)
    {
        if(hours==12)
        {
            hours-=12;
            amPM='P';
        }
        if(hours==0)
            hours=12;
    }
    if((hours/10)==0){
        timeString[ptr++]=' ';
    }
    else{
        timeString[ptr++]=hours/10|0x30;
    }
    timeString[ptr++]=hours%10|0x30;
    
    timeString[ptr++]=':';
    timeString[ptr++]=minutes/10|0x30;
    timeString[ptr++]=minutes%10|0x30;
    
    timeString[ptr++]=':';
    timeString[ptr++]=seconds/10|0x30;
    timeString[ptr++]=seconds%10|0x30;
    if(mode)
    {
        timeString[ptr++]=' ';
        timeString[ptr++]=amPM;
        timeString[ptr++]='M';
    }
    timeString[ptr]=0;
}
void DoTime(void)              //формирование сигнала счета каждую секунду
{
    TMR1H=0x80;                //предзагрузка таймера 1 значением 0х8000
    PIR1bits.TMR1IF=0;         //сброс прерывания от таймера 1
    time++;
    if(time==86400){
        time=0;
    }
}
void MyHighInt(void){
    if(PIR1bits.TMR1IF)
    {
        DoTime();
    }
    
}
void main(void){
    ADCON1=0x7f;              //выключаем АЦП

    RCONbits.IPEN=1;          //включение приоритетов прерываний
    TMR1L=0x00;                  //инициализация счетчика
    TMR1H=0x80;
    T1CON=0x0F;               //Таймер1 вкл.,внешний синхроимпульс на RB6,синхронизации нет,генератор включен
    IPR1bits.TMR1IP=1;        //высокий приоритет прерывания переполнения Таймера1
    PIE1bits.TMR1IE=1;        //включить прерывание по переполнению Таймера1
    INTCONbits.GIEH=1;        //глобальное разрешение прерываний
    while(1){
    }
}




НАЗАД                                                                                                                                         ДАЛЕЕ


Back to Top