Hallo liebe Leute, ich bin relativer Anfänger in der Welt der
Microcontroller. Zur Übung wollte ich mit meinem kleinen Board eine
Entfernungsmessung mit einem HC-SR04 Board durchführen. Die Idee war
folgende.
Der Triggereingang des Moduls ist mit PA4 verbunden. Wird nun der Taster
S1 betätigt, wird ein Interrupt (INT1) ausgelöst, dass den
triggereingang zunächst auf L und anschließend auf H setzt. Das löst die
Messung aus und das Modul setzt den Echo Ausgang (verbunden mit PD2) auf
H-Pegel. Dies soll nun einen Interrupt (INT0) auslösen der den Timer 0
startet. der Timer 0 soll die Zeit zählen bis das Echo detektiert wurde
und die Zeit in ms ersteinmal in einer Variable abspeichern. Nach
empfang des Echos fällt der Echoausgang wieder auf L, löst erneut die
ISR(Int0) aus und der Timer wird gestoppt.
Soweit erstmal.
Nun habe ich Testweise nach jeder "Stufe" eine LED an PortB leuchten
lassen. Es scheint so als ob die ISR(INT1) normal durchläuft, der Timer
gestartet aber nicht mehr gestoppt wird.
Ich konnte schon ein paar Fehler erkennen, bin mittlerweile aber
womöglich blind für meinen eigenen Code und komme einfach nicht auf
meinen Fehler, daher wäre es nett wenn ihr euch den Code vlt mal
anschauen könntet.
Ich weiß, dass der derzeitige Code nicht wirklich eine großartige
Funktion hat und das es womöglich noch andere Wege gibt, ich möchte aber
erstmal nur einen Vernünftigen Betrieb des Moduls hinbekommen auf die
von mir angedachte weise (da ähnliches auch in der Schule verlangt
wird).
Im Anhang befindet sich der Schaltplan für das von mir verwendete Board.
Hier der Quelltext:
----------------------------------------------------------------
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #define F_CPU 16000000
|
4 | #include <util/delay.h>
|
5 |
|
6 | //Globale Variablen
|
7 | int countint = 0; //Zur Unterscheidung ob die Zeitmessung gestartet oder beendet werden soll
|
8 | int timems = 0; //Zur aufnahme der verstrichenen Zeit in ms
|
9 |
|
10 |
|
11 | //Drücken von S1 soll eine Abstandsmessung auslösen (Triggereingang des Moduls zunächst auf L und wieder zurück auf H)
|
12 | ISR(INT1_vect)
|
13 | { PORTB &= 0b00000000;
|
14 | PORTA &= 0b11101111; //LOW Pegel generieren
|
15 | _delay_us(100); //PORTA (Trigger wird dazu auf LOW gesetzt und nach 100us wieder auf high
|
16 | PORTA |= 0b00010000; //Zurück auf High Pegel
|
17 | PORTB |= 0b00000001;
|
18 | }
|
19 |
|
20 | //H-Pegel am Ausgang soll Zeitmessung starten, L-Pegel soll Zeitmessung stoppen
|
21 | ISR(INT0_vect)
|
22 | {
|
23 | if (countint == 0)
|
24 | {
|
25 | //Zeitmessung starten (Timer0 aktivieren)
|
26 | TCCR0 = 0b00000011;
|
27 | TCNT0 = 5;
|
28 | PORTB |= 0b00000010;
|
29 | }
|
30 | if (countint == 1)
|
31 | {
|
32 | //Zeitmessung stoppen
|
33 | TCCR0 = 0b00000000;
|
34 | PORTB |= 0b00000100;
|
35 | countint = 2;
|
36 | }
|
37 | if(countint == 0)
|
38 | {
|
39 | countint = 1;
|
40 | }
|
41 |
|
42 | if (countint == 2)
|
43 | {
|
44 | countint = 0;
|
45 | }
|
46 | }
|
47 |
|
48 | //Bei Überlauf des Timers soll die Zeitvariable hochzählen.Die Zeit wird in ms gemessen
|
49 | ISR(TIMER0_OVF_vect)
|
50 | {
|
51 | timems++;
|
52 | TCNT0 = 5; //Startwert neu setzen
|
53 | TIFR = 0b00000001; //Overflow Bit zurücksetzen
|
54 | PORTB |= 0b00001000; //Erfolg an PB3 (LED D6) anzeigen
|
55 | }
|
56 |
|
57 |
|
58 | int main(void)
|
59 | { cli();
|
60 | //Datenrichtung und Pullups
|
61 | DDRD &= 0b11110011; //PD2,3 als Eingang
|
62 | DDRA |= 0b00010000; //PA4 als Ausgang
|
63 | DDRB |= 0b11111111; //Alle LEDs
|
64 |
|
65 | PORTD |= 0b00001000; //Interner Pullup an PD3
|
66 |
|
67 | PORTA |= 0b00010000; //Triggereingang zu Programmstart auf High
|
68 | //Timer
|
69 | TIMSK = 0b00000001; //Timer0 Interrupt aktivieren
|
70 | //Interrupts
|
71 | MCUCR |= 0b00001001; //INT1 an PD3 -> Fallende Flanke, INT0 an PD2 -> Jeder log.Wechsel
|
72 | GICR |= 0b11000000; // INT0 und INT1 erlauben
|
73 | sei();
|
74 |
|
75 | while(1)
|
76 | {
|
77 | if (timems > 0)// Wenn eine Zeit gemessen wurde
|
78 | {
|
79 | PORTB |= 0b00010000; //zeige es mit Lampe D5 an PB4 an
|
80 | }
|
81 |
|
82 | }
|
83 | }
|