www.mikrocontroller.net

Forum: Projekte & Code Bibliothek: MAX 7219 / 7221 an AVR (GCC)


Autor: Philipp M. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine kleine Bibliothek geschrieben um einen MAX 7219 mit einem 
AVR Mikrocontroller anzusteuren. Wer Interesse daran hat kann sie sich 
runterladen und sie ohne Einschränkungen benutzen. Getestet wurde sie 
mit einem 7219er jedoch sollte sie auch mit einem 7221er funktionieren.

Die meisten Funktionen dienen dazu eine Zahl auf einer bis zu 
8-Stelligen 7-Segment Anzeige, die gemäß des Datenblatts angeschlossen 
wurde, darzustellen. Die Funktion "max7219_send" kann jedoch mit 
beliebigen Parametern aufgerufen werden und dazu benutzt werden die 
angeschlossenen LEDs völlig individuell anzusteuren.

Das Archiv enthält die ausführlich kommentierte Header-Datei die 
Code-Datei sowie das Datenblatt des MAX 7219/7221.


Über Kritik und Verbesserungsvorschläge sowie Bilder von eueren 
Projekten würde ich mich freuen.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp M. schrieb:
> Über Kritik und Verbesserungsvorschläge sowie Bilder von eueren
> Projekten würde ich mich freuen.

1) Die Daten in max7219_hex() lassen sich effektiver aus einer
   kleinen Tabelle lesen
2) Der Header ist nicht geschützt gegen Mehrfach-Includes
3) Der Header verwendet uint16_t, includiert aber nicht <stdint.h>
4) Mach die Funktionen entweder extern im Header oder static im
   C-Modul. Das macht den Sichtbarkeitsbereich klarer und static
   ermöglicht dem Compiler Optimierungen
5) Der Header verwendet PORTD etc, includet aber nicht <avr/io.h>
6) max7219_disp_int8() könnte zurückgreifen auf max7219_disp_uint8()
7) Sowas ist teuer auf AVR:
   if (Data & (1<<(7-i)))
   Stattdessen schaust du besser immer auf Bit 7 und schiebst Data
   nach links in jedem Schleifendurchlauf
8) Du verwendest <util/delay.h>? Das solltest du mit Bedacht tun.
   Ich seh die Verwendung jedoch nicht --> Include überflüssig
9) In Funktionen wie max7219_disp_uint16() erhälst du die Anzahl der
   Ziffern während der Ausgabe, sie muss nicht extra und teuer vor-
   berechnet werden.

Johann

Autor: Philipp M. (spannungsabfall)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hinweise.

ich habe jetzt Punkt 1,2,3,4,5,7,8 abgehandelt.

Wie ich allerdings die Ziffernanzahl bei der Ausgabe herausfinden soll 
weiß ich nicht. Es sei denn ich würde in die Ausgabeschleife zusätzliche 
Abfragen einbauen, und dann bräuchte es im Endeffekt genauso viel 
Rechenzeit wie wenn ich die Abfrage vorher mache.

Gruß

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst Du dann die aktualisierte Lib wieder zur Verfügung stellen?

Autor: Philipp M. (spannungsabfall)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habe ich ganz vergessen. Hier die überarbeiteten Dateien.

Autor: Noch Grün (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Gute Lib sehr Liebevolle und ausführlich Kommentiert .
Bis her keine Probleme läuft Top!!!

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void max7219_disp_int8(int8_t Number)

Aufpassen!
-128 geht bei Dir nicht, da positive Zahlen nur bis 127 gehen --->
Anders herum lösen: positive Zahlen nach negativ wandeln, das geht 
immer:

void max7219_disp_int8(int8_t n){char d=1,i=0;
  if(n<0)    {max7219_send(1,d++);}else{n = -n;} //Vorz.
  if(n<=-100){max7219_hex (1,d++);n += 100;} //Hunderter
  if(n<= -10){n += 10;i = 1;while(n <= -10){n += 10;i++;}
    max7219_hex(i,d++);}//Zehner
  max7219_hex(-n,d);}//Einer



Code aus dem Stegreif getippt ohne Test!

Warum ist d=1 und nicht d=0 (im Originalcode: for (i=1;...) )?

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier kann man ebenso sparen:

void max7219_clock_out(unsigned char d){
  unsigned char m=128;do{ //Maske und gleichzeitig "Schleifenzähler"
    max7219_PORT         &=~(1<<max7219_CLK); //Sclk lo
    if(d&m){max7219_PORT |= (1<<max7219_DIN);}//Sdta hi
    else   {max7219_PORT &=~(1<<max7219_DIN);}//Sdta lo
    max7219_PORT         |= (1<<max7219_CLK); //Sclk hi, Datenübernahme
    }while(m>>=1); //nächstes Bit, bis keine mehr da sind
  }

Autor: Philipp M. (spannungsabfall)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

was die -128 angeht hast du vermutlich recht. Muss ich mir mal 
anschauen. Der Code ist jetzt auch schon 4 Jahre alt.^^

Warum i bei 1 anfängt kann ich allerdings erklären.

Wie im Headerfile erklärt, nummeriret die Bibliothek die einzelnen 
Zeichenpositionen mit 1-8 und nicht wie in der Informatik üblich mit 
0-7. Das liegt daran, dass die Zeichnummern so direkt den 
Registeradressen des Max7219 entsprechen. Adresse 0 ist nämlich eine 
No-Op-Adresse. Befehle an diese haben keine Auswirkung (wird wohl fürs 
Dasy-Chaining gebraucht).
Die Resgister 1-8 beschreiben dann den Zusatnd der Zeichen 0-7. Um mir 
die dauernde Umrechnung von Register zu Zeichenposition zu ersparen habe 
ich sie einfach auch mit 1-8 nummeriert.

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider hat sich in meinem oberen Code (void max7219_disp_int8(int8_t n)) 
ein Fehler eingeschlichen, es werden alle Nullen wegrationalisiert, egal 
ob führend oder innerhalb der Zahl.

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An welche Pins des Mikrocontrollers (ATMEGA16 ) muss ich die Pins 
DIN/LOAD/CLK des MAX7219 anschließen?

Und wie übertrage ich in meinem Programm Dezimalzahlen an das Display? 
Also wie spreche ich die Bibliothek von meinem Programm aus an, wenn ich 
die Bibliothek eingebunden habe? Ich nutze MyAVR Studio.

Autor: Philipp M. (spannungsabfall)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Pinbelegung kann im unteren Teil der max7219.h eingestellt werden. 
Dezimalzahlen sind noch nicht unterstützt. Das wäre eine Sinvolle 
Erweiterung.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.