Forum: Mikrocontroller und Digitale Elektronik 7-Segment an tiny2313


von Henk van Wegen (Gast)


Lesenswert?

Tag, Leute!

Bin mal wieder kurz vorm verzweifeln...
Habe ein 7segment (gem. Anode) an einem 2313 laufen. Kathoden a...f mit 
Rv an D0...D6 und Anode über PNP an B0. Sich eine Ziffer anzeigen lassen 
funktioniert wunderbar. Wenn ich allerdings eine Ziffernfolge mit Pausen 
dazwischen (siehe src) sehen will, geraten die Zeichen plötzlich 
"durcheinander". Nochmal anders: Wenn ich ein Programm flashe, dass mir 
nur ein Zeichen ausgeben soll und dann while(1)t, funktionert das 
wunderbar. Sobald aber ein zweites Zeichen folgen soll, ist das 2te 
nicht richtig dargestellt.
Für Anregungen bin ich immer dankbar  : )

Henk
1
#include <avr/io.h>
2
#include <avr/iotn2313.h>
3
#include <util/delay.h>
4
5
#define F_CPU 4000000UL //int. osc.
6
7
//a - f an Port D0...D6
8
//Gemeinsame Anode an B.0
9
//defines fuer die 7-segment bitmuster
10
11
#define null 0b1000000
12
#define eins 0b1111001
13
#define zwei 0b0100100
14
#define drei 0b0110000
15
#define vier 0b0011001
16
#define fuen 0b0010010
17
#define sech 0b0000010
18
#define sieb 0b1111000
19
#define acht 0b0000000
20
#define neun 0b0010000
21
22
23
24
25
int main (void){
26
DDRD=0xFF;   // D output 
27
DDRB=0xFF;   // B output
28
PORTB=0x01;  // schaltet ANODE über PNP high
29
while(1){
30
  PIND=zwei;     // bitmuster für Ziffer 2 -> OKAY
31
  _delay_ms(80);
32
  PIND=sieb;      // bitmuster für ziffer 7 -> XXX
33
  _delay_ms(80);
34
  }
35
}

von Johannes M. (johnny-m)


Lesenswert?

_delay_ms(80) geht mit 4 MHz nicht. Maximal 262,14 ms/4 = 65,535 ms

Ach ja, wie wäre es denn mit
1
PORTD = zwei; //usw...

Ein Schreibzugriff auf das PINx-Register macht ein EXOR der Pinzustände 
mit dem ausgegebenen Wert (Pin toggle). Um beim obigen Beispiel zu 
bleiben:

    zwei 0b0100100
XOR sieb 0b1111000
------------------
         0b1011100
Und das macht vermutlich wenig Sinn...

von Henk van Wegen (Gast)


Lesenswert?

Die 80 waren jetzt ausm ärmel geschüttelt... Aber mit 40 ändert sich 
auch nichts am resultat.

von Matthias (Gast)


Lesenswert?

...  PIND=zwei; ..

Wie wäre es denn mit PORTD = zwei; ??

Vielleicht solltest du die Zeit etwas erhöhen, so auf delay_ms(500) zum 
Beispiel.
Es wird so sein, dass du die sechsmal zwei und sechsmal sieben die PRO 
SEKUNDE angezeigt werden nicht so ganz erkennen wirst. Vielmehr wirst du 
den Misch aus beiden sehen...


...PORTB=0x01;  // schaltet ANODE über PNP high..

Sieht nach Kollektorschaltung aus ;-)

von Henk van Wegen (Gast)


Lesenswert?

> ...  PIND=zwei; ..

> Wie wäre es denn mit PORTD = zwei; ??


schäm

Natürlitsch. Die dümmsten Bolzen sieht man selbst nicht : )
Funktioniert bestens, danke.

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.