Touch Grafikdisplay AtXmega 256a3

OP (Firma: HTL Rankweil) #3407968
Lesenswert?

Hallo zusammen,

ich und drei meiner Mitschüler arbeiten momentan in der Schule an einem 
Projekt. Für dieses Projekt haben wir von Ribu ein 7 Zoll 
Touch-Grafikdisplay gekauft. Meine Aufgabe ist es, das Display mit dem 
AtXmega256a3 anzusteuern. Bisher haben wir uns in der Schule nur mit 
einem Atmega16 beschäftigt.
Mitlerweile habe ich ein Programm geschrieben, das meiner Meinung nach 
funktionieren sollte. Die Programmierung erfolgt über den AVR MK2.
Mit dem Reset Pin wird das Display gestartet, das funktioniert. Jedoch 
sollte kurz darauf ein Startbyte über den txd Pin gesendet werden, das 
macht es aber nicht. Vielleicht könnt ihr mir da weiterhelfen.

Gruß Andi

Hier der Programmcode:

#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <avr/../string.h>
#include <avr/../stdlib.h>
#include <AVR/signal.h>

#define F_CPU 32000000

unsigned char i;
unsigned char a = 1;

void init()
{
  PORTD.DIRSET = 0b11110111;  //Ein-/Ausgänge definieren
  USARTD0.BAUDCTRLA = 0b00001100;
  USARTD0.BAUDCTRLB = 0b01000000;  //Baudrate 9600

  USARTD0.CTRLA = 0b00000000;
    USARTD0.CTRLB = 0b00001000;  //Transmitter Enable
  USARTD0.CTRLC = 0b00000011;  //Character Size 8Bit
}

int main(void)
{
  init();

  char Ausgabe[11] = {0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 
0x7F, 0xFF, 0xFF};

    while(1)
    {
    if (a == 1)
    {
      _delay_ms(4000);

      PORTD_OUTSET |= 0x02;  //Reset
      _delay_ms(5000);

      USARTD0_DATA = 0x55;  //Startbyte
      _delay_ms(3000);

      USARTD0_DATA = 0x45;  //Clear Display
      _delay_ms(1000);

      a = 0;
    }

    for (i = 0; i < 11; i++)
    {
      USARTD0_DATA = Ausgabe[i];
      _delay_ms(20);
    }
    }
}
#3408410
Lesenswert?

Hallo,

so ist es richtig: PORTD.DIRSET = 0b00001000;  //Ein-/Ausgänge 
definieren


dieser Code ist besser zu lesen.

PORTD.DIRSET = PIN3_bm;  // Ausgang
PORTD.DIRCLR = PIN2_bm;  // Eingang

sonst funktioniert dein Code einwandfrei.

Solltest du mehrere Ports von  PORTD verwenden, musst du natürlich den 
Code noch verändern

PORTD.DIRSET = 0b00001000;  //jetzt nur für den USART


Gruß G.G.
OP (Firma: HTL Rankweil) #3410962
Lesenswert?

Hallo,

danke erstmal für die Antwort.
Die delay´s habe ich jetzt kleiner gemacht und in eine Schleife 
verpackt. Leider funkioniert es trotzdem nicht.
Das mit den Ein- und Ausgängen versteh ich aber nicht. Mir wurde 
beigebracht, dass 0 Eingang und 1 Ausgang ist, also wäre PORTD.DIRSET = 
0b00001000; genau falsch rum. So wäre nämlich der rxd Pin Ausgang und 
alle anderen Eingang. Liege ich da falsch?

Gruß Andi
Gast #3410991
Lesenswert?

Hi

>So wäre nämlich der rxd Pin Ausgang und
>alle anderen Eingang. Liege ich da falsch?

Du liegst auf jeden Fall falsch wenn du meinst an den TXD-/RXD-Pins 
herumfummeln zu müssen. Das Setzen von RXD und/oder TXD in CTRLB 
überschreibt die normalen Pinfunktionen. Da kannst du das 
Direction-Register setzen wie du willst.

MfG Spess
#3411021
Lesenswert?

Andreas Stadelmann schrieb:
> Hallo,
>
> danke erstmal für die Antwort.
> Die delay´s habe ich jetzt kleiner gemacht und in eine Schleife
> verpackt. Leider funkioniert es trotzdem nicht.
hm?
> Das mit den Ein- und Ausgängen versteh ich aber nicht. Mir wurde
> beigebracht, dass 0 Eingang und 1 Ausgang ist,
so ist es
> also wäre PORTD.DIRSET =
> 0b00001000; genau falsch rum.
nein

bei den Xmegea hast du jeweils 4 Zugriffsmöglichkeiten auf jedes 
Portregister!
.DIR     der übergebene Wert wird in das Register übernommen
         (wie bei den 'alten' AVR's); 1=OUTPUT, 0=INPUT
.DIRSET  jedes 1-Bit wird im Portregister gesetzt,
         0-Bits bewirken nichts
.DIRCLR  jedes 1-Bit wird im Portregister gelöscht,
         0-Bits bewirken nichts
.DIRTGL  jedes 1-Bit wird im Portregister invertiert,
         0-Bits bewirken nichts

mit PORTD.DIRSET = 0b00001000 wird PORTD.DIR_Bit 3 auf 1 gesetzt, alle 
anderen Bits bleiben unverändert.

Sascha

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