PIC16F15323 yardım Mplab X IDE 4.05

Başlatan kazan_2, 23 Şubat 2018, 18:24:45

kazan_2

Merhabalar;

Pıc16F15323 ile TMR0 kesmesi kullanamaya çalışıyorum ama bir türlü başaramadım.

öncelikle tüm config ayarlarını Mplabın MCC modulu üzerinden yapıyorum girişlerimi çıkışlarımı herşeyi burdan ayarlıyorum.

yapmaya çalıştığım bir butondan basında ledler bir başka butondan basıncada buzzer çalışsın.(herşeyin başlangıcı bu dediler.)

bu yakıp sondurme kısmınıda delay ile değil TMR0 ile yapıyorum ki buzzer arasında ses bozukluğu olmasın.(delay ile başardım bu arada TMR0 ı kullanamayorum.)

bana bu kısımda yardımcı olabilir misiniz?

bir çok konuyu okudum ama işin içinden çıkamıyorum.

kod yazmada iyi değilim bu yüzden bir arkadasım MCC kısmını gösterdi config etmek daha basit diye ordan herşeyi tıklayarak ayarlıyoruz.

ama onuda yapamadım ne yazık ki.

şimdiden teşekkürler.

kolay gelsin.




ete

Standart işlemcilerle çalışmak yerine adı sanı duyulmamış işlemcileri seçme sebebinizi pek anlayamadım.
Tamam güzel bir işlemci çok özellikli ama başlangıç aşamasında en azından bildik işlemcileri tercih etsyediniz TMR0'ı da kolaylıkla kullanabilecektiniz.
Her neyse, bu işlemcide TMR0 modül olarak bulunuyor. İşin kontrolü T0CON0 ve T0CON1registerleri ile yapılıyor.
Ayrıca bu sayac hem 16bit hemde 8 bit olarak kullanıabiliyor.
T0CON0 registerin 7 nolu biti modülü aktif edip etmemeyi seçtiriyor. 1 olursa aktif 0 olursa pasif oluyor
T0CON0 registerin 6 nolu biti kullanılmıyor 0 verilmeli
T0CON0 registerin 5 nolu bitiTimer0 Output biti
T0CON0 registerin 4 nolu bitibit seçimi yapıyor 1 olursa 16 bit , 0 olursa 8 bit çalışıyor bu sayac.
T0CON0 registerin 0-3 nolu bitleri Post Scaler oranını seçiyor. 4 bitlik bir değer size 0-16 arası farklı bölme oranı sağlıyor. Post Scaler ne sıklıkla kesme oluşturulacağını belirlemektedir. Asıl bölme işini T0CON1 registeri nin 0-3 nolu bitleri ayarlamaktadır.
T0CON1 registeri 7-5 nolu bitleri clk kaynak seçimini belirliyor.  Kullanılabilecek seçenekler şunlar;
%100=LFINTOSC
%110=HFINTOSC
%010=Fosc/4
ilk iki seçenek direk OSC den puls almakta son seçenek ise OSC/4 üzerinden puls almaktadır.
T0CON1 registeri 4 nolu biti bu sayacın sistem saati ile senkron çalışıp çalışmayacağına karar verir.
T0CON1 registeri 0-3 nolu bitler ise bölme oranını belirler. 1 den başlayıp 2 nin katları şeklinde 32768'e kadar toplam 16 seçenek verilmiştir.
Sayaç değeri TMR0L ve TMR0H registerlerinde tutulur. Sayacı 8 bit bile kullanmış olsanız yalnızca TMR0L registerini kullanmanız gerekir.
Bu kadar açıklamadan sonra led lere flash yaptıracağınızı düşünerek 200 ms lik bir gecikme yaratmak için sayacı 16 bit modunda kullanıp Prescaler (bölme oranını ) 1/4 olarak ayarlayıp sayaca 15537 (TMR0L=$B1 , TMR0H=$3C)  değerini vermek gerekir. Bu şekil kullanım için T0CON0=%10010000 ve T0CON1=%10000010 değerlerini vermek yeterli olacaktır.
Bu sistemi program içinde kullanabilmek için de TMR0 kesme bayrağı kullanılabilir. PIR0.5 nolu bit TMR0 kesme bayrağıdır.
Şöyle kullanılabilir.
T0CON0=%10010000 ve T0CON1=%10000010
SAYDIR:
PIR0.5=0:TMR0L=$B1:TMR0H=$3C
WHILE PIR0.5=0:wend
program bu satıra geldiğinde otomatikman 200 ms geçmiş olacaktır.
While - wend aralığına tuş kontrolü ekleyebilirsiniz. Böylece sayaç sayarken aynı zamanda tuşa basılmışmı bakabilirsiniz.
Bu işlemciyi ilk defa duydum ve yukarıdaki açıklamaları data sheet'e bakarak toparladım. Deneme imkanım yok. Aksaklık çıkmayacağını umuyorum. Çıkarsa da aksaklığa göre çözüm buluruz.

