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

Do you have a question? Post it now! No Registration Necessary

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

Программировани PIC
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


Site Timeline