Witam,
Teraz przysiad³em siê do oprogramowania i testowania 1wire. I mam problem, otó¿ tak± mam procedurê g³ówn±: <code>
for (;;) { for (tmp=0;tmp<8;tmp++) ds_nr[tmp] = 0x00; if (ow_reset() == 0) { ow_write_byte(0x33); // read rom for (tmp=0;tmp<8;tmp++) ds_nr[tmp] = ow_read_byte(); lcd_setPos(2,0); lcd_str_P((prog_char*)PSTR("1W_RESET=0")); } else { lcd_setPos(2,0); lcd_str_P((prog_char*)PSTR("1W_RESET=1")); }
lcd_setPos(1,0); for (tmp=0;tmp<8;tmp++) lcd_hex_byte(ds_nr[tmp]);
delay1ms(5);
} </code>
I z ds_nr mam same 0x08, co do czasów resetu i pozosta³ych my¶lê ¿e s± dobre (na przyk³adnaie uk³adu reaguje) ale z odczytem mam ju¿ g³upoty :/
Mo¿e zjadzie siê osoba co mog³a rzuciæ by okiem: <code unit="1wire.c">
void ow_delay(uint16_t t) { while (t>0) { // ~250ns asm volatile("nop"::); asm volatile("nop"::); // ~250ns asm volatile("nop"::); asm volatile("nop"::); // ~250ns asm volatile("nop"::); asm volatile("nop"::); // ~250ns asm volatile("nop"::); asm volatile("nop"::); // + --- " --- = 1us
--t; } }
void ow_write_bit(uint8_t bit) {
DDR(OW_PORT) |= 1 << OW_PIN; // port=OUT PORT(OW_PORT) &= ~(1 << OW_PIN); // port=0 ow_delay(3); // poczekaj chwile i: if (bit != 0) { // je¶li ma byæ wystawiona 1 to port=1 je¶li nie to port pozostanie w "0" PORT(OW_PORT) |= 1 << OW_PIN; } ow_delay(70); // poczekaj az ramka bitu moze sie zakonczyc (t>60us) DDR(OW_PORT) &= ~(1 << OW_PIN); // port=IN PORT(OW_PORT) |= 1 << OW_PIN; // port=1 }
uint8_t ow_read_bit(void) { static uint8_t tmp;
PORT(OW_PORT) &= ~(1 << OW_PIN); // port=0 DDR(OW_PORT) |= 1 << OW_PIN; // port=OUT // prze³acz port=0 ow_delay(3); PORT(OW_PORT) &= ~(1 << OW_PIN); //port=IN ow_delay(7); // poczekaj na slave'a az przejmie kontorle i:
tmp = PIN(OW_PORT) & (1<<OW_PIN); // odczytaj stan
ow_delay(80); // poczekaj na bezpieczny czas zakonczenia trnasmisji bitu
return tmp; }
// -------------------------------------- // -------------------------------------- // -------- funkcje g³ówne // -------------------------------------- // --------------------------------------
void ow_init(void) { DDR(OW_PORT) &= ~(1 << OW_PIN); PORT(OW_PORT) |= 1 << OW_PIN; }
uint8_t ow_reset(void) { uint8_t tmp;
DDR(OW_PORT) |= 1 << OW_PIN; PORT(OW_PORT) &= ~(1 << OW_PIN); // 1W - RESET PULSE ow_delay(500); // delay 500us // teraz przelacz port na wejscie i sprawdz czy cos sie dziej DDR(OW_PORT) &= ~(1 << OW_PIN); // port=IN PORT(OW_PORT) |= 1 << OW_PIN; // port=1 (pull-up) ow_delay(30); // poczekaj az slave przjemie kontorle nad linia i sci±gnie j± do masy tmp = PIN(OW_PORT) & (1 << OW_PIN); // odczytaj je¶lo tmp=0 to jest co¶ na
1w :) // jeszcze sobie poczekamy... ow_delay(500); return tmp; }
void ow_write_byte(uint8_t data) { uint8_t tmp; for (tmp=0;tmp<8;tmp++) { ow_write_bit(data & 0x01); data >>= 1; } }
uint8_t ow_read_byte(void) { uint8_t tmp, tmp2=0; for (tmp=0;tmp<8;tmp++) { tmp2 |= (ow_read_bit() << tmp); } return tmp; } </code>
Z not± w rêce sprawdzi³em 2x ow_write_bit i ow_read_bit czy s± dobrze i czasy s± te¿ w granicach tak wiêc nie mam ju¿ pomys³u. A znowu kopiowanie czyjego¶ kodu nie spacjalnie lubiê, "bo" preferujê siê czego¶ nauczyæ. Aha F_CPU=8MHz i MCU=attiny2313