
7-Segment-Anzeige am RPi Pico
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry
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