max0147 发表于 2012-5-29 10:23:21

一个老芯片 INTEL 8253,读数据问题

本帖最后由 max0147 于 2012-5-29 11:23 编辑

INTEL 8253,可以正常写入控制字,并输出正确波形;想要读出计数值,但一写入锁存命令,即RL0,RL1都=0时,正常波形也没有了,读出数值始终为0;
调整时序;在读之前加入控制判断GATE都无效,遂请教,多谢。

#include <reg52.h>   //包括一个52标准内核的头文件
#include <intrins.h>
#include <stdio.h>

sbit A0 = P0^0;
sbit A1 = P0^1;
sbit nWR = P0^2;
sbit nRD = P0^3;
sbit nCS = P0^4;

sbit gate = P2^4;

void init_82c54(void)
{
      A0 = 1;
      A1 = 1;
      nWR = 1;
      nRD = 1;
      nCS = 1;

      gate = 1;
}

void write_cntl_82c54(unsigned char cnt_no,unsigned char mode)
{
      unsigned char cntl_byte;
      cntl_byte = 0;
      A0 = 1;
      A1 = 1;
      //SC位
      if(cnt_no==0) {cntl_byte &= 0x3f;}
      else if(cnt_no==1) {cntl_byte &= 0x3f; cntl_byte |= 0x40;}
      else if(cnt_no==2) {cntl_byte &= 0x3f; cntl_byte |= 0x80;}
      //RW位
      cntl_byte &= 0xcf;
      cntl_byte |= 0x10;
      //MODE位
      if(mode==2) {cntl_byte &= 0xf9; cntl_byte |= 0x04;}
      else if(mode==3) {cntl_byte &= 0xf9; cntl_byte |= 0x06;}
      //BCD位
      cntl_byte &= 0xfe;
      //写入
      P1 = cntl_byte;
      nCS = 0;
      nWR = 0;
      _nop_();
      nWR = 1;
      nCS = 1;
}

void write_data_82c54(unsigned char cnt_no,unsigned char indata)
{
    //选择counter
      if(cnt_no==0) {A0 = 0; A1 = 0;}
      else if(cnt_no==1) {A0 = 1; A1 = 0;}
      else if(cnt_no==2) {A0 = 0; A1 = 1;}
      //写入
      P1 = indata;
      nCS = 0;
      nWR = 0;
      _nop_();
      nWR = 1;
      nCS = 1;
      A0 = 1;
      A1 = 1;
}


unsigned char read_data_82c54(unsigned char cnt_no)
{
      unsigned char cntl_byte;
      unsigned char read_byte;
      cntl_byte = 0;
      A0 = 1;
      A1 = 1;
    //gate = 0;
//counter latch模式
      //SC位
      if(cnt_no==0) {cntl_byte &= 0x3f;}
      else if(cnt_no==1) {cntl_byte &= 0x3f; cntl_byte |= 0x40;}
      else if(cnt_no==2) {cntl_byte &= 0x3f; cntl_byte |= 0x80;}
      //D5,D4位
      cntl_byte &= 0xcf;
      //写入
      P1 = cntl_byte;
      nCS = 0;
      nWR = 0;
      _nop_();
      nWR = 1;
      nCS = 1;
此处写锁在命令,一执行后,正常输出波形就没有了。

      //while(1);
//读总线
      _nop_();
      _nop_();
    //选择counter
      if(cnt_no==0) {A0 = 0; A1 = 0;}
      else if(cnt_no==1) {A0 = 1; A1 = 0;}
      else if(cnt_no==2) {A0 = 0; A1 = 1;}
      nCS = 0;
      nRD = 0;
      _nop_();
      _nop_();
      //读出
      read_byte = P1;
      _nop_();
      nRD = 1;
      nCS = 1;
      return read_byte;      
}



void main(void)      // 主程序
{
      uchar c1,c2;

    //system_init(); //系统初始化

      init_82c54();

      write_cntl_82c54(0,3);
      write_data_82c54(0,0x55);
                //write_cntl_82c54(0,3);
                //write_data_82c54(0,0x55);

      Delay400Ms();

      P3 = read_data_82c54(0);
}

max0147 发表于 2012-5-29 11:23:42

up..............

max0147 发表于 2012-5-30 12:38:53

up..............

qlasamour 发表于 2013-5-1 20:45:11

行的吗?

postek 发表于 2013-5-1 21:03:56

以前用82c53出pwm,想不起细节了,邦顶

qlasamour 发表于 2013-5-1 21:34:35

谢谢楼主

纯忆之年 发表于 2018-1-4 15:00:56

虽然时间有点久了,还是想弱弱的问一句:楼主的问题解决了吗,我最近也碰到跟你一样的问题了,一读8253芯片,输出就没有了

纯忆之年 发表于 2018-1-5 11:32:31

我的调试好了,把计数初值设置为16位的,然后读的时候读两次,就正常了,但是前面是把计数初值设置为8位的,读一次,就不正常,暂时还没想通为什么

woshigeshuai 发表于 2019-3-31 10:23:32

纯忆之年 发表于 2018-1-5 11:32
我的调试好了,把计数初值设置为16位的,然后读的时候读两次,就正常了,但是前面是把计数初值设置为8位的 ...

芯片资料上面说 读俩次

qtechzdh 发表于 2019-3-31 11:56:31

靠,还有人玩这个,我被这个坑货好多次
页: [1]
查看完整版本: 一个老芯片 INTEL 8253,读数据问题