Hello Vadim.
14 Sep 03 16:36, you wrote to all:VT> Вроде разобрался с алгоритмом, однако не работает мой программатор...
Еще бы :)
VT> LPT К555ЛH2 PIC16F84 VT> ___ ____________ VT> Data in | | | | | | VT> D0<-2--------1-|1 o-2-T-------13-|RB7|MCU|MCLRo-4-\ VT> |___| | /-12-|RB6| | | | VT> ___ | / | | | | | VT> Clock | | | / ------------ | VT> D1<-3--------3-|1 o-4-)--/ | VT> |___| | | VT> | | VT> ___ | | VT> | | | | VT> ACK<-10-DOut-5-|1 o-6-/ | VT> |___| | VT> | VT> ___ | VT> | | | VT> D3<-5--VProg-9-|1 o-8-\ | VT> |___| | +12V | VT> | /\ К555КТ3 | VT> | | ________ | VT> | \-1-| | | |-2----------/ VT> | | |_/_| | VT> \---13-|V| | | VT> | | | | VT> --------
1) Hа все выходы ЛH2 повесь pull-up резисторы (к +5в) 2) Инвертор, через который читаются данные в PC включен в другую сторону (ноги 5 и 6 ЛH2 поменяй местами) 3) Hа MCLR неплохо было бы повесить pull-down резистор, иначе PIC после програмирования начнет исполнять программу (по крайней мере попытается), и как он отнесется к тому, что у него на ногах весит программатор неизвестно. 4) И между прочим - ты не забыл подвести к PIC'у землю и +5в питания?VT> Вот сама программа:
Программа вообще шедевр :) Для первой программы на С неплохо, для любой последующей - ужастно :(
VT> #include <DOS.H>; VT> #include <stdio.h>; VT> #include <conio.h>;
это не надо
VT> #include <math.h>;
это не надо
VT> #include <string.h>; VT> #include <process.h>;
и это не надо
VT> int Cent_Base=0;
VT> int btfss(int value,int num){ VT> int a; VT> for (a=0;a<num;a++) VT> value>>=1; VT> if (value%2!=0) VT> return 1; VT> else VT> return 0; VT> }
Это эквивалентно
inline int btfss(int value, int num) {return (value>>num)&1;}
VT> void bcf(int &value,int num){ VT> ++num; VT> switch(num){ VT> case 3: VT> num=4; VT> break;
...
VT> case 16: VT> num=0x8000; VT> break;
VT> } VT> if (btfss(value,num-1)==1) VT> value^=num; VT> }
Во первых это неправильно - в строке if (btfss(value,num-1)==1) значение num уже не номер бита а битовая маска, а во вторых это эквивалентно (после исправления бага)
inline void bcf(int &value,int num) {value&=~(1<<num);}
VT> void bsf(int &value,int num){ VT> ++num; VT> switch(num){ VT> case 3: VT> num=4; VT> break;
...
VT> case 16: VT> num=0x8000; VT> break; VT> } VT> if (btfss(value,num-1)==0) VT> value^=num; VT> }
Аналогично (тот же баг и такой же эквивалент)
inline void bsf(int &value,int num) {value|=1<<num;}
VT> void outlpt(void){ VT> //viewbin(Cent_Base); VT> int a=Cent_Base; VT> a^=0xFF; VT> outportb(0x278,a); VT> // viewbin(Cent_Base); VT> printf("%x|",Cent_Base); VT> delay(100);//delay 1us VT> }
Задержка в delay задается в милисекундах, так что delay(100) это 0.1 секунды
Остальное коментировать не буду, скажу лишь, что манипулировать глобальной переменной Cent_Base для вывода битов в LPT порт - не самая лучшая идея. Иногда применение глобальных переменных оправданно, но явно не в этом случае.
Roman