Forum: Mikrocontroller und Digitale Elektronik SRF05 macht Probleme


von Christoph H. (christoph_b)


Lesenswert?

Hallo

Nachdem ich den SRF04 getötet habe habe ich mir einen SRF05 gekauft.
Nun das Programm vom 2560 auf den Atmega 16 umgeschrieben. Leider will 
das Programm nicht.

Warscheinlich ist der Fehler total primitive aber ich finde ihn nach 4h 
suchen bei 32Grad nicht. ;-)
1
#define F_CPU 16000000UL 
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
#include <avr/io.h>
5
6
#define START_CLK  0x0A        // Start clock with 1:8 prescaler CTC mode
7
#define START_CLK_N  0x02        // Start clock running 1:8 prescaler in normal mode
8
#define STOP_CLK  0x08        // Stop clock
9
10
void init_Ultraschall(void)
11
{
12
  DDRA |= (1<<PA7);      // Port A Pin 7 als Ausgang. Rest als Eingang
13
  TCCR1A = 0x00;      // TIMER 1 in CTC mode
14
  TCCR1B = 0x08;  
15
  startTimer_init_Ultraschall(0xFFF);
16
  
17
}
18
void startTimer_init_Ultraschall (unsigned int time)
19
{
20
  OCR1A = time;      // Time set to count to
21
  TIFR = 0x10;      // Clear timer campare match flag
22
  TCNT1 = 0x00;       // Clear timer to zero
23
  TCCR1B = START_CLK;    // Start timer running 1:8 prescaler
24
}
25
26
void waitForTimer(void)
27
{
28
  while(!(TIFR&0x10));  // wait for timer to set compare match flag
29
  TCCR1B = STOP_CLK;    // Stop the timer
30
}
31
unsigned int getEcho(void) 
32
{
33
unsigned int range;
34
  while(!(PINA&(1<<PA6)));    // Wait for echo pin to go high,  this indicates the start of the incoming pulse
35
  TCNT1 = 0x00;         // Clear timer to zero
36
  TCCR1B = START_CLK_N;    // Start timer running 1:8 prescaler in normal mode
37
  while((PINA&(1<<PA6)));      // Wait for echo pin to go low signaling that the pulse has ended
38
  TCCR1B = STOP_CLK;      // Stop the timer and set back to CTC mode  
39
  range = TCNT1/58;      // Read back value in the timer counter register, this number divided by 58 will give us the range in CM
40
41
  return(range);
42
}
43
44
void startRange(void)
45
{
46
  PORTA = ( 1<<PA7 );    // Trigger Pin auf High
47
  _delay_us(30);
48
  PORTA &= ~(1<<PA7 );  // Trigger Pin auf LOW
49
}

von Washington I. (washington_i)


Lesenswert?

erste frage:
richtig angeschlossen?
http://www.robot-electronics.co.uk/htm/srf05tech.htm

von Stefan F. (sfrings)


Lesenswert?

Zweite Frage: Was funktioniert nicht?

Dritte Frage: Was hast DU überprüft, um den Fehler einzukreisen? Ich 
würde mit der Schnittstelle zwischen AVR und Sensor anfangen.

von Christoph H. (christoph_b)


Lesenswert?

PinA7 ist der Trigger Pin.
PinA6 ist der Echo Pin.

Wenn ich mit

PORTA=(1<<PA7);
_delay_us(30);
PORTA&=~(1<<PA7);
_delay_ms(100);

den Trigger Pin triggere kann ich auf den Oszi den Unterschiedlichen 
Echo Abstand sehen.

Mein Programm schaut so aus.

   startRange();
    cm = getEcho();
    startTimer_init_Ultraschall(40000);
     waitForTimer();

ich denke oder vermute das der fehler in getEcho() ist. Sobald ich das 
verwende stoppt das Programm.

von Christoph H. (christoph_b)


Lesenswert?

keiner eine Idee.

von Stefan (Gast)


Lesenswert?

Beantworte bitte unsere Fragen.

von Christoph H. (christoph_b)


Lesenswert?

Schnittstelle ist ok.
Was nicht geht. Das Programm läuft nicht durch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.