Witam,
próbuje uruchomić termometr na 1 wire wykorzystując układ DS18B20 i ATmega16.
Wyświetlacz podpięty do portu A, sterowany 4bitach, działa poprawnie.
DS18B20 - GND do GND , VCC do VCC, Data do Port D Pin 0 z rezystorem 4k7 podciągniętym do VCC.
Na wyświetlaczu jak DS jest podpięty to pokazuje się "Brak pomiaru" , jak nie jest podpięty to również "Brak pomiaru".
Jak odłączę rezystor podciągający to wyświetla "Brak pomiaru".
Kwarc ustawiony na wewnętrzny 1MHz (chyba :mrgreen: )
Kod źródłowy programu
Log z kompilacji
Zrzut z programu ISP Prog
![[c] Atmeaga16, LCD 2x16, DS18B20 [c] Atmeaga16, LCD 2x16, DS18B20](https://img507.imageshack.us/img507/8946/nowyobrazmapabitowapeh.th.jpg)
próbuje uruchomić termometr na 1 wire wykorzystując układ DS18B20 i ATmega16.
Wyświetlacz podpięty do portu A, sterowany 4bitach, działa poprawnie.
DS18B20 - GND do GND , VCC do VCC, Data do Port D Pin 0 z rezystorem 4k7 podciągniętym do VCC.
Na wyświetlaczu jak DS jest podpięty to pokazuje się "Brak pomiaru" , jak nie jest podpięty to również "Brak pomiaru".
Jak odłączę rezystor podciągający to wyświetla "Brak pomiaru".
Kwarc ustawiony na wewnętrzny 1MHz (chyba :mrgreen: )
Kod źródłowy programu
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"
#define WE 0
#define PORT_1WIRE PIND
#define CLEAR_1WIRE DDRD&=~_BV(WE)
#define SET_1WIRE DDRD|=_BV(WE)
char buf[8];
// reset magistrali
unsigned char RESET_PULSE(void)
{
unsigned char PRESENCE;
CLEAR_1WIRE;
_delay_us(500);
SET_1WIRE;
_delay_us(30);
if (bit_is_clear(PORT_1WIRE, WE)) PRESENCE=1; else PRESENCE=0;
_delay_us(470);
if (bit_is_set(PORT_1WIRE, WE)) PRESENCE=1; else PRESENCE=0;
return PRESENCE;
}
void send(char bit)
{
CLEAR_1WIRE;
_delay_us(5);
if(bit==1)
SET_1WIRE;
_delay_us(80);
SET_1WIRE;
}
unsigned char read(void)
{
unsigned char PRESENCE=0;
CLEAR_1WIRE;
_delay_us(2);
SET_1WIRE;
_delay_us(15);
if (bit_is_set(PORT_1WIRE, WE)) PRESENCE=1; else PRESENCE=0;
return (PRESENCE);
}
unsigned send_byte(char wartosc)
{
unsigned char i;
unsigned char pom;
for (i=0; i<8; i++)
{
pom = wartosc>>i;
pom &= 0x01;
send(pom);
}
_delay_us(100);
}
unsigned char read_byte(void)
{
unsigned char i;
unsigned char wartosc = 0;
for (i=0; i<8; i++)
{
if(read()) wartosc|=0x01<<i;
_delay_us(15);
}
return (wartosc);
}
int main (void)
{
unsigned char sprawdz;
char temp1=0, temp2=0;
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_puts("1 Wire\n");
_delay_ms(200);
for(;;) {
sprawdz=RESET_PULSE();
if (sprawdz == 1)
{
send_byte(0xCC);
send_byte(0x44);
_delay_ms(750);
sprawdz=RESET_PULSE();
send_byte(0xCC);
send_byte(0x44);
temp1=read_byte();
temp2=read_byte();
sprawdz=RESET_PULSE();
float temp=0;
temp=(float)(temp1+(temp2*256))/16;
dtostrf(temp,1,1,buf);
lcd_clrscr();
lcd_home();
lcd_puts(buf);
_delay_ms(200);
}
else
{
lcd_clrscr();
lcd_home();
lcd_puts("Brak pomiaru");
}
}
}
Log z kompilacji
> "make.exe" all
-------- begin --------
avr-gcc (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compiling: test_lcd.c
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test_lcd.lst -std=gnu99 -Wp,-M,-MP,-MT,test_lcd.o,-MF,.dep/test_lcd.o.d test_lcd.c -o test_lcd.o
test_lcd.c: In function `send_byte':
test_lcd.c:63: warning: control reaches end of non-void function
Compiling: lcd.c
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=lcd.lst -std=gnu99 -Wp,-M,-MP,-MT,lcd.o,-MF,.dep/lcd.o.d lcd.c -o lcd.o
Linking: test_lcd.elf
avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test_lcd.o -std=gnu99 -Wp,-M,-MP,-MT,test_lcd.o,-MF,.dep/test_lcd.elf.d test_lcd.o lcd.o --output test_lcd.elf -Wl,-Map=test_lcd.map,--cref -lm
Creating load file for Flash: test_lcd.hex
avr-objcopy -O ihex -R .eeprom test_lcd.elf test_lcd.hex
Creating load file for EEPROM: test_lcd.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O ihex test_lcd.elf test_lcd.eep
Creating Extended Listing: test_lcd.lss
avr-objdump -h -S test_lcd.elf > test_lcd.lss
Creating Symbol Table: test_lcd.sym
avr-nm -n test_lcd.elf > test_lcd.sym
Size after:
test_lcd.elf :
section size addr
.text 2652 0
.data 22 8388704
.bss 8 8388726
.noinit 0 8388734
.eeprom 0 8454144
.debug_aranges 40 0
.debug_pubnames 255 0
.debug_info 2352 0
.debug_abbrev 807 0
.debug_line 1744 0
.debug_str 536 0
.debug_ranges 12 2652
Total 8428
Errors: none
-------- end --------
> Process Exit Code: 0
> Time Taken: 00:01
Zrzut z programu ISP Prog
![[c] Atmeaga16, LCD 2x16, DS18B20 [c] Atmeaga16, LCD 2x16, DS18B20](https://img507.imageshack.us/img507/8946/nowyobrazmapabitowapeh.th.jpg)
