Well, I thought I should report back on my attempt to read these sensors.
I got past my sampling problem.
It's not pretty, but it works.

In my T0 ISR, where I do mS timers, I have it sampling the inputs, using T1
to count the period of four cycles of each input.

//*********************************************************************************************
//
// Timer 0 overflow ISR
//
// 1mS timer maintainance, and sampling of the two magnetometer channels.
//
// WARNING: If either mag input stops, the app will hang!
//
ISR(TIMER0_OVF_vect)
{
 TCNT0 = T0_Reload_Value;    // Needed to hit 1mS ticks.
 if (0 < LCD_Timer) LCD_Timer--;  // Dec the pacing timer to 0

 if (Raw_Samples > Raw_Data_Size) { // If the raw data buffer isn't full
  TCCR1B &= ~(1<<CS10);   // Stop T1
  TCNT1=0;      // Clear T1

  // Use this when simulating.
  /*
  Raw_Data[0][Raw_Data_In_Index] = 0xAA;
  Raw_Data[0][Raw_Data_In_Index++] = 0x55;
  if ((Raw_Samples - 1) < Raw_Data_In_Index ) Raw_Data_In_Index = 0;
  Raw_Data_Size++;
  return;
  */


  // Sync to the A channel
  while (PIND & 0x04);   // Wait for a low, so we know we're not seeing a
high level yet
  while (!(PIND & 0x04));   // Wait for the high edge
  TCCR1B |=(1<<CS10);    // START the clock to T1

  // T1 is now counting the pulse width.
  // Since it can be as short as 5uS, we'll count four cycles.
  // That can be as little as 20us (4 cycles = 80 counts)
  // or as much as 92 uS (4 cycles = 368 counts)

  // So we can check with the scope.
  //Debug_DDR |= (1 << Debug_Pin); // Output
  //Debug_Port |= (1 << Debug_Pin); // High

  while (PIND & 0x04);    // Wait for a low on PD2
  while (!(PIND & 0x04));    // Wait for a high on PD2 One cycle has gone
  while (PIND & 0x04);
  while (!(PIND & 0x04));    // Now two
  while (PIND & 0x04);
  while (!(PIND & 0x04));    // Now three
  while (PIND & 0x04);
  while (!(PIND & 0x04));    // Now four
  TCCR1B &= ~(1<<CS10);    // Stop T1

  //Debug_Port &= ~(1 << Debug_Pin); // Low
  Raw_Data[0][Raw_Data_In_Index] = TCNT1; // Save the value but do NOT bump
the pointer yet
  TCNT1=0;      // Clear T1

  // Sync to the B channel, and proceed as above
  while (PIND & 0x08);
  while (!(PIND & 0x08));
  TCCR1B |=(1<<CS10);
  while (PIND & 0x08);
  while (!(PIND & 0x08));
  while (PIND & 0x08);
  while (!(PIND & 0x08));
  while (PIND & 0x08);
  while (!(PIND & 0x08));
  while (PIND & 0x08);
  while (!(PIND & 0x08));
  TCCR1B &= ~(1<<CS10);
  Raw_Data[1][Raw_Data_In_Index++] = TCNT1; // Save the value and bump the
pointer
  if ((Raw_Samples - 1) < Raw_Data_In_Index ) Raw_Data_In_Index = 0;
  Raw_Data_Size++;
 }
_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@nongnu.org
http://lists.nongnu.org/mailman/listinfo/avr-gcc-list

Reply via email to