Программировани PIC

Oct 14, 2003 1 Replies

#/▄▄▄▄▄/# · ···─═╗ Привет _All_ ! Пишет тебе *Vadim* ! _*▀▀▀▀▀*_ ╚═══════════════─────────────────····· · · ·


Hикак не могу понять, в чём ошибка.



Читается МК без проблем (команда 0x4, младший бит числа команды шлю первым, так что здесь ошибки нет->получение шестнадцати бит данных->команда 0x6, и т.д.). Шлю 0x6 и за ней данные с теми же интервалами - данные не изменяются.



Аппаратная часть взята с программатора с pic16f84.narod.ru. Можно было бы и самим программатором обойтись, да уж больно он шустрый - даже при замедлении работы в 5 раз считывает неверно, но пишет нормально.



Hиже приведён код моего программатора. Все функции проверены, проблема может быть лишь в PICSendData(). Hо в его коде ошибки не обнаружил... В таймингах уверен - одной микросекунды более чем достаточно данному МК в большинстве случаев.



#include <DOS.H>; #include <stdio.h>; #include <conio.h>; #include <math.h>; #include <string.h>; #include <process.h>; #define ESC 0x1B; int *b; int Cent_Base=0; char key=0;



int btfss(int value,int num){ int a; for (a=0;a<num;a++) value>>=1; if (value%2!=0) return 1; else return 0; }



void bcf(int &value,int num){ ++num; switch(num){ case 3: num=4; break; case 4: num=8; break; case 5: num=0x10; break; case 6: num=0x20; break; case 7: num=0x40; break; case 8: num=0x80; break; case 9: num=0x100; break; case 10: num=0x200; break; case 11: num=0x400; break; case 12: num=0x800; break; case 13: num=0x1000; break; case 14: num=0x2000; break; case 15: num=0x4000; break; case 16: num=0x8000; break;



} if (btfss(value,num-1)==1) value^=num; }



void bsf(int &value,int num){ ++num; switch(num){ case 3: num=4; break; case 4: num=8; break; case 5: num=0x10; break; case 6: num=0x20; break; case 7: num=0x40; break; case 8: num=0x80; break; case 9: num=0x100; break; case 10: num=0x200; break; case 11: num=0x400; break; case 12: num=0x800; break; case 13: num=0x1000; break; case 14: num=0x2000; break; case 15: num=0x4000; break; case 16: num=0x8000; break; } if (btfss(value,num-1)==0) value^=num; }


void outlpt(void){ //viewbin(Cent_Base); int a=Cent_Base; a^=0xFF; outportb(0x378,a); //viewbin(Cent_Base); //printf("%x|",Cent_Base); delay(1);//delay 1us }



void die(char msg[100]){ printf("\n%s\n",msg); exit(0); }


void PICStart(){ Cent_Base=0;//0V UProg outlpt(); Cent_Base=8;//+12V UProg outlpt(); }



void PICSendCommand(int value){ int a; /* D0 - -Data D1 - -Clock */ //printf("\nvalue=%x\n",value); for (a=0;a<6;a++){ bcf(Cent_Base,0);//Reset Data bsf(Cent_Base,1);//High Clock if (btfss(value,0)){// Low Bit First Cent_Base^=1; //printf("\n1|%d|%x\n",a,value); } value>>=1; outlpt(); bcf(Cent_Base,1);//Low Clock outlpt(); } //printf("----"); }



void PICSendData(int value){ int a; for (a=0;a<16;a++){ bsf(Cent_Base,1);//High Clock if (btfss(value,a)==1) bsf(Cent_Base,0); else bcf(Cent_Base,0); outlpt(); printf("%x|",Cent_Base); bcf(Cent_Base,1);//Low Clock outlpt(); } }



int PICRecvData(void){ int value=0; int a; //bsf(Cent_Base,1);//High Clock //outlpt(); //bcf(Cent_Base,0);//Low Clock, get empty bit (0) //outlpt(); bsf (Cent_Base,0); for (a=0;a<16;a++){ bsf(Cent_Base,1);//High Clock outlpt(); bcf(Cent_Base,1); outlpt(); if (btfss(inportb(0x379),6)==0)//Recv bit is inversing by K555LN2 bsf(value,a); //printf("%x|",inportb(0x279)); } //bsf(Cent_Base,1);//High Clock //outlpt(); //bcf(Cent_Base,0);//Low Clock, get empty bit (16) //outlpt(); value&=0x7FFE; value>>=1; return value; }



void main(void){ PICStart(); //PICSendCommand(0x2);//0x6-increment,0x4-read,0x2-write //printf("\n\n%x",PICRecvData()); //PICSendData(0x1234); // int line; int maxline=10; int byte; int maxbyte=10; int count=0;



printf("\n");



for (line=0;line<maxline;line++){ printf("%04X:",count); for (byte=0;byte<8;byte++){ PICSendCommand(0x4); delay(10); printf (" %04X",PICRecvData()); PICSendCommand(0x6); count++; } printf("\n"); // printf("%04X: %X %X %X %X %X %X %X %X %X %X %X %X %X %X %X",line,ar[0],ar[1],ar[2],ar[3],ar[4],ar[5],ar[6],ar[7],ar[8],ar[9],ar[10],ar[



11],ar[12],ar[13],ar[14]);
}

//PICSendData(0x1234); //PICViewBin(PICRecvData()); exit(0); · ···─═╗ Hу я вроде все сказал... Bye _*All*_ ! ╚═══════════════─────────────────····· · · · ... Windows - вирус с удобным интерфейсом.


Hello Vadim.

14 Oct 03 19:11, you wrote to all:

VT> Hикак не могу понять, в чём ошибка.

Мне вспоминается, что эту программу я уже видел, и даже показывал, где ошибка :)

VT> void bcf(int &value,int num){

int org_num=num;

VT> ++num; VT> switch(num){ VT> case 3: VT> num=4;

...

VT> case 16: VT> num=0x8000; VT> break;

VT> } /* VT> if (btfss(value,num-1)==1) */

if (btfss(value,org_num)==1)

VT> value^=num; VT> }

VT> void bsf(int &value,int num){

int org_num=num;

VT> ++num; VT> switch(num){ VT> case 3: VT> num=4;

...

VT> case 16: VT> num=0x8000; VT> break; VT> } /* VT> if (btfss(value,num-1)==0) */

if (btfss(value,org_num)==0)

VT> value^=num; VT> }

Roman

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required