Forum: Mikrocontroller und Digitale Elektronik Touch Grafikdisplay AtXmega 256a3


von Andreas S. (Firma: HTL Rankweil) (andreas94)


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

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

kann es wohl sein, das _delay_ms(5000); bei 32MHz nicht mehr 
funktioniert?! Da gibts doch immer gewisse Einschränkungen zwischen 
maximaler Zeit und Taktfrequenz.
Nimm mal eine Schleife in der du ein delay_ms(10) nimmst.

Sascha

: Bearbeitet durch User
von Gerhard G. (g_g)


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.

von Andreas S. (Firma: HTL Rankweil) (andreas94)


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

von spess53 (Gast)


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

von Sascha W. (sascha-w)


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

: Bearbeitet durch User
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.