Sari la conținut
ELFORUM - Forumul electronistilor

temperatura cu Atmega16 DS18S20


claudio

Postări Recomandate

Salut,

 

Nu reusesc sa-i dau de cap urmatorului program care ar trebui sa citeasca temperatura prin DS18S20 si sa trimita pe serial

#define F_CPU 14745000UL #include <avr/io.h>#include <string.h>#include <stdlib.h>#include <util/delay.h>#include <avr/interrupt.h>#include "main.h"#define W1_RELEASE	DDRA &= ~(1<<PA6)#define W1_SET		DDRA |= (1<<PA6)#define W1_LOW		PORTA &= ~(1<<PA6)#define W1_HIGN 	PORTA |= (1<<PA6)#define W1_READ		PINA & (1<<PA6)uint8_t sign;uint8_t digit;uint16_t decimal;//=================================================================int main(void){	DDRA=0xFF;	UCSRA=0;	UCSRB=(1<<TXEN);	UCSRC=(1<<UCSZ1)|(1<<UCSZ0);	UBRRH=0;	UBRRL=95;	while(1)	{		send_temp(); _delay_ms(2000);	}}//=================================================================void uart_putc(unsigned char data){	while(!(UCSRA & (1<<UDRE)));	UDR = data;}//=================================================================void uart_puts(char *string){	while (*string)	{		uart_putc(*string);		string++;	}}//=================================================================void uart_puti(uint8_t data){	char alfa[5];	itoa(data,alfa,10);	uart_puts(alfa);}//=================================================================uint8_t w1_reset(){	uint8_t i=0;	W1_LOW;	W1_SET;	_delay_us(480);	W1_RELEASE;	_delay_us(65);	i=W1_READ;	_delay_us(415);	return i;}//=================================================================void w1_write_bit(uint8_t bit){	W1_LOW;	W1_SET;	_delay_us(10);	if(bit)	{		W1_RELEASE;		_delay_us(50);	}	else	{		_delay_us(50);		W1_RELEASE;	}}//=================================================================uint8_t w1_read_bit(){	uint8_t bit=0;	W1_LOW;	W1_SET;	_delay_us(1);	W1_RELEASE;	_delay_us(14);	bit = W1_READ;	_delay_us(45);	return bit;}//=================================================================void w1_write_byte(uint8_t n){	for(uint8_t i=0; i<8; i++)	{		w1_write_bit(n&0x01);		n>>=1;	}}//=================================================================uint8_t w1_read_byte(){	uint8_t n=0;	for(uint8_t i=0; i<8; i++)	{		n|=w1_read_bit()<<i;		//n>>=1; n|=(w1_read_bit()<<7);	}	return n;}//=================================================================void read_temperature(){	uint8_t temperature[2];	w1_reset();	w1_write_byte(0xCC);	w1_write_byte(0x44);	while(!w1_read_bit());	 //asteptam pana la terminarea conversiei	w1_reset();	w1_write_byte(0xCC);	w1_write_byte(0xBE);	temperature[0]=w1_read_byte();	temperature[1]=w1_read_byte();	w1_reset();	digit=temperature[0]>>4;		//pun in digit doar , primii 4 biti din Tlsb	digit|=(temperature[1]&0x07)<<4;	//apoi adaug ultimii 4 biti din Tmsb	decimal=temperature[0]&0x0F;		//pun in decimal doar zecimalele}//=================================================================void send_temp(){		read_temperature();		uart_puts("\n\rDigit: ");	uart_puti(digit);	uart_puts("\n\rDecimal: ");	uart_puti(decimal);}

Ca si rezultat am: digit: 4 sau 8 sau 12, iar decimal tot timpul 0. (cand afisez cu fct uart_puti(), iar daca folosesc uart_putc() nu-mi afiseaza nici o valoare)

Link spre comentariu
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • claudio

    3

  • nana

    1

Top autori în acest subiect

Uite ca sa nu mai faci tu conversi cu itoa si alte prosti de functi de afisare stringuri poti folosi printf daca faci urmatoarea chestie !!

Adaugi in fisier biblioteca stdio.h

 

Insa vezi ca trebe sa adaugi la obtiunile compilatorului in cazu meu avrstudio 4 te duci frumos la project->project options->libraries si acolo trebuie sa adaugi urmatoarele librari libprintf_min.a in cazul in care folosesti doar int tipe in printf, sau libprintf_flt.a in cazul in care folosesti si float pentru afisare.

 

int def_putc(char ch, FILE * f){  /* output character to UART */  while ((UCSRA&_BV(UDRE)) == 0);  UDR = ch;  return 0; }main(void){initializare USART;fdevopen(def_putc, NULL);// initializeaza stream pt printf ca funtie printf("Variabila %d %f",uint8_t val,double val2);}
Link spre comentariu

Salut,Folosesc avrstudio 5, stii cumva unde sa fac acele setari?Functiile sunt ok, deoarece le folosesc si in alte proiecte, nu cred ca ar fi problema de acolo.

Link spre comentariu
  • 3 săptămâni mai târziu...

Am folosit varianta ta, afisarea e ok.Dar citirea temperaturii tot nu merge.printf("\r\ndigit: %d",digit);printf("\r\ndecimal: %d",decimal);Obtin: digit: 12; decimal: 0;Am afisat si valorile bitilor cu temperatura dupa citire:printf("\r\nt0: %d",temperature[0]);printf("\r\nt1: %d",temperature[1]);Rezultat: t0: 192; t1: 192;

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări