Отговори на тема  [ 6 мнения ] 
Проблем с EM4095 и PIC16F887- Решен 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Авг 01, 2013 9:29 pm
Мнения: 11
Местоположение: Русе
Мнение Проблем с 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;
    }
}

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


Последна промяна antyvirusa на Пон Яну 05, 2015 8:03 pm, променена общо 1 път



Сря Дек 31, 2014 8:00 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Нед Юли 22, 2007 8:57 pm
Мнения: 607
Местоположение: Белград
Мнение Re: Проблем с EM4095 и PIC16F887
ОТТУК можеш да си свалиш пример за MikroC за същия чип и да сравниш алгоритмите.

_________________
http://www.szrefekt.com


Пет Яну 02, 2015 3:23 am
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Авг 01, 2013 9:29 pm
Мнения: 11
Местоположение: Русе
Мнение 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?


Пет Яну 02, 2015 5:32 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Дек 19, 2004 6:26 pm
Мнения: 1628
Местоположение: Сливен
Мнение Re: Проблем с EM4095 и PIC16F887
Не съм работил с този чип, а съм ползвал подобен U2270.
Погледни алгоритъма на стр. 25 и 26 - мисля, че ще ти е от полза :)
http://www.digitalspirit.org/file/index ... u2270B.pdf


Съб Яну 03, 2015 12:19 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Проблем с EM4095 и PIC16F887
Преди ... сигурно 15 години съм правил четец точно с тоя чип, вече нямам никакъв спомен но ще разровя да видя мога ли да намеря кода, 100% е писано на асм но мисля ще свърши работа.


Пон Яну 05, 2015 9:09 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Авг 01, 2013 9:29 pm
Мнения: 11
Местоположение: Русе
Мнение Re: Проблем с EM4095 и PIC16F887
Благодаря на всички за помощта и вниманието. Справих се със задачата.


Пон Яну 05, 2015 8:03 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни