Next revision | Previous revision |
de:examples:display:segment_display [2010/09/08 17:56] – angelegt Wember | de:examples:display:segment_display [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
---|
====== 7-Segment LED display ====== | ====== 7-Segment-LED-Anzeige ====== |
| |
//Necessary knowledge: [HW] [[en:hardware:homelab:digi]], [LIB] [[en:software:homelab:library:delay]], [LIB] [[en:software:homelab:library:module:segment_display]], [PRT] [[en:examples:digi:led]]// | //Notwendiges Wissen: [HW] [[en:hardware:homelab:digi]], [LIB] [[en:software:homelab:library:delay]], [LIB] [[en:software:homelab:library:module:segment_display]], [PRT] [[en:examples:digi:led]]// |
| |
===== Theorie ===== | ===== Theorie ===== |
| |
Der 7-Segment-LED-Indikator ist ein Display, dass aus sieben LED´s, die in Form einer acht positioniert sind, besteht. Beim An- oder Ausschalten der entsprechenden LED´s (Segmente) ist es möglich Zahlen von 0-9 wie auch einige Buchstaben darzustellen. | Die 7-Segment-LED-Zifferanzeige ist ein Display, welches aus sieben, in Form einer Acht angeordneten, LEDs besteht. Durch Ein- oder Ausschalten der entsprechenden LED´s (Segmente) ist es möglich Zahlen von 0-9 sowie einige Buchstaben darzustellen. |
| |
[{{ :examples:display:segment_display:segment_display_leds.png?300|Positioning of the LED indicator's segments and electrical scheme}}] | [{{ :examples:display:segment_display:segment_display_leds.png?300|Positionierung der Anzeigensegmente des LED sowie elektrisches Schema.}}] |
| |
Elektrisch werden alle Anoden der LED zu einer Anode am Pin //ca// angeschlossen. LEd´s werden durch das Schalten ihrer Kathoden (//a, b, c ...//). | Elektrisch werden alle Anoden der LEDs an einer Anode am Pin //ca// angeschlossen. Die LEDs leuchten durch Schalten ihrer Kathoden (//a, b, c ...//). Es gibt auch andere Verbindungen, bei denen die Anzeigen eine gemeinsame Kathode //cc// haben. Allgemein werden verschiedene Zifferanzeigen zur Darstellung mehrstelliger Ziffern genutzt. Hierzu verfügt das Display über ein Komma- (Punkt-) Segment //dp//. Insgesamt besitzt eine Anzeige dann 8 Segmente, wird jedoch aufgrund der Anzahl von Ziffer-Segmenten weiterhin 7-Segment-Display genannt. |
| |
Electrically all anodes of the LEDs are connected to one anode pin //ca//. LEDs are lit by switching their cathodes (//a, b, c...//). Exists also reversed connections, where the indicators have a common cathode //cc//. Generally several number-indicators are used for displaying multi digit numbers - for this purpose the indicators are equipped with coma (point) segment //dp//. All in all one indicator has 8 segments, but they are still called 7-segmented according to the number of number-segments. | |
| |
LED number-indicators are easy to use, they can be controlled directly from the pins of the microcontroller, but there are also special drivers, which able to control number-indicators using fewer pins of the microcontroller. There are different colors of LED number indicators, which can be very bright and very large. For displaying the entire Latin alphabet exist indicators with extra segments. | LED number-indicators are easy to use, they can be controlled directly from the pins of the microcontroller, but there are also special drivers, which able to control number-indicators using fewer pins of the microcontroller. There are different colors of LED number indicators, which can be very bright and very large. For displaying the entire Latin alphabet exist indicators with extra segments. |
| |
| Die Benutzung von LED Zifferanzeigen ist recht einfach. Sie können direkt über die Pins des Mikrocontrollers kontrolliert werden. Es gibt jedoch auch spezielle Treiber, die dafür sorgen, dass für die Nutzung der Anzeige weniger Pins des Mikrocontrollers benötigt werden. Es gibt zwei verschiedene Farben von LED-Zifferanzeigen, die sehr klar und groß sein können. Zur Anzeige des gesamten Alphabets gibt es Anzeigen mit zusätzlichen Segmenten. |
| |
===== Übung ===== | ===== Übung ===== |
| |
Es gibt einen 7-Segment-LED-Indikator am digitalen I/O Modul. Es wird über einen Treiber mit dem seriellen Interface A6275 kontrolliert. Das serielle Interface des Treibers ist dem SPI ähnlich, wo sowohl Taktsignal als auch Datensignale genutzt werden. Anders als beim SPI wird //chip-select// nicht genutzt und wird durch die //latch// Funktion ersetzt.Es ist mit dem ATmega128 wie folgt verbunden: | Am digitalen I/O Modul befindet sich eine 7-Segment-LED-Zifferanzeige. Sie wird über einen Treiber mit der seriellen Schnittstelle A6275 kontrolliert. Die serielle Schnittstelle des Treibers ist dem SPI ähnlich, bei dem sowohl Taktsignal als auch Datensignale genutzt werden. Anders als beim SPI wird //chip-select// nicht genutzt und wird durch die //latch// Funktion ersetzt. Es ist mit dem ATmega128 wie folgt verbunden: |
| |
[{{ :examples:display:segment_display:segment_display_driver_logic.png?300|The build-up of the LED driver's shift-index with corresponding segments of the indicator.}}] | [{{ :examples:display:segment_display:segment_display_driver_logic.png?300|Aufbau des Verschiebungsindexes des LED Treibers mit den zugehörigen Segmenten der Anzeige.}}] |
| |
* Latch-signal (//latch//) - PG2 | * Latch-Signal (//latch//) - PG2 |
* Clock-signal (//clock//) - PC7 | * Taktsignal (//clock//) - PC7 |
* Data-signal (//data//) - PC6 | * Datensignal (//data//) - PC6 |
| |
~~CL~~ | ~~CL~~ |
| |
Die daten werden per Bits durch den Datenpin gesendet. Jedes mal wenn das Taktsignal High ist wird der Inhalt des Shift-Indexes nach rechts geschoben und der Bit vom Datenpin wird in die Zelle ganz links gelesen. So werden 8 Bits in den Shift Index geladen. Wenn das Latch-Signal high gesetzt ist wird der Wert des Shift-Indexes in den Latch-Index geladen, wo es bis zu einem erneuten Laden verbleibt. Jedes Bit des Latch-Indexes ist durch eine Spannungsschaltung mit einem Segment eines Indikators verbunden. Das Segment leuchtet während die Bitrate high ist. | Die Daten werden in Form von Bits über den Datenpin gesendet. Immer, wenn das Taktsignal high wird, wird der Inhalt des Verschiebungsindexes nach rechts geschoben und das Bit vom Datenpin wird in die Zelle ganz links gelesen. So werden 8 Bits in den Verschiebungsindex geladen. Wenn das Latch-Signal high gesetzt wird, wird der Wert des Verschiebungsindexes in den Latch-Index geladen, und verbleibt dort bis zu einem erneuten Laden. Jedes Bit des Latch-Indexes ist durch eine Spannungsschaltung mit einem Segment der Zifferanzeige verbunden. Das Segment leuchtet während die Bitrate high ist. |
| |
Um Nummern an dem HomeLab digitalen I/O Modul Indikator darzustellen sind die folgenden Funktionen in der Library von HomeLab enthalten. | Zur Darstellung von Ziffern auf der digitalen I/O Modulanzeige des HomeLab sind die folgenden Funktionen in der Bibliothek von HomeLab enthalten: |
| |
| |
<code c> | <code c> |
// | // |
// Set-up of the pins | // Einrichtung der Pins |
// | // |
static pin segment_display_latch = PIN(G, 2); | static pin segment_display_latch = PIN(G, 2); |
| |
// | // |
// Marking card. | // Markierung der Karte. |
// The bits are marking the segments. Lower ranking is A, higher ranking is DP. | // Die Bits markieren Segmente. Ein niedriger Rang wird mit A, ein hoher mit DP gekennzeichnet. |
// | // |
static const unsigned char segment_char_map[11] = | static const unsigned char segment_char_map[11] = |
0b01111111, | 0b01111111, |
0b01100111, | 0b01100111, |
0b01111001 // E like Error | 0b01111001 // E wie "Error" |
}; | }; |
| |
// | // |
// Start-up of the 7-segment indicator. | // Start der 7-Segment-Anzeige. |
// | // |
void segment_display_init(void) | void segment_display_init(void) |
| |
// | // |
// Displaying number on the 7-segment indicator. | // Darstellung einer Ziffer auf der 7-Segment-Anzeige. |
// | // |
void segment_display_write(unsigned char digit) | void segment_display_write(unsigned char digit) |
signed char i; | signed char i; |
| |
// Check-up of the number | // Überprüfung der Ziffer |
if (digit > 9) | if (digit > 9) |
{ | { |
} | } |
| |
// Number as the card of the segments. | // Ziffer wie Segmentkarte. |
map = segment_char_map[digit]; | map = segment_char_map[digit]; |
| |
// Latch-signal off | // Latch-Signal aus |
pin_clear(segment_display_latch); | pin_clear(segment_display_latch); |
| |
// Sending he bits. Higher ranking goes first. | // Senden von he Bits. Höherrangige zuerst. |
for (i = 7; i >= 0; i--) | for (i = 7; i >= 0; i--) |
{ | { |
// Setting the pin according to the value of the bit of the card. | // Pin entsprechend Bitwert der Karte setzen. |
pin_set_to(segment_display_data_out, bit_is_set(map, i)); | pin_set_to(segment_display_data_out, bit_is_set(map, i)); |
| |
// The clock-signal as high for a moment. | // Taktsignal high setzen. |
pin_set(segment_display_clock); | pin_set(segment_display_clock); |
_delay_us(1); | _delay_us(1); |
| |
// The clock-signal as low. | // Taktsignal low setzen. |
pin_clear(segment_display_clock); | pin_clear(segment_display_clock); |
_delay_us(1); | _delay_us(1); |
} | } |
| |
// Latch-signal on. | // Latch-Signal ein. |
pin_set(segment_display_latch); | pin_set(segment_display_latch); |
} | } |
</code> | </code> |
| |
Um Nummern und den Buchstaben "E" darzustellen, wird ein konstantes Array //segment_char_map// erstellt, wo das Leuchten von allen acht Segmenten mit Bit 1 markiert wird und wenn es ausgeschaltet ist mit einem Bit 0 markiert wird. | Um Ziffern und den Buchstaben "E" darzustellen, wird ein konstantes Array //segment_char_map// erstellt, bei dem das Leuchten von allen acht Segmenten mit Bit 1 und das Ausschalten mit Bit 0 markiert wird. Die Bits markieren von hoch zu niedrig (von links nach rechts in Binärform) Segmente DP, G, F, E, D, C, B, A. Die Kontrollschnittstelle des Treibers wird durch SPI Software realisiert, zum Beispiel durch Nutzung einer Software, die die Datenkommunikationspins des Programms kontrolliert. Alle drei Pins werden durch // segment_display_init// als Outputs gesetzt. // segment_display_write// dient der Darstellung der Funktion, welche die Segmentkarte der Markierung vom Array erkennt und diese bitweise zum Treiber überträgt. Die Taktfrequenz mit Softwareverzögerung liegt bei ungefähr 500 kHz. |
| |
| |
For displaying numbers and the letter “E”, is created a constant array //segment_char_map//, where lighting of all 8 segments is marked with bit 1 and switch off is market with bit 0. The bits form higher to lower (from left to right in binary form) are marking segments DP, G, F, E, D, C, B, A. The control interface of the driver is realized through software SPI, i.e. by using a software for controlling the data communication pins in the program. All three pins are set as output with // segment_display_init// function. // segment_display_write// is for displaying the function, which finds the segment-card of the mark from the array and transmits bit by bit all values of the segments to the driver. The frequency of the clock signal with the software delays is now approximately 500 kHz. | |
| |
The following is a more concrete example of a program for using the number-indicator. Previously described function of the library is described in the program. The program counts numbers from 0 to 9 with approximate interval of 1 second. Such counting is achieved by taking a module from a much larger number. | |
| |
| Das nachfolgende Beispielprogramm beschreibt die Nutzung der Zifferanzeige. Die zuvor beschriebene Funktion der Bibliothek wird in dem Programm erläutert. Das Programm Zählt Ziffern von 0 bis 9 mit einem Intervall von etwa einer Sekunde. Dieses wird dadurch erreicht, dass ein Modul mit einer weitaus größeren Ziffer verwendet wird. |
| |
<code c> | <code c> |
// | // |
// The example program of the 7-segment LED indicator of the HomeLab's | // Das Beispielprogramm der 7-Segment-LED-Anzeige des I/O-Moduls des HomeLab |
// input-output module. | |
// | // |
#include <homelab/module/segment_display.h> | #include <homelab/module/segment_display.h> |
| |
// | // |
// Main program. | // Hauptprogramm. |
// | // |
int main(void) | int main(void) |
int counter = 0; | int counter = 0; |
| |
// Set-up of the 7-segment indicator. | // Einrichtung der 7-Segment-Anzeige. |
segment_display_init(); | segment_display_init(); |
| |
// Endless loop. | // Endlosschleife. |
while (true) | while (true) |
{ | { |
// Displaying the ones values of the counter. | // Anzeige der Werte des Timers. |
segment_display_write(counter % 10); | segment_display_write(counter % 10); |
| |
// Counting very long. | // Lange zählen. |
counter++; | counter++; |
| |
// Delay for 1 second. | // Verzögerung von 1 Sekunde. |
sw_delay_ms(1000); | sw_delay_ms(1000); |
} | } |
} | } |
</code> | </code> |