claudio Postat Mai 20, 2011 Partajează Postat Mai 20, 2011 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
nana Postat Mai 20, 2011 Partajează Postat Mai 20, 2011 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
claudio Postat Mai 23, 2011 Autor Partajează Postat Mai 23, 2011 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
claudio Postat Iunie 8, 2011 Autor Partajează Postat Iunie 8, 2011 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum