XMEGA PWM, Timer-Probleme und USART Probleme

OP #3585461
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
Gast #3586576
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.

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