Forum: Mikrocontroller und Digitale Elektronik LTM-8522HR Beschaltung


von a. l. (artur78)


Lesenswert?

Hallo,

Zur 7-Segment Anzeige im Betreff hier im Forum absolut kein Ergebnis 
gefunden.

Ich habe es nicht einmal zum Aufleuchten gebracht.
Wie folgt beschaltet:
Pin1    GND (unter dem Segment D, Digit1)
Pin2/3  3.2V
Pin17   5V
Pin18   3.2V (überdem Segment A, Digit1)

Jetzt müsste das Teil doch schon leuchten.
Tut es aber nicht.

Ich bin ratlos. Hab ein zweites angeschlossen: das gleiche.

Habt Ihr was?

Gruß Artur

von a. l. (artur78)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin immer noch am Pfuschen...

Ich habe nun eine Praktikumsaufgabe der Uni Magdeburg gefunden.
http://eos.cs.ovgu.de/wp-content/uploads/2013/10/prak-Aufgabe-0.pdf
Die beschalten auch Brightness Control (Pin18) mit 5V.
Gut, habe ich auch probiert - nichts.
Erst als ich VLED (Pin2/3) auf >3.5V erhöht habe, ging die Anzeige an.
Mit BR. CONTROL lässt sie sich aber dennoch nicht dimmen.

Ich habe auch mal ein Code Beispiel aus der praktikumsaufgabe an meinen 
ATtiny861 abgeändert - uns es funktioniert auch nicht.
Ich habe mal den Originalcode angehängt und mein abgeändertes (von den 
UART Funktionen befreit, Ports angepasst) Programm eingefügt.

Warum wird in der while(1) beim Aufruf von writetoDisplay() das Argument 
mit 1 geXORt?
Es sollte "EOS" angezeigt werden, bei mir leuchten aber ALLE Segmente.
1
#include   <avr/io.h>    
2
#include    <avr/interrupt.h>  
3
#include    <inttypes.h>
4
#include   <util/delay.h>
5
6
//PORTB
7
#define BLINKER         5  //PB5
8
#define BLINKER_PORT    PORTB
9
10
// Ausgabe 
11
#define AUSGABE_PORT    PORTB       
12
#define AUSGABE_DDR     DDRB
13
14
//#define F_CLOCK  8000000        
15
#define BIT(x)  (1<<x)
16
17
  // Serial bus lines
18
#define LED_DATA        BIT(2)
19
#define LED_CLOCK       BIT(1)
20
#define LED_STROBE      BIT(0)
21
22
23
volatile uint16_t j = 0;
24
25
26
int main (void)
27
{
28
29
  TCCR1B  = (1<<CS12) | (1<<CS11);            //Prescaler 1/32
30
31
  TIMSK  = (1<<TOIE1);           //Interrupt bei Overflow von Timer 1 
32
33
  AUSGABE_DDR   = 0b11111111;                      // alles Ausgang
34
35
  char disp [] = {0b10011111,0b11111101,0b10110111};
36
37
  writetoDisplay(disp[0], disp[1], disp[2]);
38
39
  sei();                        //Interrupts an
40
41
  //Hauptschleife
42
  while(1) 
43
  { 
44
    writetoDisplay(disp[0]^=1, disp[1]^=1, disp[2]^=1);
45
  } //while(1)
46
47
}//main()
48
49
void writetoDisplay(char digit1, char digit2, char digit3){
50
51
  char stream[36];
52
  stream[0]=1;
53
  int i;
54
  for ( i=1; i<36; i++ ) {
55
    stream[i]=0;
56
  }
57
  
58
  for ( i=0; i<8; i++ ) {
59
    if (digit1 & (1<<(7-i))) stream[i+ 1]=1;
60
    if (digit2 & (1<<(7-i))) stream[i+9]=1;
61
    if (digit3 & (1<<(7-i))) stream[i+17]=1;
62
  }
63
64
  for ( i=0; i<36; i++ ) {
65
    // clock low
66
    AUSGABE_PORT &= ~(1<<LED_CLOCK);
67
    // data enable low
68
    AUSGABE_PORT &= ~(1<<LED_STROBE);
69
    _delay_us (100);
70
    // data
71
    if (stream[i]==1)
72
      AUSGABE_PORT |= (1<<LED_DATA);
73
    else
74
      AUSGABE_PORT &=~(1<<LED_DATA);
75
    _delay_us (100);
76
    // clock high - Transmission finished
77
    AUSGABE_PORT |= (1<<LED_CLOCK);
78
    _delay_us (100);
79
    // data enable high - ready for next cycle
80
    AUSGABE_PORT |= (1<<LED_STROBE);
81
  }
82
}
83
84
ISR(TIMER1_OVF_vect)  //alle ca. 8ms
85
{
86
  j++;
87
88
  if(j == 80)  //bei 80*8ms=640ms und Prescaler=1/32 --> 0.64sec
89
  {
90
    BLINKER_PORT ^= (1<<BLINKER); 
91
    j = 0;
92
  }
93
}


Könntet Ihr bitte mal drübersehen warum es nicht funktionieren könnte 
und was ich bei der Beschaltung des LTM falsch mache?
http://www1.futureelectronics.com/doc/LITE-ON/LITE-ON%20LTM-8522HR.pdf

Vielen Dank
Artur

von Daniel R. (daro6)


Lesenswert?

Nicht in anderen Arbeiten schauen, guck doch einfach mal ins Datenblatt 
für die Spannungen und Anschlussbelegung...
In den Tabellen stehen die entsprechenden Spannungen und auf Seite 8 ist 
ein Anschlussdiagramm.
Dann fehlt nur noch die richtige ansteuerung, die auch komplett in dem 
Datenblatt beschrieben ist...

von a. l. (artur78)


Lesenswert?

Ich sehe an den Spannungen aus der Tabelle nichts verwirrendes und denke 
mal dass ich sie richtig rausgelesen habe:

Versorgungsspannung (Pin17) MAX. 12V
VLED (Pin2/3) 2.8V - 3.5V
VB, Brightness (Pin18) 3V - 4.3V
VSS (Pin1) auf GND

von Daniel R. (daro6)


Lesenswert?

a. l. schrieb:
> Ich sehe an den Spannungen aus der Tabelle nichts verwirrendes und
> denke
> mal dass ich sie richtig rausgelesen habe:
>
> Versorgungsspannung (Pin17) MAX. 12V
> VLED (Pin2/3) 2.8V - 3.5V
> VB, Brightness (Pin18) 3V - 4.3V
> VSS (Pin1) auf GND

Hast du auch den kondensator am poti?
Obwohl es daran wahrscheinlich nicht dran liegt...
Schreib erstmal ein Programm,bei dem alles leuchtet. Damit kannst du 
dann mit der Helligkeit rumspielen. Die Signale am besten mit einem oszi 
überprüfen und mit dem diagramm vergleichen.

von a. l. (artur78)


Lesenswert?

den 1nF am Pin 7?
Ich vermute mal, dass hier Pin 18 gemeint ist. Den habe ich auch mal 
angeschlossen, bringt nichts.

Das merkwüdige ist auch, dass die Anzeige sich mit der Zeit auch einfach 
so mal abschalten kann, obwohl auf Steckbrett aufgebaut, an den 
Kontakten kann es eigentlich nicht liegen.

Ich habe leider kein Oszi, und die Segmente leuchten auch alle mit dem 
geschriebenem Programm.

Edit:
Beim Aufruf von writetoDisplay() werden im Argument alle Bits 
invertiert, oder?
Das wird nicht das Problem sein, ich frage mich nur warum?

: Bearbeitet durch User
von Daniel (Gast)


Lesenswert?

