Forum: Projekte & Code Input Capture Timer3 at90usb647


von hottaby4 (Gast)


Lesenswert?

hallo!

 ich komme einfach nicht weiter, möchte ein PWM Signal auswerten durch 
die Capture Funktion des Timer 3. AT90usb647

Vorgehensweise:
1. Ich lasse den Timer auf eine steigende Flanke warten.
2. bei steigender Flanke setze ich das Zählerregister auf "0", und 
stelle den EdgeDetector auf "0" um auf die fallende Flanke zu warten (es 
wird die Impulszeit des PWM gemessen)
3. bei fallender Flanke lese ich das ICR3 register aus und möchte es 
gleich an PORT A & D anzeigen lassen, dabei wird der EdgeDetector auf 
steigende flanke eingestellt um den nächten Messvorgang zu ermöglichen!

Problemstellung:
Ich komme zwar in die Interruptroutine rein, auch in die if verzweigung 
und else ebenfalls (das sehe ich an PORT E & F), jedoch bekomme ich 
jedesmal eine "0" aus dem ICR3 register, so also ob :
- der Timer nicht laufen würde, oder


schaut euch bitte den Code an und sagt mir was ich da falsch mache!
1
/**************************************************************
2
SI                          16.04.2011
3
        Capture_Timer3_test At90USB647
4
5
        1kHz PWM Signal am InputCapturePIN=PC7 erfassen
6
v1,0
7
**************************************************************/
8
// http://www.mikrocontroller.net/attachment/highlight/312
9
//  PORTC |= (1<<PC2); //PC2 SETZEN       ungefaehr gleich mit:   PORTC = 8;
10
//  PORTC &= ~(1<<PC1);//PC1 LoeSCHEN
11
12
#include <avr/io.h>
13
#include <avr/interrupt.h>
14
#include <util/atomic.h>
15
16
17
int main(){
18
19
  /* ClockPrescaller auf 1 setzen: */
20
  CLKPR = 128; // S.47: Write the Clock Prescaler Change Enable (CLKPCE) bit to one 
21
            //and all other bits in CLKPR to zero.
22
  CLKPR = 0;   // S.47: Within four cycles, write the desired value to CLKPS while 
23
            //writing a zero to CLKPCE.
24
             //Interrupts must be disabled when changing prescaler setting 
25
             //to make sure the write procedure is not interrupted.
26
  /* ClockPrescaller auf 1 setzen: ^^ "fertig"*/
27
28
29
    // PWM :
30
    DDRB = 255;  // ausgang wegen PWM als Ausgang
31
32
    TCCR0B  |= 0x03;  // Clock Select /64: 16MHz/64->250kHz : 250kHz/256 zaehlschritte = 976,5625 Hz
33
    TCCR0A  |= 0x03;  // Fast PWM  , BOTTOM(0x00)-TOP(0xFF)  //ohne OCR0A, mit OCR0A: WGM02=true, OCR0A=TOP=0x00-0xFF
34
    TCCR0A  |= 0x20;  // PD0:NON-Inverted PWM; BOTTOM-Compare=>PortD0=high, Compare-TOP=>PortD0=low!!!
35
    TCCR0A  |= 0x80;  // PB7:NON-Inverted PWM; BOTTOM-Compare=>PortD0=high, Compare-TOP=>PortD0=low!!!
36
  
37
    OCR0A = 50;  //Compüare register fuer Pin-B7
38
39
40
DDRC = 0;  // PC7 (A15/IC.3/CLKO)  InputCapture=PC7
41
PORTC = 0;
42
43
DDRD = 255;  // Highbyte des Input Capture Wertes zum Anzeigen
44
PORTD=0;
45
DDRA = 255;  // Lowbyte des Input Capture Wertes zum Anzeigen
46
PORTA = 0;
47
48
DDRF = 255; //test
49
PORTF =0;  //test
50
DDRE = 255;  //test
51
PORTE = 0;  //test
52
53
54
TCCR1B &= ~(1<<WGM13);  // normale MODE  // WGM13 bit wird geloescht   
55
56
TCCR3B  |= 0x02;  // Clock Select /8: 16MHz/8->2MHz : bei 2MHz ist eine Periode 0,5microSek, 
57
  // also bei 1kHz(P=1ms) waeren es dann 2000 Schritte um die komplette Periodevon1kHz zu erfassen
58
59
TCCR3B  |= 0x80;  // Noise Canceller einschalten!!! es verzoegert die Zeiterfassung um 4 Zyklen
60
61
TCCR3B  |= 0x40;  // EdgeSelect auf steigende Flanke einstellen!!!
62
63
SREG   |= 0x80;  // Global Interrupt enable
64
TIMSK3   = 0x20;  // enable Input Capture Interrupt Timer3
65
66
PRR1   &= 0xF7;  // ViiV | enable Timer/Counter 3 module
67
68
69
while(1);
70
return 0;}
71
72
73
ISR(TIMER3_CAPT_vect)      //  Flanke an ICP pin
74
{ 
75
76
if( TCCR3B &= 0x40 )
77
  {
78
  TCCR3B &= ~0x40;// und auf die fallende Flanke warten
79
80
  TCNT3H   = 0;  // bei steigender Flanke den T3-Zaehler auf 0 setzen
81
  TCNT3L   = 0;
82
    PORTF++;//test nur um zu sehen ob der CODE auch hier durchlaeft
83
  }
84
else
85
  {
86
  PORTA = ICR3L;  // bei fallender Flanke die Zeitspanne kopieren
87
  PORTD = ICR3H;
88
89
  TCCR3B |= 0x40;  // und auf die steigende Flanke warten
90
91
    PORTE ++;//test nur um zu sehen ob der CODE auch hier durchlaeft
92
  }
93
}

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.