Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с EM4095 и PIC16F887- Решен
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=13462
Страница 1 от 1

Автор:  antyvirusa [ Сря Дек 31, 2014 8:00 pm ]
Заглавие:  Проблем с EM4095 и PIC16F887- Решен

Здравейте. Историята е следната: Сглобих си RFID reader с EM4095 и PIC16F887. Свързани са по следния начин: DEMOD_OUT е свързан към INT пина (RB0), а RDY/CLK на TOCKI пина (RA4). За целта използвам таймер 0 по следния начин. INT пина вдига флаг (под флаг да се разбира флаг за прекъсване) при падащ фронт (в Манчестър кодирането това трябва да е логическа единица???), а TOCKI пина вдига флаг при нарастващ преден фронт. Първият ми въпрос, двете прекъсвания могат ли да работят по едно и също време, т.е. единият пин докато вдига флагове за RDY/CLK, другия може ли по същото време да вдига флагове за DEMOD_OUT? Начинът по който декодирам картата е следния: Имам 131,6KHz на RDY/CLK, а на DEMOD_OUT доколкото виждам на осцилоскопа 2KHz (доколкото виждам, понеже не знам дали меря правилно??). Т.е., ако в обхвата на антената има карта, за преминаване на два периода на DEMOD_OUT, трябва да се отброят 132 периода на RDY/CLK (според мен). И действам по следния начин: Чакам 66 периода на RDY/CLK и след като минат проверявам дали на INT пина съм получил прекъсване и ако съм получил (т.е. е минал падащ фронт) записвам 1-ца, в противен случай 0. Моля за помощ, защото по този начин, по който съм го направил не работи и не знам къде ми е грешката. Ето и кода, който съм написал.
Код:
#include <xc.h>
#include "driver.h"

     


// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG1
#pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)


#define SHD PORTDbits.RD7

unsigned char cnt1=0, cnt2=0, ones=0;


//Programa za skanirane na towa dali ima tag w obxwata na antenata
//Tag ima kogato chestotata na INT pina e 2KHz
//Celta e da se xwanat dwa padashti predni fronta (na 2 KHz) za 132 RF perioda
unsigned char detect (void)
{
    while(cnt2<2); //izchakai 2 perioda na TOCKI pina
    if(cnt1==2 && cnt2==2) //ako w edin i sashti moment e izpalneno uslowieto
    {
        //PORTDbits.RD2=1;
        cnt1=0;
        cnt2=0;
        return 1;
    }
    else
    {
        //PORTDbits.RD2=0;
        cnt1=0;
        cnt2=0;
        return 0;
    }
}

void read (void) //procheti header-a
{
    for(unsigned char i=0;i<9;i++)
    {
        while(cnt2<1);
            if(cnt1==1)
            {
                ones++;
            }
            cnt2=0;
            cnt1=0;
    }
    if(ones==9)
    {
        PORTDbits.RD3=1;
    }
    else
    {
        PORTDbits.RD3=0;
    }
    ones=0;
}

void main (void)
{
    init();
    //EM4095 initialization
    SHD = 1;
    SHD = 0;
    while(cnt2<70);
    PORTDbits.RD3=0;
    PORTDbits.RD2=0;
    cnt2=0;
    while(1)
    {
        detect();
        if(detect()==1)
        {
        PORTDbits.RD2=1;
        while(cnt2<62); //izchakai 62 cikala, poneje w detect weche sa minali 2 cikala
                        //(poneje kartata e 64 bitowa), za da zapochne cheteneto ot 1wi bit
        cnt2=0;
        cnt1=0;
        read();
        }
        else
        {
            PORTDbits.RD2=0;
        }
    }

}


//Interrupt routine
void interrupt Isr(void)
{
    if (INTE && INTF) //Interrupt on INT pin 2khz
    {
        cnt1++;
        INTF=0;
    }
    if(T0IE && T0IF) //Interrupt on T0CKI pin 125khz
    {
        TMR0=190; //256-190=66 perioda
        cnt2++;
        T0IF=0;
    }
}

Благодаря предварително на всички!

Автор:  E1 [ Пет Яну 02, 2015 3:23 am ]
Заглавие:  Re: Проблем с EM4095 и PIC16F887

ОТТУК можеш да си свалиш пример за MikroC за същия чип и да сравниш алгоритмите.

Автор:  antyvirusa [ Пет Яну 02, 2015 5:32 pm ]
Заглавие:  Re: Проблем с EM4095 и PIC16F887

E1 написа:
ОТТУК можеш да си свалиш пример за MikroC за същия чип и да сравниш алгоритмите.


Благодаря за вниманието и за примера. Гледал съм го и преди. Смятам, че начина ми е идентичен, но при мен не се получава. Някой може ли да ми каже алгоритъма? Ще напиша какъв е според мене, защото не искам на готово, но явно, че някъде греша. За четене, след като сме детектнали, че има карта в обхвата на антената, алгоритъма според мен е:
-Отброяваме 66 периода на RDY_CLK;
-Проверяваме по време на изминалите 66 периода дали сме имали падащ фронт (преход от 1 към 0) и ако сме имали запазваме 1, ако ли не 0;
-По същия начин още 63 пъти за 64 битова карта.

За детектване на карта броя 132 периода на RDY_CLK, за които трябва да имам 2 единици и ако е изпълнено, броя 62 (64бита-2) цикъла х 66 периода (за да дойда пак в началото). И ако се изпълни това почвам да чета от картата.


Честотата ми е 8MHz и мисля, че е достатъчна, но в примера е споменато да е поне 32MHz?

Автор:  Wise [ Съб Яну 03, 2015 12:19 pm ]
Заглавие:  Re: Проблем с EM4095 и PIC16F887

Не съм работил с този чип, а съм ползвал подобен U2270.
Погледни алгоритъма на стр. 25 и 26 - мисля, че ще ти е от полза :)
http://www.digitalspirit.org/file/index ... u2270B.pdf

Автор:  ToHu [ Пон Яну 05, 2015 9:09 am ]
Заглавие:  Re: Проблем с EM4095 и PIC16F887

Преди ... сигурно 15 години съм правил четец точно с тоя чип, вече нямам никакъв спомен но ще разровя да видя мога ли да намеря кода, 100% е писано на асм но мисля ще свърши работа.

Автор:  antyvirusa [ Пон Яну 05, 2015 8:03 pm ]
Заглавие:  Re: Проблем с EM4095 и PIC16F887

Благодаря на всички за помощта и вниманието. Справих се със задачата.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/