XMEGA/Xplain - Problem

OP #1867783
Lesenswert?

Hallo Leute,

ich schreibe gerade einen Code für mein Xplain Board mit dem Xmega128A1. 
Der Code, den ihr unten sehen könnt, soll eine PWM erzeugen. Dazu wird 
das Ti verwendet um den Lowlevel und Tw um den Highlevel des PWMs 
einzustellen. Hierbei ist Ti viel wichtiger als Tw. Deswegen wird für Ti 
ein Timer verwendet.
Nun habe ich das Problem, dass Ti und Tw irgendwie miteinander gekoppelt 
sind. Sobald ich Tw verändere, ändert sich auch Ti und ich weiss nicht 
warum!?
Vielleicht habe ich einen Fehler und sehe ihn einfach nicht.
Beim Compelieren kommt bei mir noch eine Warnung:

../avr/include/util/delay.h:85:3: warning: #warning "F_CPU not defined 
for <util/delay.h>"

Obwohl meine Clock (siehe Code) definiert ist.

Kann mir dabei jemand helfen?

Gruß Joe
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>      // Für Delay-Funktion 
4

5

6
void timer_init(void);
7
void clock_init(void);
8
void interrupt_init(void);
9
void ausgaenge_init(void);
10
void timer_an(void);
11
void timer_aus(void);
12

13
volatile uint16_t Tw;
14
volatile uint16_t Ti;  
15

16
int main(void){
17

18
    clock_init();
19
    interrupt_init();
20
    ausgaenge_init();
21
    timer_init();
22

23
    Tw = 0;
24
    Ti = 60; //43 für 10.10µs
25
    
26
    timer_an();
27
    
28
    while(1){
29
        
30

31
    }
32
}
33

34
void timer_init(void){
35
    // Timerüberlauf Interrupt aktivieren High
36
    TCD0.INTCTRLA = TC_OVFINTLVL_HI_gc;
37
    }
38

39
void timer_an(void){
40
    // Vorteiler auf 2 einstellen
41
    TCD0.CTRLA = TC_CLKSEL_DIV2_gc;
42
    // Timer Top Wert festlegen Überlaufintterupt 1 sekunden
43
    TCD0.PER = Ti;
44
    //Ausgänge ändern
45
    PORTD.OUT = (0<<PIN0);
46
    PORTE.OUT = (0<<PIN0);
47

48
    }
49

50
void timer_aus(void){
51
    //Timers aus
52
    TCD0.CTRLA = TC_CLKSEL_OFF_gc;
53
    //Ausgänge ändern
54
    PORTD.OUT = (1<<PIN0);
55
    PORTE.OUT = (1<<PIN0);
56
    //Wartezeit mithilfe von ms-Schritten
57
    for (uint16_t i=0; i<Tw; i++){
58
        _delay_us(10);
59
        }
60
    }
61

62
void clock_init(void){
63
    //Oszillator auf 32Mhz stellen
64
    OSC.CTRL |= OSC_RC32MEN_bm;
65
    // Warten bis der Oszillator bereit ist
66
    while(!(OSC.STATUS & OSC_RC32MRDY_bm));
67
    CCP = CCP_IOREG_gc;
68
    CLK.CTRL = (CLK.CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_RC32M_gc;
69
    }
70

71
void interrupt_init(void){
72
    PMIC.CTRL |= PMIC_HILVLEN_bm;
73
    sei();
74
    }
75

76
void ausgaenge_init(void){
77
    //Pin0 des PORTE und PORTD auf Ausgang
78
    PORTD.DIR = (1<<PIN0);
79
    PORTE.DIR = (1<<PIN0);
80
    //Pin0 Ausgänge auf High schalten
81
    PORTD.OUT = (1<<PIN0);
82
    PORTE.OUT = (1<<PIN0);
83
    }
84

85
//*Timerüberlauf Interrupt
86
ISR (TCD0_OVF_vect){
87
    timer_aus();
88
    timer_an();
89
    }
OP #1867838
Lesenswert?

DANKE für die Antwort. :-)

Ich bin mir sicher, ich habe das mit F_CPU ausprobiert.... Naja, man 
lernt nie aus.

Ich würde ja gerne die PWM nutzen, jedoch kann ich nur eine PWM im 
Verhältnis 50:50 erzeugen. Ich benötige aber ein unterschiedliches 
Verhätnis.
Wenn du weisst wie das geht, bin ich ganz Ohr...

Gruß Joe

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren