Statistics
| Branch: | Tag: | Revision:

root / analog_exp / onewire_hal_bitbang.c @ 168:bfc84ee2839b

History | View | Annotate | Download (1.2 kB)

1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <util/atomic.h>
4
5
#include "board.h"
6
#include "onewire_hal.h"
7
8
#define ONEWIRE_LOW()  ONEWIRE_DDR |=  (1<<ONEWIRE)
9
#define ONEWIRE_HIGH() ONEWIRE_DDR &= ~(1<<ONEWIRE)
10
#define ONEWIRE_IN     ((ONEWIRE_PIN & (1<<ONEWIRE)) >> ONEWIRE)
11
12
bool onewire_reset(void) {
13
    bool presence;
14
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
15
        ONEWIRE_PORT &= ~(1<<ONEWIRE);
16
        ONEWIRE_LOW();
17
        _delay_us(480);
18
        ONEWIRE_HIGH();
19
        _delay_us(70);
20
        presence = (ONEWIRE_IN == 0);
21
        _delay_us(410);
22
    }
23
    return presence;
24
}
25
26
inline void onewire_tx1(void) {
27
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
28
        ONEWIRE_LOW();
29
        _delay_us(6);
30
        ONEWIRE_HIGH();
31
        _delay_us(64);
32
    }
33
}
34
35
inline void onewire_tx0(void) {
36
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
37
        ONEWIRE_LOW();
38
        _delay_us(60);
39
        ONEWIRE_HIGH();
40
        _delay_us(10);
41
    }
42
}
43
44
inline uint8_t onewire_rx(void) {
45
    uint8_t bit;
46
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
47
        ONEWIRE_LOW();
48
        _delay_us(6);
49
        ONEWIRE_HIGH();
50
        _delay_us(9);
51
        bit = ONEWIRE_IN;
52
        _delay_us(55);
53
    }
54
    return bit;
55
}