Witam,
Na wyświetlaczu zamiast temperatury widnieje 1279-nijak to się ma do temperatury(w pokoju jest wyższa o ładne 10 stopni). Stąd moje pytanie czy to czasy opóźnień mogą tak działać?
Poniżej kod:
pozdrawiam
Na wyświetlaczu zamiast temperatury widnieje 1279-nijak to się ma do temperatury(w pokoju jest wyższa o ładne 10 stopni). Stąd moje pytanie czy to czasy opóźnień mogą tak działać?
Poniżej kod:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include "1wire.h"
//==========================================LCD==================================================
#define F_CPU 16000000UL
#define F_OSC 16000000UL
#define cbi(sfr, b) (sfr &= ~(1<<b))
#define sbi(sfr, b) (sfr |= (1<<b))
#define LCD PORTA
#define LCDD DDRA
#define LCD2 PORTC
#define LCDD2 DDRC
#define E 6
#define RS 7
#define SET_E sbi(LCD2, E)
#define CLR_E cbi(LCD2, E)
#define SET_RS sbi(LCD2, RS)
#define CLR_RS cbi(LCD2, RS)
//////////////////////////////////////
void delay(void);
void write_to_lcd(char x);
void LCDkomenda(char L_dane);
void LCDznak(char L_dane);
void LCD_clr(void);
void LCDnapis(char * s);
void LCD_xy(char x, char y);
void LCD_putint(int L_liczba);
//NA 2 CZUJNIKI POMIAROWE
signed char TLs[2];
signed char THs[2];
static inline void delayloop16(unsigned int count)
{
asm volatile ( "cp %A0,__zero_reg__ \n\t" \
"cpc %B0,__zero_reg__ \n\t" \
"breq L_Exit_%= \n\t" \
"L_LOOP_%=: \n\t" \
"sbiw %0,1 \n\t" \
"brne L_LOOP_%= \n\t" \
"L_Exit_%=: \n\t" \
: "=w" (count)
: "0" (count)
);
}
#define DELAY_US_CONV(us) ((uint16_t)(((((us)*1000L)/(1000000000/F_OSC))-1)/4))
#define delay_us(us) delayloop16(DELAY_US_CONV(us))
/*void delay_us(unsigned int dl)
{
int i,j;
for(i=dl;i>=0;i--)
{
for(j=16;j>=0;j--)
asm volatile("nop");
}
}
*/
void delay_ms(unsigned int dl)
{
volatile int i;
for(i=dl;i>=0;i--)
{
delay_us(1000);
}
}
//short int x;
unsigned char gSensorIDs[2];
main()
{
LCDD=0xFF;
LCDD2=0xFF;
char i,j;
//clear
LCDkomenda(0x01);
//Function SET
LCDkomenda(0x2F);
//Display on
LCDkomenda(0x0F);
//Entry mode
LCDkomenda(0x06);
//return home
LCDkomenda(0x03);
//WYSZUKANIE ADRESU 1-WIRE
gSensorIDs[0]=OWFirst();
gSensorIDs[1]=OWNext();
THs[0]=45;
TLs[0]=10;
// ow_set_bus(DS_PORT1);
// if (gSensorIDs[0][0] != 255) config_18b20(TLs[0], THs[0], &gSensorIDs[0][0]);
delay_ms(1);
while(1)
{
if (gSensorIDs[0])
{
LCD_clr();
//ow_set_bus( DS_PORT1);
//LCD_18b20_multidrop(&gSensorIDs[0][0]);
ow_Send_Convert_Temp();
delay_ms(1000);
LCD_putint(ow_HiResTemp(gSensorIDs[0]));
delay_ms(2000);
}
else
{
LCD_clr();
LCDnapis("brak czujnika");
// ow_set_bus(DS_PORT1);
// search_sensors(&gSensorIDs[0][0]);
delay_ms(5000);
}
}
}
void delay(void)
{
//unsigned int iter2=0;
unsigned int iter=0;
//for(iter2=0;iter2<10;iter2++)
for(iter=0;iter<10000;iter++)asm("nop");
}
void write_to_lcd(char x)
{
SET_E; // ustaw na E stan wysoki
LCD = ((LCD & 0x0F) | (x & 0xF0)); // zapis pierwszej połówki bajtu
CLR_E; // opadające zbocze na E -> zapis do wyświetlacza
//delay();
SET_E; // ustaw na E stan wysoki
LCD = ((LCD & 0x0F) | ((x & 0x0F) << 4)); // zapis drugiej połowki bajtu
CLR_E; // opadające zbocze na E -> zapis do wyświetlacza
PORTB=0x01;
delay();
PORTB=0x00;
delay();
}
void LCDkomenda(char L_dane)
{
CLR_RS; // niski stan na RS -> zapis instrukcji
write_to_lcd(L_dane); // zapis do LCD
}
void LCDznak(char L_dane)
{
SET_RS; // niski stan na RS -> zapis instrukcji
write_to_lcd(L_dane); // zapis do LCD
}
void LCD_clr(void)
{
//clear
LCDkomenda(0x01);
LCD_xy(0,0);
}
void LCDnapis(char * s)
{
while(*s) // do napotkania 0
{
LCDznak(*s); // zapisz znak wskazywany przez s na LCD
s++; // zwiększ s (przygotuj nastepny znak)
}
}
void LCD_xy(char x, char y)
{
switch(y)
{
case 1: y=0x40; break;
case 2: y=0x14; break;
}
LCDkomenda(0x80+y+x);
}
void LCD_putint(int L_liczba)
{
char tab[10];
sprintf(tab,"%d",L_liczba);
LCDnapis(tab);
}
pozdrawiam