Verständnisproblem Port wechseln. UTFT ATmega1284p

Hallo ich hab es mittlerweile geschafft, mich n bissle in die Materie einzuabeiten, aber so ab und an hängt es noch bei mir. Ich benutze eine library von UTFT diese ist aber mit Version 2,77b von jemanden geändert worden. Ich habe die Originale versucht, aber die bekomme ich gar nicht zum Laufen. Mit der geänderten bekomme ich mein Display mittlerweile auf einem Arduino Uno und Mega ans Laufen. Aber eigenlich sollte mein TFT an einem 1284p hängen. Kann kein SMD Löten :( Naja... also nun mein Problem. Ich habe mir mal einiges angschaut, doch irgendwie bekomm ich immer einen weißen bildschirm wenn ich die Scatches uploade. Beim Uno funktioniert es. Beim Mega auch. Aber 1284p nicht.

Denk dass es an den Port Mapping liegt. Aber das versteh ich leider nicht wirklich.

hier mal zum Vergleich die vom 1280 wird ja vom 2560 genutzt.

void UTFT::LCD_Writ_Bus(char VH,char VL, byte mode)
{   
        PORTH &= ~0x78;
        PORTH |= ((VL & 0x03)<<5)+((VL & 0xC0)>>3);
           PORTG &= ~0x20;
        PORTG |= (VL & 0x10)<<1;
        PORTE &= ~0x38;
        PORTE |=((VL & 0x20)>>2)+ ((VL& 0x0C)<<2);
           pulse_low(P_WR, B_WR);
}

void UTFT::_set_direction_registers(byte mode)
{
    for(int p=2;p<10;p++)
     {
        pinMode(p,OUTPUT);
      }

}

void UTFT::_fast_fill_16(int ch, int cl, long pix)
{
    long blocks;
        PORTH &= ~0x78;
        PORTH |= ((ch & 0x03)<<5)+((ch & 0xC0)>>3);
           PORTG &= ~0x20;
        PORTG |= (ch & 0x10)<<1;
        PORTE &= ~0x38;
        PORTE |=((ch & 0x20)>>2)+ ((ch & 0x0C)<<2);
                pulse_low(P_WR, B_WR);

und die vom 1284p

void UTFT::LCD_Writ_Bus(char VH,char VL, byte mode)
{   

        cport (PORTD, 0xF0);
        sport (PORTD, (VH & 0x0F));
        cport (PORTB, 0xF0);
        sport (PORTB, (VH & 0xF0)>>4);
        pulse_low(P_WR, B_WR);
        cport (PORTD, 0xF0);
        sport (PORTD, (VL & 0x0F));
        cport (PORTB, 0xF0);
        sport (PORTB, (VL & 0xF0)>>4);
        pulse_low(P_WR, B_WR);
        break;

}

void UTFT::_set_direction_registers(byte mode)
{
    DDRB |= 0x0F;
    DDRD |= 0x0F;
    if (mode==16)
    {
        DDRB =  0xFF;
        DDRD |= 0x6F;
        DDRA |= 0xC0;
    }

}

void UTFT::_fast_fill_16(int ch, int cl, long pix)
{
    long blocks;

    cport (PORTD, 0x90);
    sport (PORTD, (ch & 0x0F) | ((cl & 0x03)<<5));
    PORTB = ((ch & 0xF0)>>4) | ((cl & 0x3C)<<2);
    cport (PORTA, 0x3F);
    sport (PORTA, ((cl & 0x40)<<1) | ((cl & 0x80)>>1));

Ups vergessen, der 1284p ist mit dem Pinout vom Bobuino

//                       +---\/---+
//           (D 4) PB0 1 |        | 40 PA0 (D 21) AI 7
//           (D 5) PB1 2 |        | 39 PA1 (D 20) AI 6
//      INT2 (D 6) PB2 3 |        | 38 PA2 (D 19) AI 5
//       PWM (D 7) PB3 4 |        | 37 PA3 (D 18) AI 4
//   PWM/SS (D 10) PB4 5 |        | 36 PA4 (D 17) AI 3
//     MOSI (D 11) PB5 6 |        | 35 PA5 (D 16) AI 2
// PWM/MISO (D 12) PB6 7 |        | 34 PA6 (D 15) AI 1
//  PWM/SCK (D 13) PB7 8 |        | 33 PA7 (D 14) AI 0
//                 RST 9 |        | 32 AREF
//                VCC 10 |        | 31 GND 
//                GND 11 |        | 30 AVCC
//              XTAL2 12 |        | 29 PC7 (D 29) 
//              XTAL1 13 |        | 28 PC6 (D 28) 
//      RX0 (D 0) PD0 14 |        | 27 PC5 (D 27) TDI
//      TX0 (D 1) PD1 15 |        | 26 PC4 (D 26) TDO
// INT0 RX1 (D 2) PD2 16 |        | 25 PC3 (D 25) TMS
// INT1 TX1 (D 3) PD3 17 |        | 24 PC2 (D 24) TCK
//     PWM (D 30) PD4 18 |        | 23 PC1 (D 23) SDA
//      PWM (D 8) PD5 19 |        | 22 PC0 (D 22) SCL
//      PWM (D 9) PD6 20 |        | 21 PD7 (D 31) PWM
//                       +--------+

Ich hoffe ich habe mich nicht zu kompliziert ausgedrückt. Eventuell versteht mich ja jemand :D Vielen Dank

Wie hast du das ganze angeschlossen?

Hi das Display ist eigentlich für den Uno gedacht, also habe ich einfach die Uno Anschlüsse übernommen.

Sprich verwendet habe ich die Pins 2-8 und die Analogen Pins 0-5 Rest ist über... So funktioniert es am Uno und am Mega. Aber wenn ich es am 1284p steck dann hab ich nen Weißen Screen.

Kannst Du noch umverdrahten? Das Bobduino Pinout ist leider für die Port-Manipulationen von UTFT nicht gerade ideal und würde Dich viel Geschwindigkeit kosten. Wenn Du anders verdrahten würdest, könnte es auf Anhieb klappen. Und: es würde helfen, wenn Du uns einen Link auf die von Dir verwendete Version von UTFT posten würdest.

hi erstmal danke für eure Antworten.
Ich habe die Version von :
Exstore
Dort habe ich auch das TFT 3,5 für den Uno her.
Hab die PDF mal angehangen.
Ich würde gern das Display überhaupt mit dem 1284p nutzen. Aber dazu bin ich noch zu dumm :smiley:
Falls du dich damit auskennst und mir eine bessere Verkabelung incl. Umstellung der UTFT Datei, wäre ich dir sehr dankbar!
Ich benötige lediglich die SPI-Ports.
Die sollten von dem Display verschont bleiben.

Die SDA und SDL Pors müssten auch frei bleiben :smiley:

Gruß Uwe

TFT_3.5.pdf (32.8 KB)

Das Display ist als Shield ausgeführt. In welchem Formfaktor benutzt Du denn den 1284p? Breadboard?

Der Code wird am einfachsten, wenn Du die Leitungen LCD D1-8 auf einen Port am 1284p legst, z.B. Port A (der scheint von Dir nicht genutzt zu werden). Also die jetzigen D2-D9 auf AI 0-7 (nach Deinem Schema). Die Leitungen, die jetzt auf den analogen Eingängen liegen, würde ich auf Port C legen (D24-D29). SD SS auf D4 (damit Du kompatibel mit der SD Bibliothek bleibst), der Rest auf die SPI Bus-Pins.

Danke mal wieder... aber leider funktioniert das so nicht, da die Tochfunktion nicht von UTFT kommt sondern ich nutz Tochscreen. Dazu müßten die Analogen Pins A1 und A2 da bleiben... sorry hatte ich nicht erwähnt! Hab ich voll vergessen... aber wenn ich das umkabeln würde, hätt ich immernoch nen prob mit den Ports

Dann nimm AI 4-7 und D26-29, damit hast Du zwei Nibbles und musst nicht mal shiften. Den Rest kannst Du auf frei Pins verteilen.

Werde das mal versuchen ... bin mir zwar noch nicht wirklich sicher was ich nun dann beim dem HW_ATmega1284P im UTFT einstell aber da werde ich mich mal erstmal ran wagen... Danke dir!

Müßte ich nicht 7 Pins belegen für die TFT Daten? 4-7 wären ja nur 4 oder hab ich was verpeilt?

Ich sage ja: AI 4-7 und D26-29 für die TFT Daten. Den Rest kannst Du auf noch freie Pins verteilen, dort die Pinbelegung nicht mehr so wichtig.

Oh Sorry falsch verstanden. :-[

Also ich scheine zu dumm zu sein... ich hab nun deine Variante Versucht, aber irgendwie bleibt das TFT weiß... Hab jetzt mal den Bootloader auf dem Atmega1284p auf Standart geändert. Dann könnte ich ja die Bank PortD komplett nehmen und noch zusätzlich die ersten drei von Bank PortB. Wobei ich ja nur 2 bräuchte ... egal. Das hieße ja dass ich folgendes machen würde... oder?

       PORTD = VL & 0xFD;  
        PORTB = VL & 0x3;

Ich peile das mit den Ports wohl nicht. ich glaub ich muß nochmal von vorn anfangen und mich mal Blink beschäftigen...

Wenn Du Port D komplett nimmst, dann brauchst Du Port B nicht mehr, denn Du kannst ja ein Byte in einem Rutsch übertragen. Dann heisst es einfach:

PORTD = VL;

Allerdings hätte ich gesagt, dass Du beim Standard-Bootloader eben den Port D nicht frei hast.

Bei meinem Vorschlag wäre es:

PORTC &= 0x0F;
PORTC |= VL & 0xF0;
PORTA &= 0xF0;
PORTA |= VL & 0x0F;

Das elegante daran ist, dass Du kein Bitshifting machen musst.

Danke dir... Werde ich die tage nochmal checken und mich dann melden!