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
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
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...
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
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.
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
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
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
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 :-))...
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 | }
|
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.