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 | }
|