0

I have a concern about the library port handling. I have used direct port direction manipulation successfully in previous projects but there seems to be a problem here.

// This code mostly taken from the example
#include "LedControl.h"
LedControl lc=LedControl(11,13,10,1);
//LedControl lc=LedControl(12,11,10,1); // original
// pin 12 is connected to the DIN pin (now MOSI 11)
// pin 11 is connected to the CLK pin (now SCK 13)
// pin 10 is connected to the CS pin (now SS 10)
// 1 as we are only using 1 MAX7219
// I am actually using all arduino pins except 12 for my project
#define PD_MSK B11111100 // Data pins PD2..7 (pins2..7)
#define PB_MSK B00000011 // Data pins PB0,1 (pins8,9)
#define PC_MSK B00001111 // Data pins PC0..3 (pins 14..17)
void setup()
{
// set pins 2..9 as inputs 
 DDRD = DDRD & !PD_MSK; // this works OK
 DDRB = DDRB & !PB_MSK; // configure ports D,B inputs *** doesnt work with this
 // pinMode(8, INPUT); //*** does work with this
 //pinMode(9, INPUT); //*** does work with this
 DDRC = DDRC | PC_MSK; // configure PortC0..3 as outputs
 PORTC |= 0x0F; // set PortC0..3 high (default)
 // the zero refers to the MAX7219 number, it is zero for 1 chip
 lc.shutdown(0,false);// turn off power saving, enables display
 lc.setIntensity(0,8);// sets brightness (0~15 possible values)
 lc.clearDisplay(0);// clear screen
}
void loop()
{
 //numbers 7 to 0
 for (int a=0; a<8; a++)
 {
 lc.setDigit(0,a,a,false);
 }
 delay(1000);
 //display number 8 on all segments
 for (int a=0; a<8; a++)
 {
 lc.setDigit(0,a,8,false);
 }
 delay(1000);
 // numbers 7 to 0 reverse order
 for (int a=8; a>=0; a--)
 {
 lc.setDigit(0,a,a,false);
 //delay(100);
 }
 delay(1000);
}

The direct port direction setting does not seem to allow the library to work while the pinMode commands doing the same job do. I note that the library uses software SPI but I would like to use hardware if possible. I have certainly used hardware SPI with frequent port direction changes on the remaining pins for other projects. Any insight as to why this problem occurs?

Thanks.

VE7JRO
2,51519 gold badges27 silver badges29 bronze badges
asked Apr 6, 2020 at 17:36
5
  • What is the connection between "the library does not work if I setup ports manually" and "I would like to use hardware SPI"? Commented Apr 7, 2020 at 6:29
  • 1
    Since most libraries come as Open Source, did you peek into its sources? Is this one open? If so, what did your research reveal? Commented Apr 7, 2020 at 6:30
  • 3
    The ! is a logic operator. Bitwise variant is ~ Commented Apr 7, 2020 at 11:44
  • However after the start/restart DDRx are cleared and configured as inputs, so I don't see any point in those &= Commented Apr 7, 2020 at 11:51
  • What tells "LedControl.h" that you are using hardware SPI vs software SPI? Commented Apr 7, 2020 at 14:07

1 Answer 1

-1

As always I recommend the old RTFM (read the f***ing manual) of the LedControl.h library.
In the FAQ its clearly stated:

Why don't you use the hardware SPI-Bus of the Arduino?

When I wrote the first version of the library I didn't knew much about the Arduino or AVR processors in general and I knew nothing about writing code for the hardware SPI-bus on an ATMega. But I knew how the SPI protocol works and how I could make this work using simple digitalWrite() commands. I turned out the library code is fast enough for common use cases, so there is no need for doing Hi-Speed communications.

Other strong points in favour of the (admittedly trivial) code design are - Use any three free IO-Pins of your board for the hardware - Simple to debug. Much easier than managing 3 differnt SPI devices connected to the same hardware bus - Library is easily portable to other platforms, since it uses only two very basic functions from the Arduino language

So with this library you clearly have never used hardware SPI (although you could use the pins, but only via softwareSPI)

answered Apr 9, 2020 at 8:44
1
  • 1
    Answer #2 pointed out that I had used the wrong operator to set the port direction. (! instead of ~ - bitwise.) My mistake! I want to use hardware SPI in my eventual project (this was just a test) as it can be faster. I used this library to ensure that the external hardware worked -it does now. Using different pins has no benefit in my case so I will probably write my own (hardware) SPI driver. I already have a port direction control system to create a 8bit IO bus for use with other external hardware - if I copy it correctly this time. Thanks to all who took time and found my error. Commented Apr 10, 2020 at 10:02

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.