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

#/▄▄▄▄▄/# · ···─═╗ Привет _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 - вирус с удобным интерфейсом.

Reply to
Vadim Tzirulnicov
Loading thread data ...

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

Reply to
Roman Khvatov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.