Forum: Mikrocontroller und Digitale Elektronik AVR AT90CAN128 Timer1 Timer3 AC


von Michael S. (elmsfeuer)


Lesenswert?

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

von Michael S. (elmsfeuer)


Lesenswert?

Nabend,

weiss vielleicht jemand Rat? Ich habe alle zugehörigen Datenblattkapitel 
x mal gelesen, kann aber keinen Hinweis finden. Mir ist nur aufgefallen, 
daß der Versuch ACO im ASCR Register zu setzen sinnfrei ist. Ich kann 
mir auch nicht wirklich erklären warum die Interrupts "verschwimmen". 
Meine eigentliche Spielerei habe ich jetzt anders gelöst, aber wieso ich 
den Komparator in der obigen Konstellation nicht benutzen kann, ist mir 
ein wenig schleierhaft und läßt mich nicht in Ruhe. Wenn jemand was 
weiss, bitte melden, danke dafür.

MfG
Michael

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.