7-Segment-Anzeige am  RPi Pico         

               

Elektronik-Labor  Projekte  Mikrocontroller  Raspberry     




Siehe auch: RPi Pico Schaltungen und Projekte, Kap 25 und 26

Die SDK-Funktionen zum Rpi Pico haben noch viel Nützliches zu bieten. Dazu gehören die mask-Funktionen, mit denen man mehrere GPIOs zu einem größeren Port vereinigen kann. Man kann also einen 8-Bit-Port, einen 16-Bit-Port oder sogar einen gesamten Port für alle Ein/Ausgänge bilden. Hier soll eine vierstellige Siebensegmentanzeige angesteuert werden, die insgesamt 12 Anschlüsse hat. Vier davon sind mit den gemeinsamen Kathoden der einzelnen Digits 1 bis 4 verbunden. Die übrigen acht Pinne gehören zu den Anoden der Segmente a bis f und des Dezimalpunkts.



Zur Ansteuerung wurden die 12 GPIOs am rechten Rand des Pico verwendet, also die Ports GP10 bis GP21. Die Anschlüsse wurden so verbunden, dass in der Mitte der kürzeste Draht ist, der dann unter den anderen Drähten liegt. Dadurch kehrt sich die Reihenfolge der Ports GP10 bis GP15 um.



Damit ergibt sich die folgende Port-Zuordnung:



Betrachtet man alle 32 möglichen Ports, dann ergibt sich die folgende Belegung. Die mittleren 12 Ports werden gebraucht.



Damit ergibt sich die Maske 0x003FFC00, die angibt, welche Anschlüsse als gemeinsamer Port gesteuert werden sollen. gpio_init_mask (mask) initialisiert diese Gruppe. Mit gpio_set_dir_masked (mask, value) werden alle als Ausgänge geschaltet. Mit gpio_put_masked (mask, value) kann man alle 12 Bits gemeinsam entsprechend den Bits in value schalten. Oder man kann sie mit gpio_set_mask (mask) komplett hochschalten.

Zusätzlich wurden die Muster d[0] bis d[9] für die Ziffern 0 bis 9 festgelegt. Darin sind an den Stellen der vier gemeinsamen Kathoden Einsen eingesetzt, sodass zunächst alle vier Digits ausgeschaltet werden. In einem zweiten Schritt wird dann der gwünschte Kathoden-Anschluss heruntergeschaltet.

Eine weitere sehr nützliche Funktion schaltet den Strom der Ports um. Es gibt vier Stufen mit 2 mA, 4 mA, 8 mA und 12 mA. In diesem Fall werden alle Segmentleitungen auf 2 mA begrenzt und alle Kathoden-Digits auf 12 mA: gpio_set_drive_strength(10,GPIO_DRIVE_STRENGTH_12MA). Damit kommt man ganz ohne Vorwiderstände für die Display-LEDs aus.


//Pico 4*7-Segement
 
#include "pico/stdlib.h"

void setup() {
  uint32_t mask = 0x003FFC00;
  uint32_t value = 0x003FFC00;  
  uint32_t d[14];
  d[0]= 0b111011110101<<10;
  d[1]= 0b111001110111<<10;
  d[0]= 0b111111110101<<10;
  d[1]= 0b111001000101<<10;
  d[2]= 0b111011110011<<10;
  d[3]= 0b111011010111<<10;
  d[4]= 0b111101000111<<10;
  d[5]= 0b011111010111<<10;
  d[6]= 0b011111110111<<10;
  d[7]= 0b111011000101<<10;
  d[8]= 0b111111110111<<10;
  d[9]= 0b111111010111<<10;

  Serial.begin(115200);
 
  gpio_init_mask (mask);
  gpio_set_dir_masked (mask, value);
  gpio_set_drive_strength(10,GPIO_DRIVE_STRENGTH_12MA);
  gpio_set_drive_strength(11,GPIO_DRIVE_STRENGTH_2MA);
  gpio_set_drive_strength(12,GPIO_DRIVE_STRENGTH_2MA);
  gpio_set_drive_strength(13,GPIO_DRIVE_STRENGTH_2MA);
  gpio_set_drive_strength(14,GPIO_DRIVE_STRENGTH_2MA);
  gpio_set_drive_strength(15,GPIO_DRIVE_STRENGTH_2MA);
  gpio_set_drive_strength(16,GPIO_DRIVE_STRENGTH_12MA);
  gpio_set_drive_strength(17,GPIO_DRIVE_STRENGTH_2MA);
  gpio_set_drive_strength(18,GPIO_DRIVE_STRENGTH_2MA);
  gpio_set_drive_strength(19,GPIO_DRIVE_STRENGTH_12MA);
  gpio_set_drive_strength(20,GPIO_DRIVE_STRENGTH_12MA);
  gpio_set_drive_strength(21,GPIO_DRIVE_STRENGTH_2MA);
  //gpio_put_masked (mask, value);
  //gpio_set_mask (mask);

  int n=0;
  while(true){
    d[14]=d[n%10];
    int nn= n/10;
    d[13]=d[nn%10];
    nn= nn/10;
    d[12]=d[nn%10];
    nn= nn/10;
    d[11]=d[nn%10];
    nn= n/10;
    n++;
    for (int i=0; i<25; i++){
      gpio_put_masked (mask, d[11]);
      gpio_put(13,1);  //DP
      gpio_put(16,0);
      sleep_ms(1);
      gpio_put_masked (mask, d[12]);
      gpio_put(19,0);
      sleep_ms(1);
      gpio_put_masked (mask, d[13]);
      gpio_put(20,0);
      sleep_ms(1);
      gpio_put_masked (mask, d[14]);
      gpio_put(10,0);
      sleep_ms(1); 
    }
  }


void loop() {
}

In der for-Schleife werden alle vier Digits nacheinander für jeweils eine Millisekunde in einem Multiplex angesteuert. Der Dezimalpunkt muss mit gpio_put(13,1) einzeln gesetzt werden, was hier beim ersten Digit getan wurde. Insgesamt zählt das Programm eine Variable n in einem Takt von 0,1 s hoch. Dann werden die einzelnen Ziffern abgetrennt und ihre Muster in d[11] bis d[14] abgelegt, um sie in der Multiplex-Schleife auszugeben. So entsteht eine ruhige, nicht flackernde Anzeige.





Elektronik-Labor  Projekte  Mikrocontroller  Raspberry