Forum: Mikrocontroller und Digitale Elektronik LPC2388 und HC-SR04


von Walnuss (Gast)


Lesenswert?

Hallo zusammen,
ich bin neu in µC-Welt hab aber darüber was gelesen. Ich programmiere 
jetzt auf Keil MCB2300 und möchte mit HC-SR04 die Entfernung messen.

Momentan hab ich Problem, dass LCD-Display keine Werte (nur 0) anzeigt. 
Beim Debuggen hab ich festgestellt, dass der µC bei dieser 
While-Schleife [ while (!(FIO1PIN & (1<<19)));] hängen bleibt. Das 
heißt, er kriegt kein Echo-Signal.
Hab den gleichen Sensor mit Arduino UNO ausprobiert. Er funktioniert 
tadellos.

Ich bitte euch um eure Hilfe und gute Tipps x3

Folgendes ist mein C Code

P.s. Ich wollte es mit Interrupt-Routine machen aber ich weiß nicht ganz 
genau, wie ich eine mache :§
1
/******************************************************************************************
2
*                                                                                          *
3
*      +---+---+---+---+---+---+---+---+                                                    *
4
*      | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |                                                    *
5
*      +---+---+---+---+---+---+---+---+                                                    *
6
*      | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |                                                    *
7
*                                                                                          *
8
*                                                                                          *
9
*                                                                                          *
10
*******************************************************************************************/
11
12
13
#include <LPC23xx.h>
14
#include <stdio.h>
15
#include <stdbool.h>
16
#include "timing.h"
17
#include "LCD.h"
18
19
20
/************** Globale Variables **********/
21
22
bool flag = false;
23
24
/************** Timer1 Init ****************/
25
26
void T1_Init(void)
27
{
28
  PINSEL3  = 0x000000C0; // Set P1.19 for function CAP1.1 PIN.Nr= 47
29
  PINMODE3 = 0x000000C0; // enable pull down resistor mode  11
30
  
31
  T1TCR = 0x02;           // Reset Timer 1
32
   T1CCR= 0x1B;           // Count every edge
33
  T1TCR = 0x01;           // Enable Timer 1
34
}
35
36
37
/************** Pin Config Init ****************/
38
void PIN_Init(void)
39
{
40
  PINSEL4 = 0x00000000; // Set P2.13 from Pinsel4 as GPIO
41
  FIO2DIR = 0x000020FF; // Set P2.13 as Output
42
  FIO2MASK = 0x00000000;
43
}
44
45
/********** P2.13 Boolean statment ***********/
46
void PIN_State(bool state)
47
{
48
  if(state == true)
49
  {
50
    FIO2SET = (1 << 13);
51
  }
52
  else
53
  {
54
    FIO2CLR = (1 << 13);
55
  }    
56
}
57
58
59
/* Function that initializes LEDs */
60
void LED_Init(void) {
61
 PINSEL10 = 0; /* Disable ETM interface, enable LEDs */
62
 FIO2DIR = 0x000020FF; /* P2.0..7 defined as Outputs */
63
 FIO2MASK = 0x00000000;
64
}
65
66
/* Function that turns on requested LED */
67
void LED_On (unsigned int num) 
68
{
69
 FIO2SET = (1 << num);
70
}
71
72
/* Function that turns off requested LED */
73
void LED_Off (unsigned int num)
74
{
75
 FIO2CLR = (1 << num);
76
}
77
78
79
int main(void)
80
{
81
  int stop  = 0;
82
  int start = 0;
83
  double value=0;
84
  char charValue[10];
85
  int i = 0;
86
  
87
  
88
  LED_Init();
89
  T0_init(1); // Delay-function for ms and us
90
  T1_Init();
91
  lcd_init();
92
  PIN_Init();
93
  lcd_clear();
94
  
95
  while(1)
96
  {
97
    for(i = 0; i <= 7; i++)
98
    {
99
      LED_On(i);
100
      delay_ms(20);
101
      LED_Off(i);
102
      delay_ms(20);
103
    }
104
    i = 0;
105
    
106
    PIN_State(false);
107
    delay_us(2);
108
    PIN_State(true);
109
    delay_us(10);
110
    PIN_State(false);
111
    
112
      
113
    while (!(FIO1PIN & (1<<19)));
114
    start = T1CR1;
115
    while ( FIO1PIN & (1<<19) );
116
    stop = T1CR1;
117
    
118
    if(start>>stop)
119
      value=0xFFFFFFFF-start+stop; // FFFFFFFF = 4294967295 the biggest value of timercounter
120
    else 
121
      value=stop-start;
122
    
123
    value=value*34/20000; // Calculate the value
124
    
125
    
126
127
    
128
    
129
    lcd_clear();
130
    set_cursor (0,0);
131
    sprintf(charValue,"%d",(int)value);
132
    lcd_print ((unsigned char const *)"Distance: ");
133
    lcd_print((unsigned char const *)charValue); 
134
    lcd_print ((unsigned char const *)"cm ");
135
    
136
    delay_ms(1000);
137
138
  }
139
  
140
  
141
  
142
}