Ete

kazan_2

hocam öncelikle yardımlarınız için teşekkür ederim.

ama yazmış olduğunuz kodu ne yazık ki programa entegre edemedim.

ben mcc ile kod oluşturduğum için bir çok şeyi zaten ayarldım.

size resim ve kodları yolluyorum.

direkt olarak timer0 kesmesini çağırma ve uygulama kısmını gerçekleştiremedim.

sizin söylediğinize bir benzer flag kontorulu ile bu şekilde denedim bu seferde zamanlama kayıyor ne yazık ki.

fotoğraflarda da nasıl programlama yaptığımı görebilirsiniz hocam hiç bir kod yazmadan sadece mcc kısmında direk tıklayarak portları açıp kapatarak hallettim.

ama ne yazık ki timer kısmını kullanamıyorum.

MAİN KISMI:

#include "mcc_generated_files/mcc.h"

/*
                         Main application
*/
unsigned char counter;

void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

    while (1)
    {
       
            if (TMR0IF)
            {       
            counter++;//if T0IF = 1 increment the counter
            //variable by 1
             TMR0IF = 0;//Clear the T0IF flag so that
            //the next overflow can be detected
             
         
               
           if(counter==1)
           {
                A_SetHigh();
            B_SetHigh();
            C_SetHigh();
            D_SetHigh();
                 
           }
             if(counter==3)
           {
           
                A_SetLow();
               B_SetLow();
               C_SetLow();
               D_SetLow();
                 
             }
            if(counter==5)
            {
               
                A_SetHigh();
                B_SetHigh();
                C_SetHigh();
                D_SetHigh();
               
            }
              if(counter==7)
           {
               A_SetLow();
               B_SetLow();
               C_SetLow();
               D_SetLow();
               
            }
           
                if(counter==30)
           {
                   counter=0;
                }
       
            }
       
    }   

/**
End of File
*/
}

INTERRUP KISMI:

#include "interrupt_manager.h"
#include "mcc.h"

void interrupt INTERRUPT_InterruptManager (void)
{
    // interrupt handler
    if(PIE0bits.IOCIE == 1 && PIR0bits.IOCIF == 1)
    {
        PIN_MANAGER_IOC();
    }
    else if(PIE0bits.TMR0IE == 1 && PIR0bits.TMR0IF == 1)
    {
        TMR0_ISR();
    }
    else
    {
        //Unhandled Interrupt
    }
}




TİMER KISMI:


#include <xc.h>
#include "tmr0.h"

/**
  Section: Global Variables Definitions
*/

volatile uint16_t timer0ReloadVal16bit;

/**
  Section: TMR0 APIs
*/

void (*TMR0_InterruptHandler)(void);

void TMR0_Initialize(void)
{
    // Set TMR0 to the options selected in the User Interface

    // T0CS FOSC/4; T0CKPS 1:256; T0ASYNC synchronised;
    T0CON1 = 0x48;

    // TMR0H 252;
    TMR0H = 0xFC;

    // TMR0L 87;
    TMR0L = 0x57;

    // Load TMR0 value to the 16-bit reload variable
    timer0ReloadVal16bit = (TMR0H << 8) | TMR0L;

    // Clear Interrupt flag before enabling the interrupt
    PIR0bits.TMR0IF = 0;

    // Enabling TMR0 interrupt.
    PIE0bits.TMR0IE = 1;

    // Set Default Interrupt Handler
    TMR0_SetInterruptHandler(TMR0_DefaultInterruptHandler);

    // T0OUTPS 1:1; T0EN enabled; T016BIT 16-bit;
    T0CON0 = 0x90;
}

void TMR0_StartTimer(void)
{
    // Start the Timer by writing to TMR0ON bit
    T0CON0bits.T0EN = 1;
}

void TMR0_StopTimer(void)
{
    // Stop the Timer by writing to TMR0ON bit
    T0CON0bits.T0EN = 0;
}

