Author Topic: Pinmap Problem  (Read 10334 times)

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Pinmap Problem
« on: February 14, 2014, 03:32:50 PM »
Salut,

die 8x8 RGB Matrix von Elecfreaks kann nur am Arduino betrieben werden. Um den Code auf den Mega umzusetzen, sieht es so aus, als ob man nur die binär kodierten Pins umsetzen muss.
Der Originalcode lautet:
Code: [Select]
/*****************************
 * define the IO
 *****************************/
#define RST_BIT 0x04
#define LAT_BIT 0x02
#define SLB_BIT 0x01
#define eSCL_BIT 0x40
#define eSDA_BIT 0x80

#define RST PORTC
#define LAT PORTC
#define SLB PORTC
#define eSDA PORTD
#define eSCL PORTD

#define open_line0 {PORTB=0x01;}
#define open_line1 {PORTB=0x02;}
#define open_line2 {PORTB=0x04;}
#define open_line3 {PORTB=0x08;}
#define open_line4 {PORTB=0x10;}
#define open_line5 {PORTB=0x20;}
#define open_line6 {PORTD=0x08;}
#define open_line7 {PORTD=0x10;}
#define close_all_line {PORTD=0x00;PORTB=0x00;}
Ich habe dies anhand der Pinout-Map folgendermaßen umgesetzt:
Code: [Select]
/* Arduino Mega Ports */
#define RST_BIT 0x04
#define LAT_BIT 0x02
#define SLB_BIT 0x01
#define xSCL_BIT 0x08
#define xSDA_BIT 0x10

#define RST PORTF
#define LAT PORTF
#define SLB PORTF
#define xSDA PORTH
#define xSCL PORTH

#define open_line0 {PORTH=0x20;}
#define open_line1 {PORTH=0x40;}
#define open_line2 {PORTB=0x10;}
#define open_line3 {PORTB=0x20;}
#define open_line4 {PORTB=0x40;}
#define open_line5 {PORTB=0x80;}
#define open_line6 {PORTE=0x20;}
#define open_line7 {PORTG=0x20;}
#define close_all_line {PORTH=0x00;PORTB=0x00;PORTG=0x00;PORTE=0x00;}
Die Matrix zeigt Reaktionen, aber bei weitem nicht das erwartete Verhalten. Ich kann den Fehler bei den neuen Ports nicht erkennen und würde mich freuen, wenn jemand die Adressen mal nachrechnet

Ciao, Mathias


microtherion

  • freakyfriday
  • Full Member
  • *
  • Posts: 163
  • Karma: +13/-0
Re: Pinmap Problem
« Reply #1 on: February 15, 2014, 05:45:05 AM »
Meine Berechnungen stimmen mit Deinen überein, also würde ich mal vermuten, dass der Fehler nicht in der Pin Map liegt.

pylon

  • freakyfriday
  • Full Member
  • *
  • Posts: 158
  • Karma: +16/-0
Re: Pinmap Problem
« Reply #2 on: February 18, 2014, 05:21:29 PM »
Hallo Matthias,

hast Du auch die Direction-Register angepasst?

Code: [Select]
void _IO_Init()
{
  DDRD = 0xff; // set all pins direction of PortD
  DDRC = 0xff; // set all pins direction of PortC
  DDRB = 0xff; // set all pins direction of PortB
 
  PORTD = 0x00; // set all pins output is low of PortD
  PORTC = 0x00; // set all pins output is low of PortC
  PORTB = 0x00; // set all pins output is low of PortB
}

Müsste dann in Deinem Fall in etwa heissen:

Code: [Select]
void _IO_Init()
{
  DDRB = 0xf0;
  DDRE = 0x20;
  DDRF = 0x07;
  DDRG = 0x20;
  DDRH = 0x78;
 
  PORTB = 0x00;
  PORTE = 0x00;
  PORTF = 0x00;
  PORTG = 0x00;
  PORTH = 0x00;
}

Ich habe explizit nur die Pins als Ausgang geschaltet, die auch verwendet werden.

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Re: Pinmap Problem
« Reply #3 on: February 18, 2014, 07:32:18 PM »
Salut,

danke für die Prüfung, die Matrix ist weiterhin tot ...

Ciao, Mathias

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Re: Pinmap Problem
« Reply #4 on: February 19, 2014, 10:34:43 AM »
Salut,

je weiter ich in den Code der RGB Matrix eintauche umso schlimmer wird es. Leider ist der Code sehr undokumentiert ... Er verwendet timer2 um die Register des Matrixtreiber durchzuschalten. Damit läuft dieses Shield auch nicht auf einem Leonardo, da dieser keinen Timer2 hat. Da das Shield die gleiche Hardware wie der Rainbowduino (nur ohne ATmega168) verwendet, müsste man den Rainbowduino code und die Beschreibung der Hardware dazu verwenden können, den Code sinnvoll umzuschreiben.
Wenn ich aber bedenke, dass ich für 10 Euro mehr einen Neopixel-Matrix erhalte, dann sehe ich keine Sinn in dem Aufwand, diesen Code auf Meag und Leonardo zu protieren.

Ciao, Mathias

microtherion

  • freakyfriday
  • Full Member
  • *
  • Posts: 163
  • Karma: +13/-0
Re: Pinmap Problem
« Reply #5 on: February 20, 2014, 02:34:58 AM »
\je weiter ich in den Code der RGB Matrix eintauche umso schlimmer wird es. Leider ist der Code sehr undokumentiert ... Er verwendet timer2 um die Register des Matrixtreiber durchzuschalten.

Wenn dies nur wegen der Interrupt-Routinen geschieht, ist es weiter nicht schlimm, aber wenn die PWM-Ausgänge genutzt werden, kann es sein, dass das Shield physisch schlicht nicht mit anderen Arduinos kompatibel ist.

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Re: Pinmap Problem
« Reply #6 on: February 20, 2014, 10:44:39 AM »
Salut,

ich glaube nicht, dass die PWM Ausgänge genutzt werden, da die verwendeten Pins nicht alle PWM tauglich sind, speziell A0-A2. Ich verstehe den Code so, dass die Matrix gemultiplext wird, das heißt dass über timer2 die jeweilige Zeile angewählt und gefeuert wird.
Der Code ist dem Originalcode des Rainbowduino entnommen. Aber wie gesagt, eine RGB Matrix mit NeoPixel zu realisieren ist weitaus einfacher, kostet ca 10 Euro mehr, braucht nur einen Pin und läuft auf allen Boards, sogar dem STM32Fx-Discovery ...
Und mit einem Uno ist die Elecfreaks Matrix ja schon ein schönes Teil. Nur rentiert sich der Portierungsaufwand nicht

Ciao, Mathias

 

anything