Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Odkud pochází fotografka Anne Erhard?

V dnešní soutěži hrajeme o:



teplomer s DS18B20

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: teplomer s DS18B20

Autor: zajda ♂

20:21:34 04.02.2014

V kódu je špatná adresace portu D. Opravená část kódu vypadá takto. Předtím jsi vůbec nenadefinoval port pro 1 wire sběrnici. Proto to nejelo.

#asm
.equ __w1_port=0x12 // port D
.equ __w1_bit=6
#endasm

Citovat příspěvek

 

Re: teplomer s DS18B20

Autor: fuskyn

11:17:34 08.03.2011

Ahoj,
nepodařilo, neměl jsem čas se tím dále zabývat, ale tak jak tak se do toho chci znovu pustit a za každou cenu to nějak dokopat do funkčního stavu.

Citovat příspěvek

 

Re: teplomer s DS18B20

Autor: radek paos

10:13:31 08.03.2011

ahoj, podařilo se ti to nakonec rozchodit?

Citovat příspěvek

 

Re: teplomer s DS18B20

Autor: xyz3

13:37:50 30.11.2010

Oprava:

http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf

Citovat příspěvek

 

Re: teplomer s DS18B20

Autor: xyz3

13:36:59 30.11.2010

Komunikace s DS18B20 je triviální, ale potřebuje to tyto věci:
1) Je nutné zapojit pull-up, tedy nastavit PORTx na 1
2) Naučit se měřit čas s přesností na 1 mikrosekundu, je nutno zjistit zda funkce delay_us funguje správně
3) Musíte nevyhnutelně dodržet obrázky na straně 15,16,17
4) Je vhodné kontrolovat CRC

http://cs.wikipedia.org/wiki/Selection_sort

Citovat příspěvek

 

Re: teplomer s DS18B20

Autor: fuskyn

8:28:36 11.11.2010

Asi nerozumim co tim chcete naznacit. Co jsou to "vsechny casove smycky generovane procesorem", nedokazu posoudit, zdali trvaji stejnou dobu. Jedu na 16 MHz, pouzivam externi oscilator.
DS18B20 urcite pojede na PinD4, - nerozumim proc se na to ptate.

Citovat příspěvek

 

Re: teplomer s DS18B20

Autor: jfoot

22:20:50 10.11.2010

ZdraVím Vás,

pro DS18B20 je důležité časování 1 Wire sběrnice. Máte jistotu, že všechny časové smyčky generované procesorem opravdu v reálu trvají tak, jak to předepisuje datasheet pro DS18B20, (jedete realně na 16 MHz : fuses, int. ext oscilator frekvence) ?

Btw , funguje DS18B20 na PinD 4 jak to požaduje EVB?

jfoot

Citovat příspěvek

 

teplomer s DS18B20

Autor: fuskyn

8:48:17 01.11.2010

Zdravim, dotaz:
jsem zacatecnik a zkousim ruzna zapojeni s ATMega32, koupil jsem si vyvojovy kit EvB a dale pouzivam codevisionAVR. Potreboval bych pripojit teplotni cidlo DS18B20 na port D, pin 6. Mam zbastleny ovladaci program, ktery to cele nejak zpracuje a posle udaj na LCD, po kompilaci OK, ale kyzeny vysledek se nedostavuje. A nejsem si jisty, jestli mam spravne nastaveny port, viz. tento code :

[code]
#asm
.equ __w1_port=0xff // port D
.equ __w1_bit=3
#endasm
[/code]

Diky za pripominky

Jinak cely ovladaci programek jsem odnekud stahnul a trochu upravil, je zde :
[code]
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.9a Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : DS18B20_demo
Version : 1.0
Date : 31.10.2010
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type : ATmega32
Program type : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*****************************************************/

#include
#include

// Alphanumeric LCD Module functions
#include

#asm
.equ __w1_port=0xff // port D
.equ __w1_bit=6
#endasm
#include

#define PD6 0x40 // na PD6 je připojeno čidlo
#define TX DDRD |= PD6;
#define RX DDRD &= ~PD6;
#define RXPIN PIND&PD6

// provede reset a test prezence ds-18b20 na sbernici
unsigned char ow_detect_presence(void) {
unsigned char out=1; // vychozi navratova hodnota
RX; // vychozi stav sbernice
delay_us(1000); // pro ustaleni
TX; // bus low
delay_us(480); // cas pro prikaz reset
RX; // uvolneni sbernice
delay_us(70); // cekani na potvrzeni teplomerem
if(RXPIN) out=0; // pokud detekovana log.1, tak teplomer na sbernici neni
delay_us(410); // pauza pred dalsi komunikaci
return out; // vrati stav 1=teplomer nalezen, 0=teplomer nenalezen
}

// posle na sbernici log.1
void ow_write_one(void) {
TX; // bus low
delay_us(6); // pauza definujici log.1
RX; // uvolneni sbernice
delay_us(64); // pauza pred dalsi komunikaci
}

// posle na sbernici log.0
void ow_write_zero(void) {
TX; // bus low
delay_us(60); // pauza definujici log.0
RX; // uvolneni sbernice
delay_us(10); // pauza pred dalsi komunikaci
}

// precte jeden bit ze sbernice
unsigned char ow_read_bit(void) {
unsigned char out=0; // vychozi navratova hodnota bitu
TX; // bus low
delay_us(6); // pauza pro stav cteni
RX; // uvolneni sbernice
delay_us(9); // pauza pro reakci teplomeru
if(RXPIN) out=1; // test stavu sbernice, vlastni cteni
delay_us(55); // pauza pred dalsi komunikaci
return out; // prectena hodnota, 1 nebo 0
}

// odesle na sbernici jeden byte. Odesila se prvni LSB
void ow_write_byte(unsigned char tosend) {
int n=8;
while(n--) {
if(tosend&1) ow_write_one(); else ow_write_zero();
tosend >>= 1;
}
}

// prijde ze sbernice jeden byte. Prijima jako prvni LSB.
unsigned char ow_read_byte(void) {
int n=8, out=0;
while(n--) {
out >>= 1; // bitovy posuv doprava
if(ow_read_bit()) out |= 0x80; // nastaveni nejvyssiho bitu na 1
}
return out;
}

// nacte teplotu z teplomeru a vrati ji ve formatu 1000+t*10
// priklad: 23.5°C = 1235, -10.5°C = 895
// tento format lze snadneji zpracovavat nez nejake floaty (zerou moc pameti)
unsigned int zmer(void) {
unsigned char data_lo, data_hi, desetiny;
signed char teplota;
unsigned int tmp = 0;
//cli();
#asm ("cli"); // Zakaze vsechna preruseni
ow_detect_presence();
ow_write_byte(0x0CC);
ow_write_byte(0x44);
delay_ms(300);
ow_detect_presence();
ow_write_byte(0x0CC);
ow_write_byte(0x0BE);
data_lo=ow_read_byte(); // 1. byte scratchpadu teplomeru = spodni byte teploty
data_hi=ow_read_byte(); // 2. byte scratchpadu teplomeru = horni byte teploty
teplota = (data_lo & 0x0F0) >> 4 | (data_hi & 0x0F) << 4 ; // signed teplota
tmp = 10 * teplota + 1000;
desetiny = (data_lo & 0x0F) * 0.625;
if(tmp<1000) tmp -= desetiny; else tmp += desetiny;
if((tmp<700)||(tmp>2200)) tmp=0;
//sei();
#asm ("sei"); // Povoleni preruseni
return (char)tmp;
}

void main(void)
{
// Declare your local variables here
char temperature = zmer();

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
{
// Place your code here
lcd_puts(&temperature);
}
}

[/code]

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: