Hallo zusammen, Habe eine Frage zu einem Drehzahlauswertungsprogramm, das ich geschrieben habe. Die Auswertung läuft über einen Atmega 2560. Mein Probem ist, dass ich bei dem vorliegenden Quellcode bereits bei Stillstand (Das heißt auf den Counter 1 geht kein Signal) eine Drehzahl von 428 1/min angezeigt bekomme. Da ich nachher sehr hohe Drehzahlen auswerten möchte (bis 110000 1/min) fällt dieser Offset nicht so sehr ins Gewicht, allerdings würde ich gerne verstehen warum das so ist oder ob ein Fehler in meinem Programm vorliegt. Gruß Andreas
1 | #include <avr/io.h> |
2 | #include <inttypes.h> |
3 | #include <stdlib.h> |
4 | #include <avr/interrupt.h> |
5 | #include <string.h> |
6 | #define BAUD 9600UL
|
7 | #define UBRR_BAUD ((F_CPU/(8UL*BAUD))-1)
|
8 | |
9 | void uart_init(void) |
10 | {
|
11 | // Baudrate einstellen (Normaler Modus)
|
12 | UBRR3H = (uint8_t) (UBRR_BAUD>>8); |
13 | UBRR3L = (uint8_t) (UBRR_BAUD); |
14 | |
15 | UCSR3A= (1<<U2X3); // U2X auf LO |
16 | |
17 | |
18 | // Aktivieren von receiver und transmitter
|
19 | UCSR3B = (1<<RXEN3)|(1<<TXEN3); |
20 | |
21 | // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
|
22 | UCSR3C = (1<<UCSZ31)|(1<<UCSZ30); |
23 | }
|
24 | |
25 | int uart_putc(unsigned char c) |
26 | {
|
27 | while (!(UCSR3A & (1<<UDRE3))) /* warten bis Senden moeglich */ |
28 | {
|
29 | }
|
30 | |
31 | UDR3 = c; /* sende Zeichen */ |
32 | return 0; |
33 | }
|
34 | |
35 | void uart_puts (char *s) |
36 | {
|
37 | while (*s) |
38 | { /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */ |
39 | uart_putc(*s); |
40 | s++; |
41 | }
|
42 | }
|
43 | |
44 | int main(void) |
45 | {
|
46 | TCCR3B = (1<<CS32) | (1<<WGM32);// | (1<<CS32); Timer 3 initalisieren (Prescaler 256) |
47 | TCCR1B = (1<<CS11) | (1<<CS12); //Timer 1 initalisieren (fallende Flanke) |
48 | TIMSK3 |= (1<<OCIE3B); //Timer 3 Compare erlauben |
49 | uint16_t COUNTER = 31250; |
50 | OCR3B = COUNTER; |
51 | TCNT1=0; |
52 | |
53 | |
54 | // USART initialisieren
|
55 | uart_init(); |
56 | |
57 | sei(); //Interrupts erlauben |
58 | |
59 | while (1) //Unendliche Schleife |
60 | {
|
61 | }
|
62 | return 0; |
63 | }
|
64 | |
65 | char s[10]; //Feld für String initalisieren |
66 | |
67 | ISR (TIMER3_COMPB_vect) |
68 | {
|
69 | |
70 | uint32_t i=TCNT1; //Variable definieren und Timer 1 auslesen |
71 | i=((i*60*2)/7); // Drehzahl ausrechnen mit Offsetkorrektur (Ausgabe in 1/min) |
72 | ultoa( i, s, 10 ); //Variable in Ascii-Zeichen umwandeln |
73 | strcat (s, " "); //Leerzeichen einfügen |
74 | uart_puts(s); //Variableninhalt ausgeben |
75 | TCNT3=0; |
76 | TCNT1=0; //Timer 3 und 1 gleich Null setzen |
77 | }
|