Hallo,
ich habe wieder mal eine Frage. Mein Ziel ist es "gleichzeitig" den
Komparator mit dem Timer1 im Input-Capture-Mode an ACO und den Timer3 im
Input-Capture-Mode an ICP3 zu betreiben.
Ich benutze das STK500 + STK501 + AT90CAN128 + JTAGICEmkII + aktl.
Version AVR-Studio + aktl. Version Win-AVR
An ICP3(PE7) liegt ein Frequenzgenerator (TTL-Out) und läuft mit 1 Hz.
Auf dem Komparatoreingang (AIN0) hab ich den Switchbutton 0 vom STK500
angeschlossen und als Referenzsignal (AIN1) für den Komparator habe ich
PB0/3 angelegt.
1 | #include "config.h"
|
2 | #include "uart_lib.h"
|
3 | #include "uart_drv.h"
|
4 |
|
5 | volatile unsigned int tickCounter1, tickCounter3;
|
6 |
|
7 | void init()
|
8 | {
|
9 | Uart_select(UART_0);
|
10 | uart_init(CONF_8BIT_NOPAR_1STOP,38400);
|
11 |
|
12 | //KOMPARATOR FÜR FREQUENZMESSUNG KONFIGURIEREN INKL. TIMER1
|
13 | //Aktiviere Input-Capture (nur Timer1 möglich)
|
14 | ACSR = (1<<ACIC)|(1<<ACO);
|
15 |
|
16 | //Referenzsignal für den Komparator
|
17 | DDRB |= (1<<PB0);
|
18 | PORTB |= (1<<PB0);
|
19 |
|
20 | //Timer1
|
21 | //Timer1 für Frequenzzählung auf Input Capture Mode konfigurieren
|
22 | TCCR1B = (1<<ICES1)|(1<<CS12); //Detect on positive edge and set prescaler 256
|
23 | TIMSK1 = (1<<ICIE1); //Input-Capture-Mode aktiviert
|
24 | TIFR1 |= (1<<ICF1); //Clear Interrupt-Flag
|
25 |
|
26 | tickCounter1 = tickCounter1Temp = 0;
|
27 |
|
28 | //Timer3
|
29 | //Timer3 für PWM-Messung auf Input Capture Mode konfigurieren (PE7)
|
30 | TCCR3B = (1<<ICES3)|(1<<CS32); //Set Prescaler 256 und detect on positive edge
|
31 | TIMSK3 = (1<<ICIE3); //Input-Capture-Mode aktiviert
|
32 | TIFR3 |= (1<<ICF3); //Clear Interrupt-Flag
|
33 |
|
34 | tickCounter3 = tickCounter3Temp = 0;
|
35 |
|
36 | sei(); //INTERRUPTS ENABLED (Global Flag)
|
37 | }
|
38 |
|
39 | ISR(TIMER1_CAPT_vect)
|
40 | {
|
41 | tickCounter1 = 0;
|
42 | tickCounter1 = ICR1L; //Read LOW-Byte of ICR1
|
43 | tickCounter1 |= ICR1H << 8; //Read HIGH-Byte ICR1
|
44 |
|
45 | uart_mini_printf("\r TIMER1: %04X\n", tickCounter1);
|
46 | }
|
47 |
|
48 | ISR(TIMER3_CAPT_vect)
|
49 | {
|
50 | tickCounter3 = 0;
|
51 | tickCounter3 = ICR3L; //Read LOW-Byte of ICR3
|
52 | tickCounter3 |= ICR3H << 8; //Read HIGH-Byte of ICR3
|
53 |
|
54 | uart_mini_printf("\r TIMER3: %04X\n", tickCounter3);
|
55 | }
|
56 |
|
57 | ISR(BADISR_vect)
|
58 | {
|
59 | uart_mini_printf("\rBADISR found\n");
|
60 | }
|
61 |
|
62 | int main(void)
|
63 | {
|
64 | init();
|
65 |
|
66 | while(1);
|
67 |
|
68 | return 0;
|
69 | }
|
Eine Ausgabe über den UART erfolg seltsamerweise erst, wenn ich den
Button 0 drücke, aber dann werden auch Timer1 und Timer3 ausgelöst. Der
Frequenzgenerator scheint keinen Einfluss auf Timer3 zu haben. Achja und
Timer1 und Timer3 haben die selben Werte.
1 | TIMER1: 698F
|
2 | TIMER3: 698F
|
3 | TIMER1: 2E91
|
4 | TIMER3: 2E91
|
5 | TIMER1: E394
|
6 | TIMER3: E394
|
7 | TIMER1: 344C
|
8 | TIMER3: 344C
|
9 | TIMER1: 7562
|
10 | TIMER3: 7562
|
11 | TIMER1: B29B
|
12 | TIMER3: B29B
|
13 | TIMER1: F2B5
|
14 | TIMER3: F2B5
|
Stelle ich den Komparator ab (in init() den Bereich von //Komparator bis
//Timer1 auskommentiert) und lege den Switchbutton auf auf ICP1(PD4)
funktionieren die Timer unabhängig voneinander.
1 | TIMER3: 4606
|
2 | TIMER3: BA06
|
3 | TIMER3: 2E4A
|
4 | TIMER3: A24A
|
5 | TIMER1: C9CE
|
6 | TIMER3: 164B
|
7 | TIMER3: 8A38
|
8 | TIMER3: FE86
|
9 | TIMER3: 72D2
|
10 | TIMER3: E6D3
|
11 | TIMER3: 5AD4
|
12 | TIMER3: CE91
|
Was mache ich falsch im Zusammenhang mit dem Komparator? Ich seh
wahrscheinlich den Wald vor lauter Bäumen nicht. Danke fürs Helfen!!!
MfG
Michael