uint16_t TMR0_Read16bitTimer(void)
{
    uint16_t readVal;
    uint8_t readValLow;
    uint8_t readValHigh;

    readValLow  = TMR0L;
    readValHigh = TMR0H;
    readVal  = ((uint16_t)readValHigh << 8) + readValLow;

    return readVal;
}

void TMR0_Write16bitTimer(uint16_t timerVal)
{
    // Write to the Timer0 register
    TMR0H = timerVal >> 8;
    TMR0L = (uint8_t) timerVal;
}

void TMR0_Reload16bit(void)
{
    // Write to the Timer0 register
    TMR0H = timer0ReloadVal16bit >> 8;
    TMR0L = (uint8_t) timer0ReloadVal16bit;
}

void TMR0_ISR(void)
{
    // clear the TMR0 interrupt flag
    PIR0bits.TMR0IF = 0;
    // Write to the Timer0 register
    TMR0H = timer0ReloadVal16bit >> 8;
    TMR0L = (uint8_t) timer0ReloadVal16bit;
   
   
    // ticker function call;
    // ticker is 1 -> Callback function gets called every time this ISR executes
    TMR0_CallBack();

    // add your TMR0 interrupt custom code
}

void TMR0_CallBack(void)
{
    // Add your custom callback code here
   
    if(TMR0_InterruptHandler)
    {
        TMR0_InterruptHandler();
    }
}

void TMR0_SetInterruptHandler(void (* InterruptHandler)(void)){
    TMR0_InterruptHandler = InterruptHandler;
}
unsigned char counter=0;

void TMR0_DefaultInterruptHandler(void)
{
   
    // add your TMR0 interrupt custom code
    // or set custom function using TMR0_SetInterruptHandler()

}
/**
  End of File
*/




ete

Hiç kullanmadığım bir derleyicide yerdımcı olamayacağım maalesef. İşin nasıl olacağını derleyiciden bağımsız anlattım. Kendin aşmak zorundasın maalesef.
Ete

kazan_2

Hocam merhabalar

uzun uğraşlar sonucu hem ledleri yakabildiğim aynı zamanda bir kaç ses üretebildiğim bir program yazmayı başardım.

ledler için biir kaç versyon oluşturdum bu versiyonları bir butonla kontrol ediyorum aynı şekilde sesleride bir butonla kontrol ediyorum.

şuanda bunları hafızada tutmayla alakalı bir sıkıntım var buton bilgilerini hafızaya almaya çalışıyorum.

işlemcide eprom yok flash memory bulunuyor.

sorun şu bir butonu Flash memory ye yazdırıyorum aynı teknikle diğerini de yazdırınca tum sistem donuyor.

Flash memory çalışma prensibine göre yazılım yapmadan önce tüm flashı silinmesi gibi bir durum var galiba bir türlü çözemedim.

tek butonu yazma okuma yapabilirken ikici butonu ne yazık ki yazamıyorum.

yardımlarınız için şimdiden teşekkür ederim. 

ete

Flash hafıza denilince iki şey aklıma gelir. Birincisi program hafızası ki bu bölge programın çalışması açısından tehlikeli bölgedir. Program üzerine bir şey yazarsanız kod bozulur ve program kilitlenir.
Diğeri ise yeni nesil işlemcilerde bulunan HEF (High Endurance Flash) hafızadır ki bu işlemcilerde eeprom yerine HEF koyuyorlar artık.
Hef konusunda tecrübeli değilim hiç kullanmadım. Ama kullanan arkadaşlarımız var. Aşağıdaki linki incele belki bir ip ucu yakalarsın.

http://etepic.com/index.php/topic,3863.0.html

Ete

kazan_2

merhabalar;

öncelikle yardımlarınız için çok teşekkür ederim.

istediğim sonuca sonunda ulaştım. sağolsun bir abimiz yardımcı oldu.

burada yapmış olduğum işlemle tüm işlemleri nerdeyse uyguladım.

çok yararlı bir çalışma oldu benim için herhangi bir sorusu olan olursa burdan tecrubelerimi paylaşabilirim.

Mplab X IDE ile uygulama konfigure etmek ve kod yazmaya başladım diyebiliriz. :)

hepinize iyi günler ...

ozansel

hocam sorunu çözdüğünüzü söylemişsiniz.Programınızdaki Sadece veriyi Flash'a yazımı ve Flash'tan okuduğunuz kısımını paylaşabilir misiniz

Powered by EzPortal