最近做了一个ATMEGA128
单片机的DS2431
芯片的读写,不知道为什么我读到的数全是1,而且我检查出来 是复位时没有检测到拉低信号,我是按照DATASHEET上的时序写的,时间长度我也用示波器勾过了,在它的时序范围内。请大神帮忙检查一下哪里出了问题。
复位程序:
//1-Wire器件复位,并检查应答;有应答返回0,无应答返回1
unsigned char Reset(void)
{
DS_DQ_OUT; //设置端口为输出
DS_DQ1;
NOP();
DS_DQ0; //复位低脉冲保持
delay1_nus(600); //延时 530us
DS_DQ1; //释放总线
delay1_nus(70); //延时64us后读应答
DS_DQ_IN; //设置端口为输入
if(DS_DQ) //判断wire状态
{
return(1);
}
else
{ beep(); //设置蜂鸣器检查程序是否运行到这里,结果蜂鸣器并没有响
delay1_nus(500); //延时450us
return(0);
}
}
- //环境:winavr+avr studio
-
- char temp=0;
- ISR(TIMER1_COMPA_vect )//中断函数
- {
- // user code here
- temp++;
- if (temp==10)
- temp=0;
- PORTA=temp;
- DDRA=0xff;
- }
- void mytimer_init(void)
- {
- //关总中断
- cli();
- //TCCR1A为配置引脚输出模式,这里取默认为0,未连接即可,因此不需要为其赋值
- //T/C1时钟源选择为clk/64,CLK现为内部晶振4MHZ,因此时钟为4,000,000/64 HZ = 62500 HZ
- TCCR1B &= ~0x07;
- TCCR1B |= 0x03;
- //选择模式 WGM10~WGM13
- TCCR1A &= ~0x03;
- TCCR1B &= ~(0x03<<3);//模式4 CTC
- TCCR1B |= 0x01<<3;
- //赋值定时初值 16位
- TCNT1=0;
- //赋值比较寄存器TOP初值 16位 ,在以上工作模式下,当TCNT1=OCR1A时,TCNT1自动清0
- OCR1A = 62500;//一秒中断一次
- //使能定时器T/C1溢出中断,T/C1的其它中断屏蔽掉
- TIMSK &= ~(0xf0<<2);
- TIMSK |= (0x01<<4);
- ETIMSK &= ~0x01;
- //清中断溢出标志位,进入中断后也会自动清除,以后不用再清了
- TIFR |= 1<<2;
- //启动定时器
- SFIOR &= 0x7e;
- //开总中断
- sei();
- }
复制代码跟我问的毫无关系
一周热门 更多>