[an error occurred while processing this directive]
Ответ: cod
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено s-shev 17 сентября 2003 г. 19:01
В ответ на: Ожибка в твоём коде (99,9%). Покажи фрагмент кода отправлено bzx 17 сентября 2003 г. 18:53

// The following are standard 1-Wire routines.

#include "lcd.h"

const char sensor=3; //sensor=3 PORTB3
static int tg;

void ds1820(void)
{
unsigned char i; //sensor=3 PORTB3
unsigned char lob=0, hib=0, buff[9];
signed char temp=0;
_1w_init(sensor);
write_byte(0xCC, sensor); // skip ROM
write_byte(0x44, sensor); // perform temperature conversion
_1w_strong_pull_up(sensor);
_1w_init(sensor);
write_byte(0xCC, sensor); // skip ROM
write_byte(0xBE, sensor); // read the result
for (i=0; i<9; i++)
{
buff[i]=read_byte(sensor);
}
delay(10); //delay 75 us
lob=buff[0];
hib=buff[1];
if(hib<=0x80)
{
temp=(lob/2);
}
hib=hib&0x80;
if(hib>=0x80)
{
temp=(~lob+1);
temp=(temp/2);
temp=((-1)*temp);
}
tg=temp;
lcd_goto(SW_LINE+10);
put_val_t(tg);
}
void _1w_init(char sensor)
{
unsigned char i;
TRISB &= ~Bit(sensor); //RBsensor out
RB3 = 0; //RBsensor low Reset
for(i=0;i<60;i++); //delay 510 us (480 min)
RB3 = 1; //RBsensor hi
for(i=0;i<5;i++); //delay 60 us (15-60)us
TRISB |= Bit(sensor); //RB3 in
for(i=0;i<50;i++); //delay 420 us
}

char read_bit(char sensor)
{
char val;
TRISB &= ~Bit(sensor); // RBsensor out
RB3 = 0;
RB3 = 1;
asm("nop"); // delay ~5us from start of timeslot
// asm("nop");
// asm("nop");
TRISB |= Bit(sensor); // RB3 in
val=RB3;
return(val);
}

char read_byte(char sensor)
{
char i;
char value=0;
for (i=0; i<8; i++)
{
if(read_bit(sensor)) value|=0x01< delay(4);
}
return(value);
}

void write_bit(char bitval)
{
TRISB &= ~Bit(sensor); // RBsensor out
RB3=0;
if(bitval==1)RB3=1;
delay(4); // delay 55 us
RB3=1; // RBsensor hi
TRISB |= Bit(sensor);
}

void write_byte(char val, char sensor)
{
unsigned char i, temp;
TRISB &= ~Bit(sensor); // RBsensor out
for(i=0; i<8; i++) // write byte, one bit at a time
{
temp=val>>i; // shifts val right 'i' space
temp &= 0x01; // copy that bit to temp
write_bit(temp); // write bit in temp into
}
delay(8); // delay 100 us
TRISB |= Bit(sensor); // RB3 in
}
void _1w_strong_pull_up(char sensor) // bring DQ to strong +5VDC
{
TRISB &= ~Bit(sensor); // RBsensor out
PORTB = 0x01 << sensor;
delay(50); //delay 500 us
TRISB |= Bit(sensor);
}

// adc routines

#include "lcd.h"
const float a[12]={3.56,3.6,3.412,5.56,5.76,5.86,5.56,3.92,5.6,5.56,5.64,5.6};
static float uf;
void test(void)
{
// float a[12]={3.56,3.6,3.412,5.56,5.76,5.86,5.56,3.92,5.6,5.56,5.64,5.6};
float u=0.0;
int u_conv=0;
char i;
for(i=0;i<12;i++)
{
channel(i); //Measuring channel 0
u_conv=adc_conv();
uf=u_conv;
uf*=5.0;
uf/=1024.0;
u=uf*a[i];
if(fabs(2.5-uf)<0.2)
put_val_test(u,i);
else
{
put_val_err(u,i);
while(RB4==1)
{
NOP();
}
lcd_clear();
}
delay_ms(500);
}
}
void init_adc(void)
{
VCFG1=0; //
VCFG0=0; // Voltage Reference Configuration bits (AVdd-AVss)
PCFG3=0; //
PCFG2=0; //
PCFG1=0; //
PCFG0=0; // A/D Port Configuration Control bits (AN0-RA0)
ADCS2=1; //
ADCS1=0; //
ADCS0=1; // A/D Conversion Clock Select bits (Fosc/16)
ADFM=1; // A/D Result Format Select bit (1-Rinht justified)
ADON=1; // 1=A/D converter module is enabled
ADIF=0; // Clear ADIF Flag bit
ADIE=0; // Disables the A/D interrupt
delay_10us(3);
}
int adc_conv(void)
{
int v=0;
delay_10us(3);
ADIF=0; //Clear ADIF Flag bit
GO_DONE=1; // Start A/D conversion
while(GO_DONE)
{
NOP();
}
v=ADRESH<<8;
v=v|ADRESL;
ADIF=0;
return(v);
}
void adc_conv1(void)
{
int v=0;
// float uf=0.0;
channel(0);
delay_10us(3);
ADIF=0; //Clear ADIF Flag bit
GO_DONE=1; // Start A/D conversion
while(GO_DONE)
{
NOP();
}
v=ADRESH<<8;
v=v|ADRESL;
ADIF=0;
uf=v*5.0;
uf/=1024.0;
uf*=3.56;
lcd_goto(SW_LINE);
put_val_u(uf);
}
void channel(char n)
{
switch(n)
{
case 0:
CHS3=0; //
CHS2=0; //
CHS1=0; //
CHS0=0; // Analog Channel Select bits (AN0-RA0)
break;
case 1:
CHS3=0; //
CHS2=0; //
CHS1=0; //
CHS0=1; // Analog Channel Select bits (AN1-RA1)
break;
case 2:
CHS3=0; //
CHS2=0; //
CHS1=1; //
CHS0=0; // Analog Channel Select bits (AN2-RA2)
break;
case 3:
CHS3=0; //
CHS2=0; //
CHS1=1; //
CHS0=1; // Analog Channel Select bits (AN3-RA3)
break;
case 4:
CHS3=0; //
CHS2=1; //
CHS1=0; //
CHS0=0; // Analog Channel Select bits (AN4-RA5)
break;
case 5:
CHS3=0; //
CHS2=1; //
CHS1=0; //
CHS0=1; // Analog Channel Select bits (AN5-RF0)
break;
case 6:
CHS3=0; //
CHS2=1; //
CHS1=1; //
CHS0=0; // Analog Channel Select bits (AN6-RF1)
break;
case 7:
CHS3=0; //
CHS2=1; //
CHS1=1; //
CHS0=1; // Analog Channel Select bits (AN7-RF2)
break;
case 8:
CHS3=1; //
CHS2=0; //
CHS1=0; //
CHS0=0; // Analog Channel Select bits (AN8-RF3)
break;
case 9:
CHS3=1; //
CHS2=0; //
CHS1=0; //
CHS0=1; // Analog Channel Select bits (AN9-RF4)
break;
case 10:
CHS3=1; //
CHS2=0; //
CHS1=1; //
CHS0=0; // Analog Channel Select bits (AN10-RF5)
break;
case 11:
CHS3=1; //
CHS2=0; //
CHS1=1; //
CHS0=1; // Analog Channel Select bits (AN11-RF6)
}
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru