mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMEGA/Xplain - Problem


Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>      // Für Delay-Funktion 


void timer_init(void);
void clock_init(void);
void interrupt_init(void);
void ausgaenge_init(void);
void timer_an(void);
void timer_aus(void);

volatile uint16_t Tw;
volatile uint16_t Ti;  

int main(void){

    clock_init();
    interrupt_init();
    ausgaenge_init();
    timer_init();

    Tw = 0;
    Ti = 60; //43 für 10.10µs
    
    timer_an();
    
    while(1){
        

    }
}

void timer_init(void){
    // Timerüberlauf Interrupt aktivieren High
    TCD0.INTCTRLA = TC_OVFINTLVL_HI_gc;
    }

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

    }

void timer_aus(void){
    //Timers aus
    TCD0.CTRLA = TC_CLKSEL_OFF_gc;
    //Ausgänge ändern
    PORTD.OUT = (1<<PIN0);
    PORTE.OUT = (1<<PIN0);
    //Wartezeit mithilfe von ms-Schritten
    for (uint16_t i=0; i<Tw; i++){
        _delay_us(10);
        }
    }

void clock_init(void){
    //Oszillator auf 32Mhz stellen
    OSC.CTRL |= OSC_RC32MEN_bm;
    // Warten bis der Oszillator bereit ist
    while(!(OSC.STATUS & OSC_RC32MRDY_bm));
    CCP = CCP_IOREG_gc;
    CLK.CTRL = (CLK.CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_RC32M_gc;
    }

void interrupt_init(void){
    PMIC.CTRL |= PMIC_HILVLEN_bm;
    sei();
    }

void ausgaenge_init(void){
    //Pin0 des PORTE und PORTD auf Ausgang
    PORTD.DIR = (1<<PIN0);
    PORTE.DIR = (1<<PIN0);
    //Pin0 Ausgänge auf High schalten
    PORTD.OUT = (1<<PIN0);
    PORTE.OUT = (1<<PIN0);
    }

//*Timerüberlauf Interrupt
ISR (TCD0_OVF_vect){
    timer_aus();
    timer_an();
    }

Autor: bla (Gast)
Datum:

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

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs gefunden:

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

Gruß Joe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.