a. l. schrieb:
> Edit:
> Beim Aufruf von writetoDisplay() werden im Argument alle Bits
> invertiert, oder?
> Das wird nicht das Problem sein, ich frage mich nur warum?

Nutze diese Funktion erstmal nicht.
Lege dir ein Array an, das fix und fertig ist für eine Beispiel 
Zahl(array[35] = {0,1,0,1,0,1....}
Dieses gibst du dann in der schleife aus.
Wenn das funktioniert, kannst du dir ja überlegen, wie du dir 
automatisch die Zahlen erzeugst.

PS.: Bist du dir sicher, dass du Data_enable jedesmal setzen und 
rücksetzen musst? Ich verstehe das so:
-Data_enbale= 0
-waitmin100ns
-Data=1
-waitmin300ns
-Clock=1
-waitmin300ns
-Clock=0
-waitmin300ns
Schleife 35mal:
    -Data=Array[i]
    -waitmin300ns
    -Clock=1
    -waitmin300ns
    -Clock=0
    -waitmin300ns
-Data_enbale= 1

von a. l. (artur78)


Lesenswert?

Hall Daniel,

ja, macht eigentlich keinen Sinn DATA ENABLE in der Schleife zu toggeln.

In FIGURE 3. wird bei Bit 36 das interne LOAD generiert. Laut Grafik 
wird nach dem Start-Bit bei Bit 1 angefangen zu zählen, somit wäre das 
Array 37 Bit lang!?

Ich werde mal das ARRAY wie vorgeschlagen fest einbauen und auch mal 37 
Bit lang machen.

Danke erstmal.

Edit:
DATA ENABLE kann man, wie ich verstehe, dauernd auf 1 lassen. LOAD wird 
intern automatisch durch einen Zähler gesteuert.

: Bearbeitet durch User
von Daniel (Gast)


Lesenswert?

Daniel schrieb:


Jep also so:
-Data_enbale= 0
-waitmin100ns
-Data=1
-waitmin300ns
-Clock=1
-waitmin300ns
-Clock=0
-waitmin300ns
Schleife 35mal:
    -Data=Array[i]
    -waitmin300ns
    -Clock=1
    -waitmin300ns
    -Clock=0
    -waitmin300ns
-Data=1
-waitmin300ns
-Clock=1
-waitmin300ns
-Clock=0
-waitmin300ns
-Data_enbale= 1

Ich würde das erste und letzte aber nicht mit ins array packen, da es ja 
immer gleich bleibt(also nur ein 35er Array :-))...

von a. l. (artur78)


Lesenswert?

Die Beschaltung scheint jetzt zu funktionieren.
VB wie im Datenblatt 3V-4.3V. Nur VLED muss auf 5V, damit die Anzeige 
angeht.

Mit den Änderungen im Programm funktioniert es aber trotzdem nicht.
Ich habe das Array mit 0 initialisiert und nur einige Stellen mit 1 um 
evtl. Unterschiede an den entsprechenden Digits zu sehen.
Wenn die drei Steuerleitungen offen in der Luft hängen leuchten die 
Segmente chaotisch durcheinander. Werden sie angeschlossen während µC 
läuft, friert der Zustand der Segmente auf zufälligem Wert ein. Nach 
einem Reset sind ALLE Segmente aus.

Mein aktuelles Programm:
1
#include   <avr/io.h>    
2
#include    <avr/interrupt.h>  
3
#include    <inttypes.h>
4
#include   <util/delay.h>
5
6
//PORTB
7
#define BLINKER         5  //PB5
8
#define BLINKER_PORT    PORTB
9
10
// Ausgabe 
11
#define AUSGABE_PORT    PORTB       
12
#define AUSGABE_DDR     DDRB
13
       
14
#define BIT(x)  (1<<x)
15
16
#define LED_DATA        BIT(2)
17
#define LED_CLOCK       BIT(1)
18
#define LED_STROBE      BIT(0)
19
20
#define N_Bits      35
21
volatile uint16_t j = 0;
22
23
int main (void) {
24
25
  TCCR1B  = (1<<CS12) | (1<<CS11);            //Prescaler 1/32
26
27
  TIMSK  = (1<<TOIE1);           //Interrupt bei Overflow von Timer 1 (Blinker)
28
29
  AUSGABE_DDR   = 0b11111111;                      // alles Ausgang
30
31
  sei();                        //Interrupts an
32
33
  while(1) { 
34
    writetoDisplay();
35
  } //while(1)
36
37
}//main()
38
39
void writetoDisplay(){
40
41
  char stream[N_Bits];
42
  int i;
43
  for ( i=0; i<N_Bits; i++ ) {
44
    stream[i]=0;
45
  }
46
  stream[0]=1;
47
  stream[1]=1;
48
  stream[2]=1;
49
  stream[9]=1;
50
  stream[10]=1;
51
  stream[11]=1;
52
  stream[33]=1;
53
  stream[34]=1;
54
55
  // data enable low, fuehrende 1 schreiben
56
  AUSGABE_PORT &= ~(1<<LED_STROBE);
57
  AUSGABE_PORT |= (1<<LED_DATA);
58
  AUSGABE_PORT |= (1<<LED_CLOCK);
59
  AUSGABE_PORT &= ~(1<<LED_CLOCK);
60
61
  for ( i=0; i<N_Bits; i++ ) {
62
    // data
63
    if (stream[i]==1)
64
      AUSGABE_PORT |= (1<<LED_DATA);
65
    else
66
      AUSGABE_PORT &=~(1<<LED_DATA);
67
    AUSGABE_PORT |= (1<<LED_CLOCK);
68
    AUSGABE_PORT &= ~(1<<LED_CLOCK);
69
  }
70
  // evtl Bit36 fuehr intern LOAD
71
//  AUSGABE_PORT |= (1<<LED_CLOCK);
72
//  AUSGABE_PORT &= ~(1<<LED_CLOCK);
73
  AUSGABE_PORT |= (1<<LED_STROBE);
74
}
75
76
ISR(TIMER1_OVF_vect)  //Taster, Blinker, Aktualisierung der Geschwindigkeit, ADC und Ausgabe --------- alle ca. 8ms
77
{
78
  j++;
79
80
  if(j == 40)  //bei 80*8ms=640ms und Prescaler=1/32 --> 0.64sec
81
  {
82
    BLINKER_PORT ^= (1<<BLINKER); 
83
    j = 0;
84
  }
85
}

von Daniel R. (daro6)


Lesenswert?

Wie kommst du denn jetzt dazu die Warteschleifen wegzulassen?
Letzter Versuch von mir:
1
#include   <avr/io.h>    
2
#include    <avr/interrupt.h>  
3
#include    <inttypes.h>
4
#include   <util/delay.h>
5
6
//PORTB
7
#define BLINKER         5  //PB5
8
#define BLINKER_PORT    PORTB
9
10
// Ausgabe 
11
#define AUSGABE_PORT    PORTB       
12
#define AUSGABE_DDR     DDRB
13
       
14
#define BIT(x)  (1<<x)
15
16
#define LED_DATA        BIT(2)
17
#define LED_CLOCK       BIT(1)
18
#define LED_STROBE      BIT(0)
19
20
#define N_Bits      37
21
volatile uint16_t j = 0;
22
23
int main (void) {
24
  TCCR1B  = (1<<CS12) | (1<<CS11);            //Prescaler 1/32
25
  TIMSK  = (1<<TOIE1);           //Interrupt bei Overflow von Timer 1 (Blinker)
26
  AUSGABE_DDR   = 0b11111111;                      // alles Ausgang
27
28
  sei();                        //Interrupts an
29
30
  while(1) { 
31
    writetoDisplay();
32
    while(1);
33
  
34
  } //while(1)
35
36
}//main()
37
38
void writetoDisplay(){
39
40
  char stream[N_Bits];
41
  int i;
42
  stream[0] = 1
43
  for ( i=1; i<N_Bits; i++ ) {
44
    stream[i]=0;
45
  }
46
47
  // data enable low, fuehrende 1 schreiben
48
  AUSGABE_PORT &= ~(1<<LED_STROBE);
49
  _delay_us(400);
50
  for ( i=0; i<N_Bits; i++ ) {
51
    // data
52
    if (stream[i]==1)
53
      AUSGABE_PORT |= (1<<LED_DATA);
54
    else
55
      AUSGABE_PORT &=~(1<<LED_DATA);
56
    _delay_us(300);
57
    AUSGABE_PORT |= (1<<LED_CLOCK);
58
    _delay_us(300);
59
    AUSGABE_PORT &= ~(1<<LED_CLOCK);
60
  }
61
  // evtl Bit36 fuehr intern LOAD
62
  //AUSGABE_PORT |= (1<<LED_CLOCK);
63
  //AUSGABE_PORT &= ~(1<<LED_CLOCK);
64
  _delay_us(400);
65
  AUSGABE_PORT |= (1<<LED_STROBE);
66
}
67
68
ISR(TIMER1_OVF_vect)  //Taster, Blinker, Aktualisierung der Geschwindigkeit, ADC und Ausgabe --------- alle ca. 8ms
69
{
70
  j++;
71
72
  if(j == 40)  //bei 80*8ms=640ms und Prescaler=1/32 --> 0.64sec
73
  {
74
    BLINKER_PORT ^= (1<<BLINKER); 
75
    j = 0;
76
  }
77
}
Wenn du das Programm ausführst sollte keine LED leuchten!!!
Anschließend einmal aus "stream[i]=0;" ein "stream[i]=1;" machen.
Dann sollten alle leuchten.

von artur78 (Gast)


Lesenswert?

moin ,

der MC läuft mit 1MHz, im Datenblatt des LTM sind die Wartezeiten um die 
400ns. Deswegen ohne delay. Ich habe es aber auch mit delay von 1ms 
versucht und das CLOCK  Signal mehrmals hintereinander ausgeführt.
stream auch mal mit 1 vorbelegt.
Ergebnis: alle anzeigen sind aus.

vielen Dank für die Hilfsbereitschaft

von m.n. (Gast)


Lesenswert?

Hallo Artur,

lass Vled bitte bei 3V. Der Wert ist recht niedrig, es soll aber wohl 
bezweckt werden, dass die interne Verlustleistung bei voller Helligkeit 
nicht zu groß wird.
Vled und VDD müssen direkt an den Anschlüssen mit Kondensatoren gegen 
Vss abgeblockt werden: jeweils 47µF+100nF für den Anfang. Andernfalls 
kann das gleichzeitige Einschalten mehrerer Segmente einen Störimpuls 
erzeugen und die Anzeige zurücksetzen.

Das 'enable'-Signal ist m.E. falsch gezeichnet; es müßte einen Kringel 
bekommen, da die Freigabe des Dateneingangs mit '0'-Pegel erfolgt. Die 
Bitzuordung im Datenblatt ist für meine Begriffe ungeschickt, aber 
scheint wohl zu stimmen, wenn es jemals damit funktioniert hat.

von a. l. (artur78)


Lesenswert?

Es funktioniert nach GENAU DEM main.c wie am Anfang im Beispiel der Uni 
Magdeburg reingestellt.

Seltsamerweise mit einem 36-Elemente-Array und nicht mit einem 37 "" wie 
man aus FIGURE 3. des Datenblatts vermuten würde.

Wie ich festgestellt habe waren wohl fast alle PORTs meines verwendeten 
Ausgangsregisters zertört.

Danke an alle Hinweise!

Artur

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.