von Walnuss (Gast)


Lesenswert?

Korrektur:
Das LCD-Display zeigt nichts an!!!!!!!!

von Andreas (Gast)


Lesenswert?

Hallo,

probiere mal (1UL<<19).

Andreas

von Walnuss (Gast)


Lesenswert?

Hallo Lieber Andreas,

ich habs probiert. Es ging aber nicht ;(

von Walnuss (Gast)


Lesenswert?

Hallo,

ich bitte euch um Hilfe ;(

von Andreas (Gast)


Lesenswert?

Hallo,

wie sieht denn Deine delay_us Funktion aus?
Läuft diese richtig?

Hast Du mal die Signale mit dem Scope gemessen?

Andreas

von Walnuss (Gast)


Lesenswert?

Hallo Lieber Andreas,
vielen Dank.

Ich habe nicht mit dem Scope messen können, denn ich habe keine Oszi ;(

hier ist der Timing.c
1
//System libraries
2
#include <LPC23xx.h>
3
#include <stdbool.h>
4
#include <stdio.h>
5
6
//User libraries
7
#include "timing.h"
8
9
//Global variables
10
bool delay_done = false;
11
unsigned int delay = 0;
12
int clk_cntr = 0;
13
14
/*
15
 * Function: T0_init
16
 * Description: Enable and setup timer interrupt, start timer 0
17
 *
18
 * Parameters in:  
19
 *   millis: The amount of milliseconds at which the timer should start.
20
 *
21
 * Parameters out: none
22
 */
23
void T0_init(int millis) // Fclk = 12000 => 1msec / Fclk = 12 => 1usec
24
{
25
    T0MR0 = 12 - millis;       //1usec = 12-1 at 12.0 MHz
26
    T0MCR = 3;                //Interrupt and Reset on MR0
27
    T0TCR = 1;                //Timer0 Enable
28
    VICVectPriority4 = 0;     //Make this timer important
29
    VICVectAddr4 = (unsigned long)T0_IRQHandler; //Set Interrupt Vector
30
    VICIntEnable |= (1 << 4); //Enable Timer0 Interrupt
31
}
32
33
/*
34
 * Function: T0_IRQHandler
35
 * Description: Function that will be executed every millisecond.
36
 *              This function is only used for the delay function.
37
 *
38
 * Parameters in:  none
39
 * Parameters out: none
40
 */
41
__irq void T0_IRQHandler (void)
42
{
43
    if (clk_cntr >= delay)        //Check if the counter is bigger than the requested delay
44
    {
45
        delay_done = true;           //If so, set the delay_done flag
46
    }
47
    else
48
    {
49
        delay_done = false;          //If not, unset the delay_done flag
50
        clk_cntr++;                  //Increment the counter with 1. This happens every ms.
51
    }
52
53
    T0IR         = 1;                //Clear interrupt flag
54
    VICVectAddr  = 0;                //Acknowledge Interrupt
55
}
56
57
/*
58
 * Function: delay
59
 * Description: This function delays the microcontroller
60
 *
61
 * Parameters in:
62
 *    millis: The amount of milliseconds to delay
63
 *
64
 * Parameters out: none
65
 */
66
void delay_us(unsigned int micros)
67
{
68
    delay_done = false;     //Unset the delay_done flag
69
    clk_cntr = 0;           //Reset the counter (which is used in the timer)
70
    delay = micros;      //Set the amount of milliseconds
71
72
    while(!delay_done) {}   //Wait until the delay_done flag is set
73
}
74
75
void delay_ms(unsigned int millis)
76
{
77
    delay_done = false;     //Unset the delay_done flag
78
    clk_cntr = 0;           //Reset the counter (which is used in the timer)
79
    delay = millis * 1000;      //Set the amount of milliseconds
80
81
    while(!delay_done) {}   //Wait until the delay_done flag is set
82
}

von Walnuss (Gast)


Lesenswert?

Ich weiß nicht, ob es mir helfen kann, eine Interrupt-Routine zu 
schreiben.

in meinem Code handelt es sich um Pin auf MCB2300, bei dem Capture 
aktiviert ist.

Ich frage mich, wie man Interrupt als IRQ für die Messung des 
Echo-Signals schreiben kann. Das wäre am sinnvollsten. Aber wie xDDDDD

von Christian (Gast)


Lesenswert?

Deine "Global Variables" im Timing.c  müssen volatile sein:
http://www2.informatik.uni-halle.de/lehre/c/c_volat.html

von malsehen (Gast)


Lesenswert?

if(start>>stop)
      value=0xFFFFFFFF-start+stop; // FFFFFFFF = 4294967295 the biggest 
value of timercounter
    else
   ...

  if(start>stop)
      value=0xFFFFFFFF-start+stop; // FFFFFFFF = 4294967295 the biggest 
value of timercounter
    else

von Andreas (Gast)


Lesenswert?

Hallo,

eine Frage zu den 8 Leds, so wie Du die Delays gewählt hast, dürften die 
kaum sichtbar nur kurz aufblitzen?

Stimmt Deine Clock-Einstellung?

Andreas

von Walnuss (Gast)


Lesenswert?

Christian schrieb:
> Deine "Global Variables" im Timing.c  müssen volatile sein:
> http://www2.informatik.uni-halle.de/lehre/c/c_volat.html

okay hab geändert

malsehen schrieb:
> if(start>>stop)
>       value=0xFFFFFFFF-start+stop; // FFFFFFFF = 4294967295 the biggest
> value of timercounter
>     else
>    ...
>
>   if(start>stop)
>       value=0xFFFFFFFF-start+stop; // FFFFFFFF = 4294967295 the biggest
> value of timercounter
>     else

hab auch geändert. Ich habe mich vertippt trotzdem hat der Compiler 
nicht gemeckert

Andreas schrieb:
> Hallo,
>
> eine Frage zu den 8 Leds, so wie Du die Delays gewählt hast, dürften die
> kaum sichtbar nur kurz aufblitzen?
>
> Stimmt Deine Clock-Einstellung?
>
> Andreas

Nein die leds laufen eher langsam

ich war skeptisch als ich sie beim Laufen gesehen habe da delays nur 20 
ms betragen sollen sie kurz aufblitzen.

von Andreas (Gast)


Lesenswert?

Hallo,

wenn die Leds nur langsam laufen ist doch alles klar, Dein Timing ist 
falsch!

Der Start Impuls dürfte ein vielfache von 10us lang sein.
Wenn Du anfängst auf das Echo zu warten ist diese schon lange vorbei!

Nimm die richtige Clock Einstellung und dann dürfte es gehen.

Andreas

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.