Hallo zusammen, ich habe eine Frage zu meiner Impulsmessung. Ich habe ein Rohrsystem mit einem Durchflussmesser. Nachdem Durchflussmesser ist ein Magnetventil eingebaqut. Ich möchte jetzt einen Impulswert von zum Beispiel 50 einstellen. Das magnetventil öffnet sich und die erzeugten Impulse des Durchflussmessers sollen mit der ISR gezählt werden an Pin INT0 (PortD2). Dazu vernwende ich dein Arduino Uno. Die Impulsmessung ist nur ein teil des kompletten programmes. Nun zu meiner Frage. Wenn ich nur 50 Impulse messen möchte bis das Magnetventil schließt, werden mir aber zwischen 70-100 alles angezeigt. wenn ich einen Impulswert von 500 - 9000 Eingebe bis das Magnetventil schließt, dann haut der mir nach dem schließen des Magnetvetils noch 13-16 impulse zusätzlich raus. So das nicht 2000 sondern 2015 Impulse gemessen worden. Liegt der Fehler an meinem Interrput programm? Oder woran könnte der fehler liegen? Ich habe im Anhang mal den Code des Interrupts zusammen gestellt.
1 | #define F_CPU 16000000UL |
2 | #define baudrate 9600UL |
3 | #define UART_MAX_LENGTH 10 |
4 | |
5 | |
6 | #include <avr/io.h> |
7 | #include <avr/interrupt.h> |
8 | #include <stdio.h> |
9 | #include <stdlib.h> |
10 | #include <util/delay.h> |
11 | #include <string.h> |
12 | |
13 | |
14 | volatile uint16_t impuls_val = 0; |
15 | |
16 | |
17 | void uart_init (long oszi,long BAUD) |
18 | { |
19 | UBRR0L = (unsigned char)(oszi/16L/BAUD-1); |
20 | UBRR0H = (unsigned char)((oszi/16L/BAUD-1)>>8); |
21 | UCSR0A = 0X00; |
22 | UCSR0B |= (1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0); |
23 | UCSR0C |= (1<< UMSEL01)|(1<<UCSZ01)|(1<<UCSZ00); |
24 | } |
25 | |
26 | void uart_send_c(unsigned char c_str) |
27 | { |
28 | while(!(UCSR0A&(1<<UDRE0))); |
29 | UDR0 = c_str; |
30 | }; |
31 | |
32 | |
33 | void uart_sende_string(char* strin) |
34 | { |
35 | unsigned char c; |
36 | while((c = *strin++) != '\0') |
37 | uart_send_c(c); |
38 | }; |
39 | |
40 | |
41 | |
42 | ISR(INT0_vect) |
43 | { |
44 | impuls_val++; |
45 | } |
46 | |
47 | |
48 | |
49 | int main(void) |
50 | { |
51 | DDRB |=(1<<2); //output Pin magnetventil |
52 | |
53 | PORTD |= (1<<2); //impuls input |
54 | |
55 | |
56 | EICRA |= (1<<ISC00)|(1<<ISC01); // bei steigender Flanke wird interrupts ausgelöst |
57 | EIMSK |= (1<<INT0); |
58 | |
59 | uart_init(F_CPU,baudrate); |
60 | |
61 | |
62 | char buffer_impuls_val[50] = ""; |
63 | uint16_t impuls_input = 0; |
64 | |
65 | |
66 | sei(); |
67 | |
68 | while() |
69 | { |
70 | impuls_input = 50; |
71 | /////start der Impulsmessung /////////////////////////// |
72 | uart_sende_string("Start der Impulsmessung!"); |
73 | |
74 | impuls_val = 0; |
75 | |
76 | PORTB |= (1<<2); //Magnetventil öffnen |
77 | |
78 | while (impuls_val < impuls_input) //dauerschleife bis vergleichswert erreicht |
79 | { |
80 | |
81 | } |
82 | |
83 | PORTB &= ~(1<<2); // Magnetventil schließen |
84 | |
85 | _delay_ms(800); |
86 | cli(); |
87 | |
88 | ///////Ausgabe der ermittelten Impulse ///////////////////////////////// |
89 | uart_sende_string("Durchgeflossender Impulswert: "); |
90 | sprintf(buffer_impuls_val,"%d",impuls_val); |
91 | uart_sende_string(buffer_impuls_val); |
92 | |
93 | impuls_val = 0; |
94 | |
95 | sei(); |
96 | |
97 | } |