WJ
Guest
Thu Sep 23, 2004 6:55 pm
Witam.
Od 2 dni męczę się z obsługą czujnika DS18B20 na procesorze ATMega8. Czujnik
jest podpięty do portu PB0 (również jest z niego zasilany - DQ przez
rezystor 4,7k podpięty do Vcc, a VDD zwarty z masą). Próbowałem skorzystać z
kodu z wątku
http://www.google.pl/groups?q=ds18b20+i+at89s8252+poszukiwany+kod&hl=pl&lr=&ie=UTF-8&newwindow=1&selm=cibprm%24n2%241%40nemesis.news.tpi.pl&rnum=1 ,
ale po konwersji ciągle dostaję wartość 5 (bez konwersji 0, czyli nic nie
odczytuje). Czy ktoś mogłby mnie wspomóc działającym kodem w C dla AVR?
Byłbym zobowiązany. Z góry dziękuję za pomoc! Pozdrawiam
--
WJ
wj78[nospam]@.wp.pl
PS. Korzystam z wewnętrzego oscylatora. Na razie ustawiony fabrycznie na
1MHz
mlodedrwale
Guest
Thu Sep 23, 2004 8:26 pm
WJ wrote:
Quote:
Byłbym zobowiązany. Z góry dziękuję za pomoc! Pozdrawiam
#include <avr/io.h>
#include <avr/delay.h>
#include "lcd.h"
#define OWPORT PORTB
#define OWPIN 0
#define OWPININ PINB
#define OWDDR DDRB
#define OWIN 1 // 2^OWPIN
#define delay_us(x) _delay_loop_2(x*2)
#define ow_lo() sbi(OWDDR, OWPIN)
#define ow_hi() cbi(OWDDR, OWPIN)
uint8_t ow_reset(void){
uint8_t a;
ow_lo();
delay_us(480);
ow_hi();
delay_us(70);
a = inp(OWPININ) & OWIN; // 0 - obecny, else - nieobecny
delay_us(410);
return a;
}
void ow_wrbit(uint8_t bit){
ow_lo();
if(bit == 0){
delay_us(60);
ow_hi();
delay_us(10);
}
else {
delay_us(6);
ow_hi();
delay_us(64);
}
}
uint8_t ow_rdbit(void){
uint8_t a;
ow_lo();
delay_us(6);
ow_hi();
delay_us(9);
a = inp(OWPININ) & OWIN; //0 - 0, else -1
delay_us(55);
return a;
}
uint8_t ow_rdbyte(void){
uint8_t a, b;
a = 0;
for(b = 0; b <8; b++){
a >>= 1;
if (ow_rdbit()) a += 128;
}
return a;
}
void ow_wrbyte(uint8_t data){
uint8_t a;
for(a = 0; a < 8; a++){
ow_wrbit(data & 1);
data >>= 1;
}
}
void lcd_putuint8(uint8_t a){
uint8_t b;
b = a / 100;
if (b) lcd_putc(b + 0x30);
a -= b * 100;
b = a / 10;
lcd_putc(b + 0x30);
a -= b * 10;
lcd_putc(a + 0x30);
}
void lcd_putuint16(uint16_t a){
uint8_t b;
b = a / 10000;
// lcd_putc(b + 0x30);
a -= b * 10000;
b = a / 1000;
lcd_putc(b + 0x30);
a -= b * 1000;
b = a / 100;
lcd_putc(b + 0x30);
a -= b * 100;
b = a;
lcd_putuint8(b);
}
int main(void){
uint8_t a, b, c;
uint16_t e;
lcd_init( LCD_DISP_ON);
cbi(OWPORT, OWPIN);
ow_hi();
for(;

{
ow_reset();
ow_wrbyte(0xCC); //SKIP ROM
ow_wrbyte(0x44); //CONVERT T
for(a = 1; a <100; a++){
delay_us(10000);
}
ow_reset();
ow_wrbyte(0xCC); //SKIP ROM
ow_wrbyte(0xBE); //READ SCRATCHPAD
a = ow_rdbyte();
b = ow_rdbyte();
c = a & (0x0F); // wartości dziesiętne (po przecinku)
a >>= 4;
b <<= 4;
a = a | b;
e = 625 * c;
lcd_clrscr();
lcd_home();
lcd_putuint8(a);
lcd_puts(",");
lcd_putuint16(e);
}
return 0;
}
kod dla avr-gcc
Quote:
--
WJ
wj78[nospam]@.wp.pl
PS. Korzystam z wewnętrzego oscylatora. Na razie ustawiony fabrycznie na
1MHz
ustaw na 8
--
-=GumibaR=-
Co robi? by?y prezydent na hubie dc?
www.mlodedrwale.neostrada.pl/slawni.html
Przemcio Ż.
Guest
Thu Sep 23, 2004 8:52 pm
WJ napisał(a):
Quote:
sprawdzic kodu, ale to jest dla 51 kod, a nie dla AVR - przeciez
masz podana wersje procka... moze sie roznic czyms...
ale jak napisalem - moge byc w wielkim bledzie... nie musi miec to
znaczenia...
--
Pozdrawiam - Przemcio Ż.
http://www.svpl.info - Savoir-Vivre w sieci...
http://www.nasza.behende.pl - strona Nasza:)))
- MY - FORUM - GALERIA - TY -
gg: 1156769, tlen: belmotybe
WJ
Guest
Sat Sep 25, 2004 7:58 am
Quote:
PS. Korzystam z wewnętrzego oscylatora. Na razie ustawiony fabrycznie na
1MHz
ustaw na 8
Już jest 8MHz

) Dzięki za kod. Niestety dalej nie działa. Stawiam na
uszkodzenie czujnika (z Allegro). Wczoraj ktoś mi powiedział, że wystarczy
pomylić nóżki przy podłączeniu i czujnik już jest do wymiany. Naprawdę jest
taki delikatny? Mój jest oczywiście z całą pewnością podpięty tak jak
trzeba. Mam jeszcze jedno pytanko: czujnik mam podpięty 2-przewodowo, a
jakie korzyści daje podłączenie go trzema przewodami? To, że czujnik działa
wtedy na dłuższym przewodzie, to wiem, ale są jeszcze inne korzyści z
takiego podłączenia? Pozdrawiam
--
WJ
WJ
Guest
Sat Sep 25, 2004 8:11 am
Quote:
nie wiem czy to ma znaczenie, bo na razie za bardzo nie mam kiedy
sprawdzic kodu, ale to jest dla 51 kod, a nie dla AVR - przeciez
masz podana wersje procka... moze sie roznic czyms...
Kod w C ma to do siebie, że jest "przenośny" między różnymi platformami
sprzętowymi, więc to powinno działać. Co do procesora, to wykorzystuję
bibliotekę <iom8v.h>. Pozdrawiam
--
WJ
T.M.F.
Guest
Sat Sep 25, 2004 1:17 pm
Quote:
Już jest 8MHz

) Dzięki za kod. Niestety dalej nie działa. Stawiam na
uszkodzenie czujnika (z Allegro). Wczoraj ktoś mi powiedział, że wystarczy
pomylić nóżki przy podłączeniu i czujnik już jest do wymiany. Naprawdę jest
Jesli podlaczysz odwrotnie zasilanie to tak.
Quote:
taki delikatny? Mój jest oczywiście z całą pewnością podpięty tak jak
trzeba. Mam jeszcze jedno pytanko: czujnik mam podpięty 2-przewodowo, a
jakie korzyści daje podłączenie go trzema przewodami? To, że czujnik działa
wtedy na dłuższym przewodzie, to wiem, ale są jeszcze inne korzyści z
takiego podłączenia? Pozdrawiam
Upraszcza sterowanie czujnikiem - nie musisz dawac strong pull-up na
czas konwersji, a druga zaleta - umozliwia odczytywanie temperatur >85
stopni.
--
Inteligentny dom -
http://idom.wizzard.one.pl
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz sie do projektu.
T.M.F.
Guest
Sat Sep 25, 2004 1:18 pm
WJ wrote:
Quote:
nie wiem czy to ma znaczenie, bo na razie za bardzo nie mam kiedy
sprawdzic kodu, ale to jest dla 51 kod, a nie dla AVR - przeciez
masz podana wersje procka... moze sie roznic czyms...
Kod w C ma to do siebie, że jest "przenośny" między różnymi platformami
sprzętowymi, więc to powinno działać. Co do procesora, to wykorzystuję
bibliotekę <iom8v.h>. Pozdrawiam
Szyna 1-wire ma dosys duze wymagania jesli chodzi o timingi. Dlatego kod
'51 i AVR mimo, ze w C niekoniecznie musi byc przenoscny. Ale to zalezy
w duzej mierze od tego jak napisana jest biblioteka. Dlatego ja wole
assembler ;P
--
Inteligentny dom -
http://idom.wizzard.one.pl
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz sie do projektu.