logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c] Atmeaga16, LCD 2x16, DS18B20

nolab 02 Sie 2009 18:55 1953 4
  • #1 6849351
    nolab
    Poziom 13  
    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
    
    
    #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
  • #2 6849721
    zumek
    Poziom 39  
    nolab napisał:
    ... to wyświetla "Brak pomiaru".

    
    #define CLEAR_1WIRE DDRD&=~_BV(WE)
    #define SET_1WIRE   DDRD|=_BV(WE)
    


    Zamień miejscami etykiety lub działania ;)
  • #3 6849767
    nolab
    Poziom 13  
    że tak powiem.. na innym forum kazali ustawić tak.
    wcześniej miałem

    
    #define CLEAR_1WIRE DDRD|=_BV(WE)
    #define SET_1WIRE   DDRD&=~_BV(WE)
    


    Ale wtedy miałem temperaturę 0.0 przy podłączonym czujniku, a jak go odłączyłem było -0.1.
    Jak odłączę rezystor to pokazuję się "Brak pomiaru".
  • Pomocny post
    #4 6849849
    zumek
    Poziom 39  
    nolab napisał:

    wcześniej miałem

    
    #define CLEAR_1WIRE DDRD|=_BV(WE)
    #define SET_1WIRE   DDRD&=~_BV(WE)
    
    No to dobrze miałeś.

    nolab napisał:

    Ale wtedy miałem temperaturę 0.0 przy podłączonym czujniku, a jak go odłączyłem było -0.1.
    Jak odłączę rezystor to pokazuję się "Brak pomiaru".

    Kolego nolab.
    Częstą przyczyną kłopotów z 1wire, są np. niewłaściwe opóźnienia, bo umieszczenie w kodzie _delay_us(500), nie zawsze jest równoznaczne z 500 uS opóźnieniem, itd.
    Temat z którym obecnie "walczysz", poruszany na tym forum był już tylokrotnie, że wystarczy trochę poszukać.
  • #5 6849955
    nolab
    Poziom 13  
    jestem początkującym jeżeli chodzi o uC.
    drugi dzień szukam i kombinuje...
REKLAMA