Hallo,
ich habe einen Problem mit der Interrupt-Routine
ISR(ANALOG_COMP_1_vect).
Das von mir verwendet IC AT90PWM3 besitzt drei analog Komparatoren und
drei Power Stage Controller(PSC) zur PWM Signal Erzeugung. So lang alle
PSCs deaktiviert sind, funktinieren die Interrupt-Routine aller analog
Komparatoren wie erwartet: Bei jeder Flanke wird ein Interrupt
ausgelöst.
Sobald aber der PSC aktiviert wird UND an dem Eingang des ACOMP1 0V
anliegen wird die ISR(ANALOG_COMP_1_vect) ständig aufgerufen. Die beiden
anderen analog Comparatoren arbetieten weiterhin wie gewünscht.
Der Analog Comparator wird mit Vref/2.13 = 1.20V verglichen. Als Vref
ist der interne 2.56V Referenz gewählt mit einem externen Kondensator an
AREF-Pin.
Die ISR selber sind sehr einfach gehalten und funktionieren bis auf den
oben beschriebenen Betriebszustand.
1 | ISR(ANALOG_COMP_0_vect)
|
2 | {
|
3 | uart_putchar('A');
|
4 | }
|
5 | ISR(ANALOG_COMP_1_vect)
|
6 | {
|
7 | uart_putchar('B'); // <- ??????
|
8 | }
|
9 | ISR(ANALOG_COMP_2_vect)
|
10 | {
|
11 | uart_putchar('C');
|
12 | }
|
Das Initialiesern des PSC:
1 | void PSC_Init(unsigned int ot0, unsigned int ot1)
|
2 | {
|
3 | Start_pll_64_mega(); // start the PLL at 64 MHz
|
4 | Wait_pll_ready();
|
5 |
|
6 | OCR0RA = ot0;
|
7 | OCR0RB = ot1;
|
8 | PCNF0 = (1<<PMODE01) | (1<<PMODE00) | (1<<POP0) | (1<<PCLKSEL0) ; /* fast clock input used */
|
9 | PFRC0A = 0;
|
10 | PFRC0B = 0;
|
11 | PCTL0 = (1<<PARUN0) | (1<<PCCYC0);
|
12 |
|
13 | OCR1RA = ot0;
|
14 | OCR1RB = ot1;
|
15 |
|
16 | PCNF1 = (1<<PMODE11) | (1<<PMODE10) | (1<<POP1) | (1<<PCLKSEL1); /* fast clock input used */
|
17 | PFRC1A = 0;
|
18 | PFRC1B = 0;
|
19 | PCTL1 = (1<<PARUN1) | (1<<PCCYC1);
|
20 |
|
21 | OCR2RA = ot0;
|
22 | OCR2RB = ot1;
|
23 | PCNF2 = (1<<PMODE21) | (1<<PMODE20) | (1<<POP2) | (1<<PCLKSEL2); /* fast clock input used */
|
24 | PFRC2A = 0;
|
25 | PFRC2B = 0;
|
26 | // PCTL2 = (1<<PCCYC2) | (1<<PRUN2) ; // PSC ist Master
|
27 |
|
28 | // connect the PSC waveform generator outputs to the port outputs
|
29 | PSOC0 = (1<<POEN0B) | (1<<POEN0A) ;
|
30 | PSOC1 = (1<<POEN1B) | (1<<POEN1A) ;
|
31 | PSOC2 = (1<<POEN2B) | (1<<POEN2A) ;
|
32 | }
|
Starten des PSCs
1 | void PSC_Start(void)
|
2 | {
|
3 | PCTL2 = (1<<PCCYC2) | (1<<PRUN2) ;
|
4 | }
|
Die code stammt von der Atmel Seite - AVR435:
http://www.atmel.com/dyn/products/app_notes.asp?part_id=3615
Ich habe die Code lediglich vom IAR-Compiler auf GCC portiert.
Meine Frage ist, worin der Zusammenhang zwischen dem Analog Comparator
und dem Power Stage Controller liegen könnte. Es ist mir völlig unklar,
warum der analog Komparator 1 bei 0V am ACMP1-Eingang und bei laufendem
PSC ständig die ISR auslöst.