Forum: Mikrocontroller und Digitale Elektronik XMEGA PWM, Timer-Probleme und USART Probleme


von Wolfgang K. (polarwolf_94)


Lesenswert?

Hallo

Ich mache gerade eine Diplomarbeit und habe paar Probleme mit dem Xmega.
Kurz zur Information: Programmiere mit C und habe den XMega128a3.

PWM:
Ich bekomme am Oszi ein Signal. Nur ist es so, dass ich Per und CCA 
einstelle, aber es kommt immer ein ähnliches Teil raus und zwar sieht 
man immer ein Rechtecksignal, was zu 50/50 besteht, also 50% ein und 50% 
aus.
Wenn ich PER auf 0 setzte seh ich es noch immer, und wenn ich CCA 
verstelle, dann wird es halt länger und kürzer.
Hier mal der Code.
void TimersInit()           //Config von Timer der x/y-Achse
{

  //PORTE.0           PWM
  TCE0.PER = 10000;  // Impulsdauer
  TCE0.CCA = 100;
  TCE0.CTRLB = 0x00010011;  // enable CCA
  TCE0.CTRLA = TC_CLKSEL_DIV64_gc;
}



Und beim Timer ist es so, dass ich gar nichts bekomme.
Vll habe ich ja einen Fehler im Programm.
void TimersInit()           //Config von Timer der x/y-Achse
{
  // Set up Timer/Counter 0.
  //PORTC.2
  TCC0.PERBUF = 0x0000;  // Impulsdauer
  TCC0.CTRLB = 0x01000000;  // enable CCC
  TCC0.CTRLA = 0x00000101; // 64 Prescaler -->2y Sekunden
  TCC0.CNT=0x00;

}
ISR(TCC0_OVF_vect)             //Timer -->Was passiert, wenn der Timer 
von 0 beginnt
{

  PORTC.OUTSET = PIN2_bm;
  _delay_us(2);
  PORTC.OUTCLR = PIN2_bm;
  ISTSchritte++;

}

und zu guter letzt ein Frage.
Dieser Controller ist so aufgebaut, dass auf der Platine intern ein 
Grafikcontroller verbunden ist und ein Touch-Display.
Wenn ich dem Controller nun einen Code schicke, bekomme ich retour die 
Touchcoordinaten. 2-mal x-bytes und 2-mal y-bytes.
Kann man das nun so aufbauen, die abfrage?

void Touch()
{
unsigned char x_pos, y_pos, x_pos1, x_pos2, y_pos1, y_pos2;
unsigned char to[2] = {0x6F, 0x05};

for (int x = 0; x < 2; x++)
{
  USARTD0.DATA = to[x];
  _delay_ms(3);
}
while(!(USARTD0.STATUS & USART_RXCIF_bm));
x_pos1=USARTD0.DATA;
while(!(USARTD0.STATUS & USART_RXCIF_bm));
x_pos2=USARTD0.DATA;
while(!(USARTD0.STATUS & USART_RXCIF_bm));
y_pos1=USARTD0.DATA;
while(!(USARTD0.STATUS & USART_RXCIF_bm));
y_pos2=USARTD0.DATA;

x_pos=(x_pos1*256+x_pos2);
y_pos=(y_pos1*256+y_pos2);
return (x_pos,y_pos);

}

Am Anfang sende ich halt die Daten zum Grafikcontroller und dann bekomme 
ich das Retour.    Kann man die DAten so abspeichern und 
weiterverarbeiten?

LG Wolfi

von Gerhard G. (g_g)


Angehängte Dateien:

Lesenswert?

Hallo,



hier mal ein funktionierendes Programm mit Timer und PWM.



Gruß G.G.

von Wolfgang K. (polarwolf_94)


Lesenswert?

Danke Gerhard Gehlert.
Hat funktioniert, jetzt rennt es  : D

Nur die Frage zum USART ist noch offen.
Funktioniert das so, wie ich das geschrieben habe?

von uController (Gast)


Lesenswert?

Hallo,

> x_pos=(x_pos1*256+x_pos2);
> y_pos=(y_pos1*256+y_pos2);

Da "x_pos" und "y_pos" als "unsigned char" deklariert sind, wird da nur 
der Wert von "x_pos2" bzw. "y_pos2" drinstehen.
Als "int" oder "unsigned int" deklariert ist das Ergebnis sinnvoller.

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.