Witam.
Mam problemy z obsługą transmisji linii 1-Wire. Układ mój wyposażony jest w Atmege32, czujnik temperatury DS1820 podłączony do portu A0, oraz tymczasowo zestaw diod sygnalizacyjnych podłączonych do portu B ( docelowo zamierzam dokupić wyświetlacz LCD). Obsługę lini 1-wire starałem się pisać zgodnie ze zaleceniami manuala DS1820. Czujnik reaguje na sygnał reset (wystawia sygnał presence na linii). Wydaje mi się iż problem leży w funkcjach zapisu lub odczytu danych z linii. Niestety pomimo licznych prób nie udało mi się uzyskać poprawnego wyniku pomiaru temperatury. Za każdym razem w wyniku otrzymuje same jedynki (zarówno bajt starszy jaki i młodszy). Poniżej zamieszczam plik główny oraz napisaną przeze mnie bibliotekę do obsługi linii 1-wire. Cały projekt dołączam także w załączniku. Będę wdzięczny za wszelkie uwagi.
//PLIK MAKRA.h
Proszę pamiętać o używaniu znaczników code. - arnoldziq
Przeniesiono z Programowanie Ogólne. - arnoldziq
Mam problemy z obsługą transmisji linii 1-Wire. Układ mój wyposażony jest w Atmege32, czujnik temperatury DS1820 podłączony do portu A0, oraz tymczasowo zestaw diod sygnalizacyjnych podłączonych do portu B ( docelowo zamierzam dokupić wyświetlacz LCD). Obsługę lini 1-wire starałem się pisać zgodnie ze zaleceniami manuala DS1820. Czujnik reaguje na sygnał reset (wystawia sygnał presence na linii). Wydaje mi się iż problem leży w funkcjach zapisu lub odczytu danych z linii. Niestety pomimo licznych prób nie udało mi się uzyskać poprawnego wyniku pomiaru temperatury. Za każdym razem w wyniku otrzymuje same jedynki (zarówno bajt starszy jaki i młodszy). Poniżej zamieszczam plik główny oraz napisaną przeze mnie bibliotekę do obsługi linii 1-wire. Cały projekt dołączam także w załączniku. Będę wdzięczny za wszelkie uwagi.
//PLIK main.c
#include <avr\io.h>
#include <inttypes.h>
#include <util\delay.h>
#include "senslib.h"
#include "makra.h"
int main(void){
uint8_t i = 0, wynik_l = 0, wynik_m = 0x00;
DDRB = 0xff;
DDRA = 0xff;
_delay_ms(200);
SENS_DDR |= (1<<SENS_PIN);
//i = init();
if(init()){PORTB = 0x02;}
else{
write_byte(0XCC); //pominięcie ROM
write_byte(0x44); // konversja temperatury
_delay_ms(25);
if (check_line()){PORTB = 0x08;} //sprawdzenie stanu lini w trakcie konwersji
_delay_ms(255);
_delay_ms(255); //oczekiwanie do końca konwersji
_delay_ms(255);
}
if(init()){PORTB = 0x03;}
else {
write_byte(0XCC);
write_byte(0xBE); // odczyt temperatury
wynik_l = read_byte(); // pierwszy bajt
wynik_m = read_byte(); // drugi bajt
init(); //reset
//PORTB = wynik_l;
//PORTB = wynik_m;
}
while(1){}
return 0;
}
// PLIK senslib.c
#include "makra.h"
#include "senslib.h"
void set_low(uint8_t delay){ //generuje sygnał low (0) na lini
_delay_us(delay);
SENS_PORT &= ~(1<<SENS);
SENS_DDR |= (1<<SENS);
}
void set_high(uint8_t delay) { // generuje sygnał high (1) na lini
_delay_us(delay);
//SENS_PORT |= (1<<SENS);
SENS_DDR &= ~(1<<SENS);
}
//generacja sygnału init
uint8_t check_line (void){
uint8_t state;
state = ((SENS_PIN & (1<<SENS))) ? 1 : 0 ;
return state;
}
uint8_t init(void){
uint8_t presence = 0x00;
set_low(0); // generuje impuls low na lini
set_high(500); // ustawienie stanu high na lini po 500 us
_delay_us(100); // oczekiwanie na sygnał presence
presence = check_line(); // wykrycie sygnału presence
_delay_us(360); // oczekiawnie na zakończenie sygnału presence
return presence;
}
// odczyt danych z magistrali one wire
uint8_t read(void) {
uint8_t read_bit = 0x00;
set_low(0);
set_high(3);
_delay_us(6);
read_bit = check_line();
_delay_us(80);
return read_bit;
}
uint8_t read_byte(void) {
uint8_t wynik = 0x00, i = 0x00;
for (i=0; i<8 ;i++) { //do zmiennej wynik wpisywane są kolejne bity w odwrotnej kolejnośći
if(read()){
wynik |= (1<< i); // (pierwszy zczytany bit jest ostatni)
}
}
return wynik;
}
// zapis danych na magistralę one wire
void write(uint8_t bit) {
set_low(0);
if(bit) {
set_high(5);
_delay_us(60);
}
else{
set_high(60);
_delay_us(5);
}
_delay_us(2);
return;
}
void write_byte(uint8_t byte) {
uint8_t i = 0x00;
for (i=0; i<8; i++){
write((byte & (1<<i)));
_delay_us(2);
}
}//PLIK MAKRA.h
Proszę pamiętać o używaniu znaczników code. - arnoldziq
Przeniesiono z Programowanie Ogólne. - arnoldziq