Hi, ich benutze ein Atmel Evaluationboard V2.0, mit einem ATmega16 (8 MHz Quarz) und einem 1-wire-Tempsensor (DS1820). Header für temp sensor: #asm .equ __w1_port=0x18 .equ __w1_bit=0 #endasm #include<ds1820.h> jetzt habe ich zur Probe den C-Code aus dem CodeVisionAVR-Manual geschrieben. Der Tempsenor wird auch erkannt, doch in dem CodeVision-Termial ( über RS232 ) wird mir immer der gleiche Wert angezeigt: 1023.5 folgender C-Code wird zur Ausgabe benutzt: while(1) { for(i=0;i<devices;) { temp=ds1820_temperature_10(&rom_code[i][0]); j='+'; if(temp<0) { j='-'; temp=-temp; } printf("t%u=%c%i.%u\n\r",++i,j,temp/10,temp%10); } } WARUM ändert sich der Wert nicht, bei unterschiedlichen Temperaturen?? Kann mir bitte jemand helfen. den code habe ich angehängt
du proggst C in basic hätte ich dir helfen können. gruss Nixweiss.
das habe ich von einer japanischen webseite gefischt. hatte eigentlich bascom-code gesucht und auch gefunden. ich hoffe du kannst was damit anfangen. #include <iom8v.h> //和单片机类型相对应的头文件,选择Atmega8做实验; #include <macros.h> #define uchar unsigned char #define uint unsigned int void init_1820(); write_1820(uchar x); uchar read_1820(); void send_byte(uchar x); void delay(uint x); void disp_led(uchar buffer,uchar control); uchar disp_table[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar dp; long count; void main(void) //主函数 { disp_led(0,0); delay(2000); OSCCAL=0X9d;//系统时钟校准,不同的芯片和不同的频率, DDRC=0xff; DDRD=0XFF; PORTD=0XFF; WDR(); //看门狗计数清零 WDTCR=0x0F; PORTC=0xff; while(1) { uchar i,temh,teml; init_1820(); //复位18b20 write_1820(0xcc); // 发出转换命令 write_1820(0x44); delay(400); init_1820(); WDR(); write_1820(0xcc); //发出读命令 write_1820(0xbe); teml=read_1820(); //读数据 temh=read_1820(); //for(i=0;i<7;i++) //测试用 //{ //send_byte(0x40); //send_byte(disp_table[0&0x0f]); //} //send_byte(disp_table[temh>>4]); //send_byte(disp_table[temh&0x0f]); //send_byte(disp_table[teml>>4]); //send_byte(disp_table[teml&0x0f]); count=(temh*256+teml)*6.25; //计算具体温度 WDR(); disp_led(0,1); //显示温度 for(i=0;i<100;i++) //每次转换需要延时200ms以上 delay(1000); } } void delay(uint x) //1.5us左右 { while(x) { x--; } } void init_1820() { PORTD|=(1<<6); PORTD&=~(1<<6); delay(3000); //480us以上 PORTD|=(1<<6); DDRD&=~(1<<6); delay(40); //15~60us while(PIND&(1<<6)) { // disp_led(3,0); // for(;;) //{} } DDRD|=(1<<6); PORTD|=(1<<6); delay(150); //60~240us } write_1820(uchar x) { uchar m; for(m=0;m<8;m++) { PORTD&=~(1<<6); if(x&(1<<m)) //写数据,从低位开始 PORTD|=(1<<6); else PORTD&=~(1<<6); delay(40); //15~60us PORTD|=(1<<6); } PORTD|=(1<<6); } uchar read_1820() { uchar temp,k,n; temp=0; for(n=0;n<8;n++) { PORTD&=~(1<<6); //delay(2); PORTD|=(1<<6); //delay(3); DDRD&=~(1<<6); k=(PIND&(1<<6)); //读数据,从低位开始 if(k) temp|=(1<<n); else temp&=~(1<<n); delay(50); //60~120us DDRD|=(1<<6); } return (temp); } void send_byte(uchar x) //以下为显示程序 { uchar i; for(i=0;i<8;i++) { PORTC&=~(1<<5); // PC5为底 为164提供时钟信号 if((x&(1<<(7-i)))||((dp==1)&&(i==0))) //判断每位数据的电平,及小数点判断 PORTC|=(1<<4); //若为高着PC4输出高电平 else PORTC&=~(1<<4); //若为低着输出低电平 PORTC|=(1<<5); //PC5 提供始终信号 } //PORTC|=((1<<0)|(1<<1)|(1<<2)); } //显示程序 CONTROL为控制显示 BUFFER为显示数据 void disp_led(uchar buffer,uchar control) { uchar i,temp[6]; uint tempcount; dp=0; switch(control) { case 0: //CONTROL为零全部数码管显示buffer { for(i=0;i<11;i++) send_byte(disp_table[buffer%10]);//显示数字 break; } case 1: //control为1,显示count中的数据为6位 { tempcount=count; for(i=0;i<6;i++) //取出每位中的数据 { temp[i]=tempcount%10; tempcount/=10; } send_byte(disp_table[buffer/10]); //最开始显示buffer数据 send_byte(disp_table[buffer%10]); send_byte(0x00); send_byte(0x00); send_byte(0x00); for(i=0;i<6;i++) { if(i==3) dp=1; //小数点控制位 send_byte(disp_table[temp[5-i]]); dp=0; } break; } } PORTC|=(1<<4); }
Einmal genügt doch, oder? Beitrag "Kennt sich irgendwer mit CVAVR aus, geht um DS1820" 1.) bist Du Dir sicher, dass der Sensor erkannt wird? 2.) Verzichte mal auf Rom-Search (sofern überhaupt verwendet) und spreche den Sensor direkt an 3.) Hast Du die Möglichkeit zu debuggen? Dann sollte sich das Problem schnell lösen lassen!!!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.