0.56" 4-Digit 7-Segment Display w/I2C Backpack --- Probleme mit der Ansteuerung

Habe jetzt nochmal einen neuen Code nach Dirks Vorlage geschrieben aber das Display bleibt dunkel.
Kann es sein das ich bereits beim Initialisieren des TWI was verbockt habe?
Z.B. SCL falsch eingestellt?
Die MCU läuft mit 1Mhz und SDA und SCL sind mit 4,7Kohm nach +5V verbunden.

Hier der neue Code

Code:
	 .include"m8def.inc"

 rjmp init

 init:

 ldi r16,high(ramend)
 out sph,r16
 ldi r16,low(ramend)
 out spl,r16

 ldi r17,0xE0       ;Slave Adresse

 sei                ;interrupts aktivieren


;initialisiere TWI
ldi r16,0b00000000 ;SCL Prescaler /1
out TWSR,r16
ldi r16,20         ;Bit rate generator Prescaler
out TWBR,r16


;initialisiere Slave

;Oszillator einschalten

; *** START Condition senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
  out TWCR, r16
  rcall wait_i2c

; *** Adresse + R/W Bit senden ***
  out TWDR, r17  ; Adresse + R/W bit
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

; *** Datenbyte senden ***
  ldi r16,0x21  ;Oszillator einschalten
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

; *** STOP senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
  out TWCR, r16
  rcall wait_stop

;Blinken aus,Display ein

; *** START Condition senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
  out TWCR, r16
  rcall wait_i2c

; *** Adresse + R/W Bit senden ***
  out TWDR, r17  ; Adresse + R/W bit
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

; *** Datenbyte senden ***
  ldi r16,0x81  ;Blinken aus,Display ein
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

; *** STOP senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
  out TWCR, r16
  rcall wait_stop

;Max Helligkeit

; *** START Condition senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
  out TWCR, r16
  rcall wait_i2c

; *** Adresse + R/W Bit senden ***
  out TWDR, r17  ; Adresse + R/W bit
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

; *** Datenbyte senden ***
  ldi r16,0xEF  ;Max Helligkeit
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

; *** STOP senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
  out TWCR, r16
  rcall wait_stop

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;Display Anzeige 88:88
anzeige:

; *** START Condition senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
  out TWCR, r16
  rcall wait_i2c

; *** Adresse + R/W Bit senden ***
  out TWDR, r17  ; Adresse + R/W bit
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** Startadresse senden ***
  ldi r16,0x00            ;Startadresse
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** Datenbyte 0 senden ***
  ldi r16,0x00            ;Byte0,nicht genutzt
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** Datenbyte 1 senden ***
  ldi r16,0x7f            ;Byte1,1000er,8
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c
  
  ; *** Datenbyte 2 senden ***
  ldi r16,0x00            ;Byte2,nicht genutzt
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** Datenbyte 3 senden ***
  ldi r16,0x7f            ;Byte3,100er,8
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** Datenbyte 4 senden ***
  ldi r16,0x00            ;Byte4,nicht genutzt
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** Datenbyte 5 senden ***
  ldi r16,0xff            ;Byte5,Doppelpunkt,ein
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** Datenbyte 6 senden ***
  ldi r16,0x00            ;Byte6,nicht genutzt
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** Datenbyte 7 senden ***
  ldi r16,0x7f            ;Byte7,10er,8
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** Datenbyte 8 senden ***
  ldi r16,0x00            ;Byte8,nicht genutzt
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** Datenbyte 9 senden ***
  ldi r16,0x7f            ;Byte9,1er,8
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** STOP senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
  out TWCR, r16
  rcall wait_stop

  rjmp anzeige


;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Unterprogramme

wait_i2c:
  in r16,TWCR
  sbrs r16,TWINT
  rjmp wait_i2c
  ret

wait_stop:
  in r16,TWCR
  sbrs r16, TWSTO
  rjmp wait_stop
  ret
 
Hallo Senpai,

ich habe gerade gesehen, dass ich eine Zeile zu viel entfernte, als ich das rcall eingefügt habe, um den Code ein bisschen zu verbessern.

Sorry, das liegt einfach daran, weil ich im Moment sehr sehr wenig Zeit habe, aber trotzdem helfen möchte ... dann passieren solche Fehler :)

Dirk :ciao:

Code:
; *** Adresse + R/W Bit senden ***   
out TWDR, r17  ; Adresse + R/W bit   
ldi r16, (1<<TWINT) | (1<<TWEN)
[B]out TWCR, r16[/B]   
rcall wait_i2c  

; *** Datenbyte senden ***   
ldi r16,0x21  ;Oszillator einschalten   
out TWDR, r16   
ldi r16, (1<<TWINT) | (1<<TWEN)
[B]out TWCR, r16[/B]   
rcall wait_i2c 

; *** STOP senden ***   
ldi r16, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)   
[B]out TWCR, r16[/B]   
rcall wait_stop

usw.
 
Hallo, ihr Beiden!

Nur mal eine Frage als ASM-Unwissender.....

Ist das hier wirklich richtig? :hmmmm:
Code:
;initialisiere TWI
ldi r16,[B][COLOR="#FF0000"]0b00000000[/COLOR][/B] ;SCL Prescaler /1
out TWSR,r16


Grüße,
Cassio
 
mist das ist mir gar nicht aufgefallen das die Ausgabe von TWCR fehlte......ich glaub für heute ist es langsam genug
der Kopf raucht....

Sorry, das liegt einfach daran, weil ich im Moment sehr sehr wenig Zeit habe, aber trotzdem helfen möchte ... dann passieren solche Fehler

Umso mehr Danke ich dir für deine Hilfe:D
 
Hallo, ihr Beiden!

Nur mal eine Frage als ASM-Unwissender.....

Ist das hier wirklich richtig? :hmmmm:
Code:
;initialisiere TWI
ldi r16,[B][COLOR=#FF0000]0b00000000[/COLOR][/B] ;SCL Prescaler /1
out TWSR,r16


Grüße,
Cassio

Hallo Cassio,

ja das stimmt schon so.

Der Prescaler wird dadurch deaktiviert (ist allerdings auch Reset-Zustand)

Man kann natürlich auch dezimal schreiben
ldi r16, 0
out TWSR, r16

Noch einen schönen Abend,
Dirk :ciao:
 
So Erstes Bild auf dem Fernseher;)
nachdem ich die ganzen out TWCR eingefügt habe zeigt er mir schonmal die 1er stelle an der rest fehlt irgendwie:confused::hmmmm:
aber das ist ja schonmal mehr was er Anzeigt im vergleich zu den letzten beiden Tagen....

edit:Irgendwo stimmt wohl was in der Bytereihenfolge noch nicht wenn ich die "nicht genutzten Bytes"
mit 0x7f lade leuchten auf einmal alle Felder...aber das lässt sich noch finden-
ps. sieht richtig klasse aus das Display der kauf hat sich gelohnt;)
 
edit:Irgendwo stimmt wohl was in der Bytereihenfolge noch nicht wenn ich die "nicht genutzten Bytes"
mit 0x7f lade leuchten auf einmal alle Felder...aber das lässt sich noch finden-
ps. sieht richtig klasse aus das Display der kauf hat sich gelohnt;)

Sorry. Noch einmal eine Korrektur:

Nach der Startadresse

Byte 0: 1000er
Byte 1: nicht genutzt
Byte 2: 100er
Byte 3: nicht genutzt
Byte 4: Doppelpunkt (0x00 aus, 0xFF an)
Byte 5: nicht genutzt
Byte 6: 10er
Byte 7: nicht genutzt
Byte 8: 1er
Byte 9: nicht genutzt
Byte 10..15: nicht genutzt

Ich hoffe jetzt stimmts :)
 
DSCF0158[1].jpg

hab ich gerad schon gemerkt und korrigiert;)
Es funktioniert endlich wie gedacht.

Hier der funktionierende Code für die nachfolgenden die genau so eine lange leitung haben wie ich:rolleyes:

Code:
 ;Display Ansteuerung
    ;0x3F, /* 0 */
    ;0x06, /* 1 */
    ;0x5B, /* 2 */
    ;0x4F, /* 3 */
    ;0x66, /* 4 */
    ;0x6D, /* 5 */
    ;0x7D, /* 6 */
    ;0x07, /* 7 */
    ;0x7F, /* 8 */
    ;0x6F, /* 9 */
    ;0x77, /* a */
    ;0x7C, /* b */
    ;0x39, /* C */
    ;0x5E, /* d */
    ;0x79, /* E */
    ;0x71, /* F */
    ;0x00, /* clear
	 .include"m8def.inc"

 rjmp init

 init:

 ldi r16,high(ramend)
 out sph,r16
 ldi r16,low(ramend)
 out spl,r16

 ldi r17,0xE0       ;Slave Adresse

 sei                ;interrupts aktivieren


;initialisiere TWI
ldi r16,0b00000000 ;SCL Prescaler /1
out TWSR,r16
ldi r16,20         ;Bit rate generator Prescaler
out TWBR,r16


;initialisiere Slave

;Oszillator einschalten

; *** START Condition senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
  out TWCR, r16
  rcall wait_i2c

; *** Adresse + R/W Bit senden ***
  out TWDR, r17  ; Adresse + R/W bit
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

; *** Datenbyte senden ***
  ldi r16,0x21  ;Oszillator einschalten
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

; *** STOP senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
  out TWCR, r16
  rcall wait_stop

;Blinken aus,Display ein

; *** START Condition senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
  out TWCR, r16
  rcall wait_i2c

; *** Adresse + R/W Bit senden ***
  out TWDR, r17  ; Adresse + R/W bit
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

; *** Datenbyte senden ***
  ldi r16,0x81  ;Blinken aus,Display ein
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

; *** STOP senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
  out TWCR, r16
  rcall wait_stop

;Max Helligkeit

; *** START Condition senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
  out TWCR, r16
  rcall wait_i2c

; *** Adresse + R/W Bit senden ***
  out TWDR, r17  ; Adresse + R/W bit
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

; *** Datenbyte senden ***
  ldi r16,0xEF  ;Max Helligkeit
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

; *** STOP senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
  out TWCR, r16
  rcall wait_stop

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;Display Anzeige 88:88
anzeige:

; *** START Condition senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
  out TWCR, r16
  rcall wait_i2c

; *** Adresse + R/W Bit senden ***
  out TWDR, r17  ; Adresse + R/W bit
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

  ; *** Startadresse senden(Datenbyte 0) ***
  ldi r16,0x00           ;Startadresse
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c


  ; *** Datenbyte 1 senden ***
  ldi r16,0x7f            ;Byte1,1000er,8
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c
  
  ; *** Datenbyte 2 senden ***
  ldi r16,0x00            ;Byte2,nicht genutzt
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

  ; *** Datenbyte 3 senden ***
  ldi r16,0x7f           ;Byte3,100er,8
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

  ; *** Datenbyte 4 senden ***
  ldi r16,0x00            ;Byte4,nicht genutzt
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

  ; *** Datenbyte 5 senden ***
  ldi r16,0xff            ;Byte5,Doppelpunkt,ein
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

  ; *** Datenbyte 6 senden ***
  ldi r16,0x00          ;Byte6,nicht genutzt
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

  ; *** Datenbyte 7 senden ***
  ldi r16,0x7f            ;Byte7,10er,8
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

  ; *** Datenbyte 8 senden ***
  ldi r16,0x00            ;Byte8,nicht genutzt
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  rcall wait_i2c

  ; *** Datenbyte 9 senden ***
  ldi r16,0x7f            ;Byte9,1er,8
  out TWDR, r16
  ldi r16, (1<<TWINT) | (1<<TWEN)
  out TWCR,r16
  rcall wait_i2c

  ; *** STOP senden ***
  ldi r16, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
  out TWCR, r16
  rcall wait_stop

  rjmp anzeige


;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Unterprogramme

wait_i2c:
  in r16,TWCR
  sbrs r16,TWINT
  rjmp wait_i2c
  ret

wait_stop:
  in r16,TWCR
  sbrs r16, TWSTO
  rjmp wait_stop
  ret

Und vielen Dank allen die mir geholfen haben hätte sonst bestimmt Wochenlang daran rumgeknobelt;)
 
Hier noch die korrigierte Zuordnung:


Byte 0: nicht genutzt
Byte 1: 1000er
Byte 2: nicht genutzt
Byte 3: 100er
Byte 4: nicht genutzt
Byte 5: Doppelpunkt (0x00 aus, 0xFF an)
Byte 6: nicht genutzt
Byte 7: 10er
Byte 8: nicht genutzt
Byte 9: 1er
Byte 10..15: nicht genutzt


Hallo!

Hm..... ich bin jetzt wieder der Meinung, dass es so etwas "unglücklich" ausgedrückt ist. :hmmmm:

Ich sende bei meinem Beispiel immer 11 Bytes am Stück!
Das sind dann:
Byte_0 = Startadresse des Digits (meist 0x00 für das erste Digit)
Byte_1 = 1. Datenbyte für 1. Digit
Byte_2 = 2. Datenbyte für 1. Digit (ungenutzt !)
Byte_3 = 1. Datenbyte für 2. Digit
Byte_4 = 2. Datenbyte für 2. Digit (ungenutzt !)
Byte_5 = 1. Datenbyte für 3. Digit
Byte_6 = 2. Datenbyte für 3. Digit (ungenutzt !)
Byte_7 = 1. Datenbyte für 4. Digit
Byte_8 = 2. Datenbyte für 4. Digit (ungenutzt !)
Byte_9 = 1. Datenbyte für 5. Digit
Byte_10 = 2. Datenbyte für 5. Digit (ungenutzt !)

Grüße,
Cassio
 
Hm..... ich bin jetzt wieder der Meinung, dass es so etwas "unglücklich" ausgedrückt ist. :hmmmm:

Cassio, da stimme ich dir zu. Der Index ist nicht ganz klar definiert, je nachdem von was man ausgeht

a) von der I2C Übertragung
oder
b) von der Adresse der 16 Datenbytes im Displaycontroller



Aber jetzt funktioniert es ja :tee:

Der nächste Schritt wäre, eine 16bit Dezimalzahl ausgeben ;)

Dirk :ciao:
 
Der nächste Schritt wäre, eine 16bit Dezimalzahl ausgeben

Dies wird dann bald das nächste sein was ich in angriff nehmen werde :D
Doch erst einmal ein bisschen mit dem Display und dem Bus spielen um alles besser zu verstehen:rolleyes:
 
nochmal eine Korrektur was die Bytereihenfolge des Sendens betrifft
ich musste nämlich feststellen das wenn ich die Zahlen so Sende wie im Programm beschrieben
die 1er Stelle immer = der Tausender Stelle ist

habe es jetzt mit der Sendereihenfolge funktionierend, sodass ich jede Stelle der Anzeige einzeln ändern kann.

Byte0***Startadresse
Byte1***1000er
Byte2***nicht genutzt
Byte3***100er
Byte4***nicht genutzt
Byte5***Doppelpunkt
Byte6***nicht genutzt
Byte7***10er
Byte8***nicht genutzt
Byte9***nicht genutzt
Byte10**1er



EDIT by Cassio
Fehlerhafter Einstellung :wink:
 
mein letzter beitrag kann gelöscht werden der war natürlich murks
hatte noch einen fehlerim programm:hmpf:

Die Beschreibung von Dirk ist korrekt
 
mein letzter beitrag kann gelöscht werden

Hallo!

Ich habe den Beitrag mal etwas "unkenntlicher" gemacht,
damit kein anderer Leser beim Überfliegen die Einstellungen übernimmt. :cool:


Grüße,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)