Hallå alla matematiker

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Fredrick skrev:Jo visst men hur gör jag det?

PIC´en vill ju inte äns veta av tal med decimaler.


Är jag den ända här som försöker läsa ut temeraturen från en PIC?
Eftersom PIC16F84 är en 8-bits µC, så finns det egentligen bara tal mellan 0-255, allt annat är trolleri som gömmer sig bakom kopileringen.

Pulsin-kommandor i PICBasic är inget att hurra för, det är detta som tar bort onogrannheten i ditt fall. Skriv en egen rutin för att läsa av pulserna istället så blir det säkert mycket bättre.

Visst, jag har själv en fungerande tempsensor här framför mig, en DS18B20, en PIC och en 4x20 LCD. Jag får 0,0625°C upplösning utan problem. Det handlar ju bara om vilken metod man vill använda sig av.
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Du har väl inte givit upp hoppet va?

Jag tycker du ska testa ful-lösningen som RDX* föreslog.

Om du inte håller på med något annat så kan du använda polling för att mäta upp Tx.
Dvs. du gör en loop som bara räknar upp ett register så länge T1 är hög. På detta sätt kan du själv "ställa in" din noggrannhet.

Jag gissar på att du får värden på typ 500.

Om du får rimliga värden så installera flyttals-biblioteket som jag länkade till så får du lära dig det oxå.

En bättre lösning är att göra ett portchange interrupt och använda hårdvaru-timern.
Men man måste trixa lite om man vill simulera en 16bitars timer.
Fredrick
Inlägg: 342
Blev medlem: 9 januari 2004, 23:12:33

Inlägg av Fredrick »

Jag ger upp och införskaffar mig en DS 18S20 istället.

Dom skall tydligen fungera bättre ihop med PBP

Hittade ett exempel program på Melabs.com där programmet skrev ut temperaturen med 2 decimaler på en LCD
danei
EF Sponsor
Inlägg: 27419
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Det är inte processorn som är problemet. Det är ditt program.
Fredrick
Inlägg: 342
Blev medlem: 9 januari 2004, 23:12:33

Inlägg av Fredrick »

Precis, där skrev jag att DS 18S20 fungerar bättre ihop med PBP
Processorn är fortfarande densamma
danei
EF Sponsor
Inlägg: 27419
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

:?:
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1652
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Inlägg av RDX* »

Han byter tempsensor till DS 18S20, den använder seriellt interface istället för duty cyckle.
danei
EF Sponsor
Inlägg: 27419
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Aha det var tempsensorn han snackade om. Tack
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg av EagleSpirit »

men det är inte helt smärtfritt att jobba med ds18B20 varianten heller. Iofs vet jag inte hur det är med pic basic men i assembler kan det bli lite tråkigt. Så jäkla många register som måste användas för att det ska bli rätt.

Är det någon som försökt sig på att upptäcka 64-bit koderna med hjälp av den där test-metoden?
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

EagleSpirit: Menar du "Search ROM"-rutinen?

Har suttit och försökt kommit på någon smart metod för att lösa det så smidigt som möjligt. Men sen insåg jag att jag troligtvis inte skulle kunna göra det bättre än koden här nedan skriven av någon "Peter Dannegger", som jag troligtvis hittade på avrfreaks.net . Koden är något modifierad för att passa till mina övriga 1-wire-rutiner.

Koden är visserligen skriven i C för AVR, men idén borde du kunna porta till Asm för PIC.

Kod: Markera allt

uint8_t ow_search_rom(uint8_t diff, uint8_t *id)
{
	uint8_t i, j, next_diff;
	char b;
	
	if (ow_reset())
		return 0xFF;			// error, no device found
  
	ow_write_byte(0xF0);			// ROM search command
	next_diff = 0x00;			// unchanged on last device
	i = 8 * 8;					// 8 bytes
  
	do
	{
		j = 8;					// 8 bits
		do
		{
			b = ow_read_bit();			// read bit
			if (ow_read_bit())
			{			// read complement bit
				if (b)					// 11
					return 0xFF;			// data error
			}
			else
			{
				if (!b)
				{				// 00 = 2 devices
					if (diff > i || ((*id & 1) && diff != i))
					{
						b = 1;				// now 1
						next_diff = i;			// next pass 0
					}
				}
			}
	  
			ow_write_bit(b);     			// write bit
			*id >>= 1;
			if (b)					// store bit
				*id |= 0x80;
			i--;
		}while (--j);
		
		id++;					// next byte
	
	}while (i);
  
	return next_diff;				// to continue search
}
Kod för att anropa ow_search_rom() för varje 1-wire-enhet:

