Forum: Mikrocontroller und Digitale Elektronik XMEGA/Xplain - Problem


von Joe F. (joe1234)


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
    }

von bla (Gast)


Lesenswert?

Nein, ist er nicht. #define F_CPU 32000000 fehlt.
Wieso nuzt du nicht die PWM des Xmegas?

von Joe F. (joe1234)


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

von Joe F. (joe1234)


Lesenswert?

Noch eine Frage:
Warum entspricht meine _delay_ms(100) Funktion nicht meinen waren 100ms 
(mit kleiner Abweichung)?

F_CPU ist auf 32MHz gesetzt.

Gruß Joe

von Joe F. (joe1234)


Lesenswert?

Mir fällt gerade auf, dass

#define F_CPU 32000000

überhaupt keinen Einfluss auf die spätere _delay_ms() Funktion hat. Also 
wenn ich es weglasse, verhält sich die Funktion genauso.

AUßerdem entstehen dann unten 3 Warnings!!!

Gruß Joe

von Joe F. (joe1234)


Lesenswert?

Habs gefunden:

Im AVR-Studio unter Projekt -> Configuration Options -> Frequency auf 
gewünschte Frequenz stellen!!!

Gruß Joe

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.