PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 7-Segment Display mit ATmega8



Zwerwelfliescher
18.07.2009, 17:52
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

Besserwessi
18.07.2009, 18:27
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.

Zwerwelfliescher
18.07.2009, 18:34
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...

Besserwessi
18.07.2009, 19:08
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:


#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] ;

Zwerwelfliescher
19.07.2009, 10:42
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?

Zwerwelfliescher
19.07.2009, 11:04
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

Besserwessi
19.07.2009, 11:04
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.

Zwerwelfliescher
19.07.2009, 12:00
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:


.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

Besserwessi
19.07.2009, 12:37
Für die änderung auf gemeinsame Kathode müßte man die Daten aus der Tabelle invertieren. Entweder direkt in der Tabelle, oder zu Laufzeit.

Zwerwelfliescher
19.07.2009, 12:45
Sorry ich versteh gar nix. Was muss ich genau umkehren?

Besserwessi
19.07.2009, 13:29
Bei Gemeinsamer Kathode leuchten die LEDs, wenn der IO Pin eine 1 Ausgibt. Bei gemeinsamer anode bei einer 0. Man muß also 0 und 1 vertauschen. In asm gibts dazu den Befehl eori ...,255 (geht aber nur mir R16...R31).

Das Codestück in C sollte für Anzeigen mit gemeinsamer Kathode sein.

Zwerwelfliescher
19.07.2009, 14:29
Danke. Das hilft mir weiter.

Vitis
20.07.2009, 09:44
Vorwiderstände nicht vergessen