Ein Zähler mit nur 3 Segmenten ist ziehmlich wenig. Ich hätte C - Code für 5 Stellen 7 Seg. an einem Mega48. Allerdings sind die Anschlüsse etwas durcheinander.
Hi,
heute habe ich 3 7-Segmet Displays bekommen.
Ich möchte mit einem ATmega8 einen Zähler mit einem Display bauen.
1-2-3-4-5-6-7-8-9-0-1-2-3-...
Hat zufällig jemand einen Code? Egal ob in C oder Assembler.
MFG Flexxx
Ein Zähler mit nur 3 Segmenten ist ziehmlich wenig. Ich hätte C - Code für 5 Stellen 7 Seg. an einem Mega48. Allerdings sind die Anschlüsse etwas durcheinander.
Nein, ich meinte, dass ich nur ein Segment-Display verwenden will. Einfach nur von 0-9 .
0-1-2-3-4-5-6-7-8-9-0-1-2-3-4-5-6-7-8-9-0-1-2-3-4-5-6-7-8-9-0...
Für einfach nur eine Stelle sollte man keinen wirklichen Code brauchen. Das einzige was vielleicht hilfreich wäre, wie die zahlen aussehen. Das ist etwas Zeitaufwendig beim Eintippen. Hier der Code teil bei mir:
Code:#define sega 128 // Werte zu den Segmenten #define segb 8 // an die Pinbelegung anpassen ! #define segc 32 #define segd 64 #define sege 16 #define segf 1 #define segg 4 #define segdp 2 const unsigned char segmente[10] = { sega+segb+segc+segd+sege+segf, segb+segc, sega+segb+segg+sege+segd, sega+segb+segg+segd+segc, segf+segg+segb+segc, sega+segf+segg+segc+segd, segf+sege+segg+segd+segc, sega+segb+segc, sega+segb+segc+segd+sege+segf+segg, sega+segb+segc+segd+segg+segf }; .... PORTB = segmente[zahl] ;
Wie soll ich das 7-Segment Dispay an dem ATmega8 anschließen?
Der Atmega hat 28 Beine und das Display 10. Gibt es irgenwo eine Beschreibung der Beine des Displays?
Ich habe mir einmal das Datenblatt der Segmentanzeige genauer angeschaut. Kann ich das Display an PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7 anschließen? Ich programmiere mit ISP. Manche Anschlüsse sind schon belegt: PB3=MOSI/PB4=MISO/PB5=SCK. Bei dem ATTiny13 hat es auch nix ausgemacht darum glaube ich, dass es bei dem ATmega8 auch nix ausmacht.
MFG Flexxx
Zu den Display gibt es datenblätter. Wenn man genau den Typ nicht findet, ist es auch nicht so schlimm, die belegung ist meistens gleich. Von den 10 Pins sind normal 2 verbunden. Je nach Ausführung kommen die Direkt an GND oder VCC.
Die restlichen 8 Pins sind die Segmente + DP. Die werden über Widerstände von z.B. 330 Ohm oder 470 Ohm an 8 IO Pins des Mega. Beforzugt an einen Port. Beim Mega8 wäre das vermutlich PortD. In welcher Reihenfolge ist egal, das kann man in der Software anpassen. Im Programmauschnitt sind das die #defines.
Hier habe ich ein Programm. Leider ist es für Segmentanzeigen mit gemeisamer Anode. Meine Anzeige hat aber eine gemeinsame Kathode.
Was muss ich ändern, damit aich diese läuft?
Der Code:
Code:.include "m8def.inc" .def zero = r1 .def count = r16 .def temp1 = r17 .org 0x0000 rjmp main ; Reset Handler ; main: ldi temp1, LOW(RAMEND) ; Stackpointer initialisieren out SPL, temp1 ldi temp1, HIGH(RAMEND) out SPH, temp1 ; ldi temp1, $FF ; die Anzeige hängt am Port D out DDRD, temp1 ; alle Pins auf Ausgang ; ldi count, 0 ; und den Zähler initialisieren mov zero, count ; loop: ldi ZL, LOW(Codes*2) ; die Startadresse der Tabelle in den ldi ZH, HIGH(Codes*2) ; Z-Pointer laden mov temp1, count ; die wortweise Adressierung der Tabelle add temp1, count ; berücksichtigen add ZL, temp1 ; und ausgehend vom Tabellenanfang adc ZH, zero ; die Adresse des Code Bytes berechnen lpm ; dieses Code Byte in das Register r0 laden out PORTD, r0 ; und an die Anzeige ausgeben ; inc count ; den Zähler erhöhen, wobei der Zähler cpi count, 10 ; immer nur von 0 bis 9 zählen soll brne wait ldi count, 0 ; wait: ldi r17, 10 ; und etwas warten, damit die Ziffer auf wait0: ldi r18, 0 ; der Anzeige auch lesbar ist, bevor die wait1: ldi r19, 0 ; nächste Ziffer gezeigt wird wait2: dec r19 brne wait2 dec r18 brne wait1 dec r17 brne wait0 ; rjmp loop ; auf zur nächsten Ausgabe ; Codes: ; Die Codetabelle für die Ziffern 0 bis 9 ; sie regelt, welche Segmente für eine bestimmte ; Ziffer eingeschaltet werden müssen ; .db 0b11000000 ; 0: a, b, c, d, e, f .db 0b11111001 ; 1: b, c .db 0b10100100 ; 2: a, b, d, e, g .db 0b10110000 ; 3: a, b, c, d, g .db 0b10011001 ; 4: b, c, f, g .db 0b10010010 ; 5: a, c, d, f, g .db 0b10000010 ; 6: a, c, d, e, f, g .db 0b11111000 ; 7: a, b, c .db 0b10000000 ; 8: a, b, c, d, e, f, g .db 0b10010000 ; 9: a, b, c, d, f, g
Für die änderung auf gemeinsame Kathode müßte man die Daten aus der Tabelle invertieren. Entweder direkt in der Tabelle, oder zu Laufzeit.
Sorry ich versteh gar nix. Was muss ich genau umkehren?
Lesezeichen