Project

General

Profile

Revision 31f4a032

ID31f4a0323d38938bb40b2da834fa73fc15003faf

Added by Thomas Mullins over 11 years ago

Some fixes to BOM, which is now tested and it works

View differences:

scout_avr/src/bom.cpp
35 35
// rx global vars
36 36
static uint8_t prev_bom_sig;
37 37
static struct bom_rx_t {
38
    uint8_t bits_rx;
38
    uint8_t count;
39 39
    uint16_t bits;
40
    int last_bit;
40
    int last_time;
41 41

  
42 42
    uint8_t new_data;
43 43
    uint8_t address;
......
114 114
}
115 115

  
116 116
ISR(TIMER4_COMPA_vect) {
117
  if (out_counter) {
118
    if (out_high) {
119
      stop_38kHz_signal();
120
      if (out_msg & 1) {
117
  if (out_high) {
118
    stop_38kHz_signal();
119
    if (out_counter) {
120
      out_counter--;
121
      if ((out_msg >> out_counter) & 1) {
121 122
        OCR4A = TIME_MICROS(1680, 64);
122 123
      } else {
123 124
        OCR4A = TIME_MICROS(680, 64);
124 125
      }
125
      out_msg >>= 1;
126
      out_counter--;
127 126
    } else {
128
      start_38kHz_signal();
129
      OCR4A = TIME_MICROS(320, 64);
127
      stop_data_signal();
128
      out_done = 1;
130 129
    }
131 130
  } else {
132
    stop_data_signal();
133
    out_done = 1;
131
    start_38kHz_signal();
132
    OCR4A = TIME_MICROS(320, 64);
134 133
  }
135 134
}
136 135

  
......
154 153
    case BOM_RIGHT: out_pin_mask = _BV(BOM_EMIT2); break;
155 154
    case BOM_BACK:  out_pin_mask = _BV(BOM_EMIT3); break;
156 155
  }
157
  out_counter = 17;
156
  out_counter = 16;
158 157
  out_msg = sharp_msg_make(0x2A, bom_msg_make(robot_id, dir));
159 158
  out_done = 0;
160 159
  start_data_signal();
......
165 164

  
166 165
static void recv_edge(char is_rising, struct bom_rx_t *rx) {
167 166
  if (is_rising) {
167
    // TODO check 320us? or have 320us timeout on rising edge?
168
  } else {
168 169
    // uses timer 1, assuming prescale 1/8
169 170
    // timer 1 is set up by range_init()
170
    int now = TCNT1 * (F_CPU / 1000000) / 8;
171
    int diff = now - rx->last_bit;
172
    rx->last_bit = now;
173
    rx->bits_rx++;
174
    rx->bits <<= 1;
175
    if (MIN_LOW_PW < diff && diff < MAX_LOW_PW) {
176
      // 0 already in bits
177
    } else if (MIN_HIGH_PW < diff && diff < MAX_HIGH_PW) {
178
      // add 1 to bits
179
      rx->bits |= 1;
180
    } else {
181
      // error, start from beginning
182
      rx->bits_rx = 0;
183
      rx->bits = 0;
184
    }
185
    if (rx->bits_rx == 16) {
186
      // finished!
187
      if ((rx->bits & 3) == 2) { // expansion and check bits
188
        rx->data = (rx->bits >> 2) & 0xff;
189
        rx->address = (rx->bits >> 10) & 0x1f;
190
        rx->new_data = 1;
171
    // this should be in units of microseconds
172
    int now = TCNT1 * (F_CPU / 1000000 / 8);
173
    
174
    if (rx->count) {
175
      int diff = now - rx->last_time;
176
      rx->bits <<= 1;
177
      if (MIN_LOW_PW < diff && diff < MAX_LOW_PW) {
178
        // 0 already in bits
179
      } else if (MIN_HIGH_PW < diff && diff < MAX_HIGH_PW) {
180
        // add 1 to bits
181
        rx->bits |= 1;
182
      } else {
183
        // error, start from beginning
184
        rx->count = 0;
185
        rx->bits = 0;
186
      }
187
      if (rx->count == 16) {
188
        // finished!
189
        //if ((rx->bits & 3) == 2) { // expansion and check bits
190
          rx->data = (rx->bits >> 2) & 0xff;
191
          rx->address = (rx->bits >> 10) & 0x1f;
192
          rx->new_data = 1;
193
        //}
194
        rx->count = 0;
195
        rx->bits = 0;
191 196
      }
192
      rx->bits_rx = 0;
193
      rx->bits = 0;
194 197
    }
195
  } else {
196
    // TODO check 320us? or have 320us timeout on rising edge?
198
    
199
    rx->count++;
200
    rx->last_time = now;
197 201
  }
198 202
}
199 203

  
scout_avr/src/bom.h
12 12
#define BOM_RIGHT 3
13 13

  
14 14
// timing, in us, for read of valid bits
15
#define MIN_LOW_PW 800
16
#define MAX_LOW_PW 1200
17
#define MIN_HIGH_PW 1800
18
#define MAX_HIGH_PW 2200
15
#define MIN_LOW_PW 600
16
#define MAX_LOW_PW 1400
17
#define MIN_HIGH_PW 1600
18
#define MAX_HIGH_PW 2400
19 19

  
20 20
// returned by bom_get if there is no new data since last call
21 21
#define BOM_NO_DATA -1
22 22

  
23 23
// i/o pins
24 24
// if these are changed, remember to change bom_init and/or ISRs
25
#define BOM_SIG PORTB
25
#define BOM_SIG PINB
26 26
#define BOM_SIG0 PB0
27 27
#define BOM_SIG1 PB1
28 28
#define BOM_SIG2 PB2
scout_avr/src/debug.h
1
#ifndef _DEBUG_H
2
#define _DEBUG_H
3

  
4
void debug(const char *str);
5

  
6
#endif
scout_avr/src/main.cpp
5 5

  
6 6
ros::Publisher *ptest_out;
7 7

  
8
void debug(const char *str) {
9
}
10

  
8 11
void callback(const std_msgs::Int16& msg)
9 12
{
10 13
  ptest_out->publish(&msg);
......
44 47
#include "range.h"
45 48
#include "bom.h"
46 49

  
50
Atmega128rfa1 avr;
51

  
52
void debug(const char *str) {
53
  avr.puts(str);
54
}
55

  
47 56
int main()
48 57
{
49 58
  char buf[20];
50 59
  int i;
60
  char id = 0;
51 61
  unsigned long now, next = 0;
52
  Atmega128rfa1 avr;
53 62
  avr.init();
54 63
  range_init();
55 64
  bom_init();
56
  set_robot_id(0x2a);
65
  avr.puts("Hello!\r\n");
57 66
  while (1)
58 67
  {
59 68
    now = avr.time();
60 69
    if (now > next) {
61 70
      next = now + 100;
71
      id++;
72
      if (id == 0x40) {
73
        id = 0;
74
      }
75
      set_robot_id(id);
62 76
      /*utoa(range_get(0), buf, 10);
63 77
      avr.puts("Range: ");
64 78
      avr.puts(buf);
......
73 87
          itoa(i, buf, 10);
74 88
          avr.puts(buf);
75 89
          avr.puts(": ");
76
          itoa(msg, buf, 10);
90
          itoa(bom_msg_get_robot_id(msg), buf, 10);
91
          avr.puts(buf);
92
          avr.puts(" (");
93
          itoa(bom_msg_get_dir(msg), buf, 10);
77 94
          avr.puts(buf);
95
          avr.puts(")\r\n");
78 96
        }
79 97
      }
80
      avr.puts("\r\n");
81 98
    }
82 99
  }
83 100
  return 0;
scout_avr/src/range.cpp
33 33
static void on_edge(int which)
34 34
{
35 35
  unsigned char int_high;
36
  // TODO centralize timer 1
37
  // TODO ensure this is in microseconds even for 16MHz
36 38
  unsigned int time = TCNT1;
37 39
  
38 40
  if (which)

Also available in: Unified diff