Witam oto mój program czy ktoś wie jak zrobić konwersje msb i lsb w ds18b20 żeby wyświetlić na siedmio segmentowym wyświetlaczu temperaturę ?
#include <avr/io.h>
//#include <avr/iom8.h>
#include <avr/interrupt.h>
//#include <stdlib.h>
//#include <string.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include "ds18B20.c"
volatile unsigned char a,b,c,d;
#define LEDA_OUTPUT() DDRC |= _BV(0)
#define LEDA_ON() PORTC&= ~_BV(0)
#define LEDA_OFF() PORTC|= _BV(0)
#define LEDB_OUTPUT() DDRC |= _BV(1)
#define LEDB_ON() PORTC&= ~_BV(1)
#define LEDB_OFF() PORTC|= _BV(1)
#define LEDC_OUTPUT() DDRC |= _BV(2)
#define LEDC_ON() PORTC&= ~_BV(2)
#define LEDC_OFF() PORTC|= _BV(2)
#define LEDD_OUTPUT() DDRC |= _BV(3)
#define LEDD_ON() PORTC&= ~_BV(3)
#define LEDD_OFF() PORTC|= _BV(3)
//w1-w4
#define W1_OUTPUT() DDRD |= _BV(7)
#define W1_ON() PORTD&= ~_BV(7)
#define W1_OFF() PORTD|= _BV(7)
#define W2_OUTPUT() DDRD |= _BV(6)
#define W2_ON() PORTD&= ~_BV(6)
#define W2_OFF() PORTD|= _BV(6)
#define W3_OUTPUT() DDRD |= _BV(5)
#define W3_ON() PORTD&= ~_BV(5)
#define W3_OFF() PORTD|= _BV(5)
#define W4_OUTPUT() DDRD |= _BV(4)
#define W4_ON() PORTD&= ~_BV(4)
#define W4_OFF() PORTD|= _BV(4)
void led_init(void)
{
LEDA_OUTPUT();
LEDB_OUTPUT();
LEDC_OUTPUT();
LEDD_OUTPUT();
LEDA_OFF();
LEDB_OFF();
LEDC_OFF();
LEDD_OFF();
W1_OUTPUT();
W2_OUTPUT();
W3_OUTPUT();
W4_OUTPUT();
W1_OFF();
W2_OFF();
W3_OFF();
W4_OFF();
}
void wyswietl(unsigned char a)
{
if(a==0)
{LEDD_ON();LEDC_ON();LEDB_ON();LEDA_ON();}
if(a==1)
{LEDD_ON();LEDC_ON();LEDB_ON();LEDA_OFF();}
if(a==2)
{LEDD_ON();LEDC_ON();LEDB_OFF();LEDA_ON();}
if(a==3)
{LEDD_ON();LEDC_ON();LEDB_OFF();LEDA_OFF();}
if(a==4)
{LEDD_ON();LEDC_OFF();LEDB_ON();LEDA_ON();}
if(a==5)
{LEDD_ON();LEDC_OFF();LEDB_ON();LEDA_OFF();}
if(a==6)
{LEDD_ON();LEDC_OFF();LEDB_OFF();LEDA_ON();}
if(a==7)
{LEDD_ON();LEDC_OFF();LEDB_OFF();LEDA_OFF();}
if(a==8)
{LEDD_OFF();LEDC_ON();LEDB_ON();LEDA_ON();}
if(a==9)
{LEDD_OFF();LEDC_ON();LEDB_ON();LEDA_OFF();}
if(a==10)
{LEDD_OFF();LEDC_OFF();LEDB_OFF();LEDA_OFF();}
}
SIGNAL (SIG_OVERFLOW1)
{
TCNT1 = 0xfec8; // przeładuj timer 1
W1_ON();
wyswietl(a);
_delay_ms(1);
W1_OFF();
W2_ON();
wyswietl(b);
_delay_ms(1);
W2_OFF();
W3_ON();
wyswietl(c);
_delay_ms(1);
W3_OFF();
W4_ON();
wyswietl(d);
_delay_ms(1);
W4_OFF();
}
void pomiar(void)
{
float celcius;
char msb,lsb,temp;
char tab[6];
ow_reset();
ow_write_byte(0xCC);
ow_write_byte(0x44);
_delay_ms(750);
ow_reset();
ow_write_byte(0xCC);
ow_write_byte(0xBE);
lsb = ow_read_byte();
msb = ow_read_byte();
ow_reset();
//******************************************************
KONWERSJA i wyświetlenie na led
próbowałem coś zrobić na itoa ale nie przyniosło to dobrego rozwiązania
//******************************************************
}
int main(void)
{
led_init();
TIMSK = _BV(TOIE1); // włącz obsługę przerwań T/C1
TCNT1 = 0xfec8; // wartość początkowa T/C1 0bdc=2s
TCCR1A = 0x00; // włącz tryb czasomierza T/C1
TCCR1B=(1<<CS12); // preskaler 256
a=0;
b=0;
c=0;
d=0;
sei();
while(1)
{
pomiar();
}
}