mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 7-Segment an tiny2313


Autor: Henk van Wegen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
#include <avr/iotn2313.h>
#include <util/delay.h>

#define F_CPU 4000000UL //int. osc.

//a - f an Port D0...D6
//Gemeinsame Anode an B.0
//defines fuer die 7-segment bitmuster

#define null 0b1000000
#define eins 0b1111001
#define zwei 0b0100100
#define drei 0b0110000
#define vier 0b0011001
#define fuen 0b0010010
#define sech 0b0000010
#define sieb 0b1111000
#define acht 0b0000000
#define neun 0b0010000




int main (void){
DDRD=0xFF;   // D output 
DDRB=0xFF;   // B output
PORTB=0x01;  // schaltet ANODE über PNP high
while(1){
  PIND=zwei;     // bitmuster für Ziffer 2 -> OKAY
  _delay_ms(80);
  PIND=sieb;      // bitmuster für ziffer 7 -> XXX
  _delay_ms(80);
  }
}




Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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
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...

Autor: Henk van Wegen (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Henk van Wegen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.