Kod: Markera allt

void search_rom()
{
	uint8_t id[8], diff;
	uint8_t buf[3];
	int8_t i;

	for (diff = 0xFF; diff != 0x00;)
	{
		if ((diff = ow_search_rom(diff, id)) != 0xFF)
		{
			for (i=7;i>=0;i--)
			{
				itoa(id[i], buf, 16);
				if (id[i] < 0x10)
				{
					buf[1] = buf[0];
					buf[0] = '0';
				}
				buf[2] = '\0';
				lcd_string(buf);
			}
		}
	}
}
Någon som har en ännu bättre lösning?
Senast redigerad av cykze 30 augusti 2004, 17:00:12, redigerad totalt 1 gång.
Fredrick
Inlägg: 342
Blev medlem: 9 januari 2004, 23:12:33

Inlägg av Fredrick »

Så här ser en lösning ut i PBP kod från Melabs.com den borde ju fungera eftersom det är ett exempel program som melabs själva har skrivit eller iallafall testat.

Ser ju inte så avancerat ut eller hur....

Kod: Markera allt

' One-wire temperature for LAB-X1 and DS1820

' This program must be compiled with PBP version 2.40 or later


temperature VAR	WORD			' Temperature storage
count_remain VAR BYTE			' Count remaining
count_per_c VAR	BYTE			' Count per degree C

DQ	VAR	PORTC.0			' One-wire data pin


' Define LCD registers and bits
DEFINE	LCD_DREG	PORTD
DEFINE	LCD_DBIT	4
DEFINE	LCD_RSREG	PORTE
DEFINE	LCD_RSBIT	0
DEFINE	LCD_EREG	PORTE
DEFINE	LCD_EBIT	1


	ADCON1 = 7			' Set PORTA and PORTE to digital
	Low PORTE.2			' LCD R/W line low (W)


mainloop: OWOut DQ, 1, [$CC, $44]       ' Start temperature conversion

waitloop: OWIn DQ, 4, [count_remain]	' Check for still busy converting
	IF count_remain = 0 Then waitloop

	OWOut DQ, 1, [$CC, $BE]		' Read the temperature
        OWIn DQ, 0, [temperature.LOWBYTE, temperature.HIGHBYTE, Skip 4, count_remain, count_per_c]

	' Calculate temperature in degrees C to 2 decimal places (not valid for negative temperature)
	temperature = (((temperature >> 1) * 100) - 25) + (((count_per_c - count_remain) * 100) / count_per_c)
	LCDOut $fe, 1, DEC (temperature / 100), ".", DEC2 temperature, " C"

	' Calculate temperature in degrees F to 2 decimal places (not valid for negative temperature)
	temperature = (temperature */ 461) + 3200
	LCDOut $fe, $c0, DEC (temperature / 100), ".", DEC2 temperature, " F"

        Pause 1000                      ' Display about once a second

	GoTo mainloop			' Do it forever
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

EagleSpirit skrev:men det är inte helt smärtfritt att jobba med ds18B20 varianten heller. Iofs vet jag inte hur det är med pic basic men i assembler kan det bli lite tråkigt. Så jäkla många register som måste användas för att det ska bli rätt.

Är det någon som försökt sig på att upptäcka 64-bit koderna med hjälp av den där test-metoden?
Det har gått smärtfritt för min del, med PBP.

Om du bara använder en enhet på 1-wirebussen då behöver du ju inte ens 64-bitskoden!
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg av EagleSpirit »

$tiff: Behövs inte koden för att kretsen ska skicka ut något alls?

Search ROM behövs ju endast när man använder komponenter som inte har specifik plats. Tex 3 temperaturgivare funkar inte för kretsen har ju ingen aning om var den sitter egentligen.

Fredrick: Ja det där var ju ganska simpelt faktiskt pga OWout OWin "kommandona". Den ligger ju bara och väntar på pulser och behöver därför inte timas så väldigt noga. Den där koden kan bara läsa av en sensor vad det ser ut som.
Fredrick
Inlägg: 342
Blev medlem: 9 januari 2004, 23:12:33

Inlägg av Fredrick »

Ja jag tror att den bara klarar 1 sensor.

Men man kan väl ansluta sensor nummer 2 på egen egen pin eller?
mullemeck
Inlägg: 1306
Blev medlem: 27 maj 2003, 23:52:06
Ort: Lund
Kontakt:

Inlägg av mullemeck »

man kan ju i princip koppla hur många sensorer på samma bus som helst, bara man först kopplar in de en och en och läser av deras 64-bits adress.
Skriv svar