- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: 7-Segment Display mit ATmega8

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.05.2009
    Ort
    Sinsheim b. Heidelberg
    Alter
    30
    Beiträge
    519

    7-Segment Display mit ATmega8

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.05.2009
    Ort
    Sinsheim b. Heidelberg
    Alter
    30
    Beiträge
    519
    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...

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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] ;

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.05.2009
    Ort
    Sinsheim b. Heidelberg
    Alter
    30
    Beiträge
    519
    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?

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.05.2009
    Ort
    Sinsheim b. Heidelberg
    Alter
    30
    Beiträge
    519
    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

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.05.2009
    Ort
    Sinsheim b. Heidelberg
    Alter
    30
    Beiträge
    519
    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

  9. #9
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Für die änderung auf gemeinsame Kathode müßte man die Daten aus der Tabelle invertieren. Entweder direkt in der Tabelle, oder zu Laufzeit.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.05.2009
    Ort
    Sinsheim b. Heidelberg
    Alter
    30
    Beiträge
    519
    Sorry ich versteh gar nix. Was muss ich genau umkehren?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad