PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Countdown mit 7 Segment Anzeige



DaveWagner
07.11.2008, 17:57
Hallo

Ich möchte ein Programm für eine Countdown haben, der von 10 bis 0 runterzählt.
Der Countdown soll durch einen Taster gestartet werden können.
Ein anderer Taster soll den Countdown unterbrechen und gleichzeitig zwei Striche als Zeichen für Pause anzeigen ( also so ungefähr I I ).Wenn man den Taster loslässt läuft das Hauptprogramm also der Countdown weiter.
Ich hab selbst ein paar mal versucht so ein Programm hinzubekommen , aber bei mir ist das Problem , dass der Countdown ohne , dass ich den Taster drücke los geht.Die Unterbrechung durch den anderen Taster geht auch nicht.
Die Anzeige der Zahlen funktioniert schon.

Wäre sehr dankbar , wenn sich jemand mal das Programm ansieht.
Den ersten Taster habe ich mit einer IF-Funktion ermöglicht den anderen mit dem Timer und einem Unterprogramm.

Mfg

David

s.o.
07.11.2008, 18:26
das richt kräftig nach nicht entprellten tastern. Sind die Entprellt?

Schau mal hier:
http://www.mikrocontroller.net/articles/Entprellung

DaveWagner
07.11.2008, 18:51
Hallo

Danke für die schnelle Antwort.
Als die Taster muss ich noch entprellen, da hast du recht.
Nur, dass erklärt nicht warum der Countdown ohne Einwirkung des Tasters von alleine losgeht.
Ich glaube es ist irgendein Fehler im Programm , ich komm nur nicht drauf.

Mfg

David Wagner

Michael
07.11.2008, 19:07
Hallo DaveWagner,


Als die Taster muss ich noch entprellen,
das brauchst du in dem Fall nicht, nach einem Tastendruck kommt ja außer ein paar Portänderungen und Pausen nichts bis zum Ende. Mehrfaches Drücken zeigt somit keinen Effekt und muß also nicht abgefangen werden.


dass erklärt nicht warum der Countdown ohne Einwirkung des Tasters von alleine losgeht
Der Tasterpin ist auf Input geschaltet und vermutlich ohne Pull-Down Widerstand. Das elektromagnetische Wechselfeld deiner Umgebung streut (meist über die Finger in der Nähe) in den Eingang ein. Da dieser recht empfindlich ist, reicht es zum Schalten.

Gruß, Michael

DaveWagner
07.11.2008, 19:49
Hallo

Hab die Pull-Down Widerstände eingebaut es ging wunderbar.
Nochmal Danke Michael

Leider ist noch ein Problem dazugekommen und zwar sind jetzt an den Ausgänge die bei der Zahl 0 , 5V ausgeben sollten , schon während des Countdowns 1,9 V .
Da ich an den Ausgängen FETs anhängen möchte darf keine Spannung schon während des Countdowns anliegen.

Was könnten mögliche Ursachen für das Problem sein ?

MfG

David

Michael
07.11.2008, 21:08
Hallo DaveWagner,

leider ist dein Quelltext unkommentiert, ich kann nicht wissen, wo die Zahl 0 ausgegeben wird. Vielleicht kannst du mehr zu dem Projekt erzählen oder zumindest die problematischen Ports benennen.

Bedenke, daß an PortB das Programmierinterface hängt. Es kann dadurch schon zu Beeinträchtigungen kommen, wenn es während des Betriebs dran bleibt.

Gruß, Michael

Blue72
07.11.2008, 21:18
Hmm ... also ich finde Dein Programm sehr unübersichtlich ...


$regfile = "m8def.dat"

$crystal = 1000000

Config Pind.0 = Output
Config Pind.1 = Output
Config Pinc.1 = Output
Config Pind.3 = Output
Config Pind.4 = Output
Config Pind.5 = Output
Config Pinc.2 = Output
Config Pind.7 = Output
Config Pinc.3 = Output
Config Pinb.1 = Input
Config Pinb.4 = Input
Config Pinb.2 = Output

Config Pinb.5 = Output



Config Int0 = Rising
Enable Interrupts 'einschalten der Interrupts
Enable Int0
On Int0 Unterprogramm





If Pinb.4 = 1 Then

Portb.5 = 0
Portb.3 = 0
Portc.3 = 0
Portd.0 = 1
Portd.1 = 1
Portc.1 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portc.2 = 1
Portd.7 = 1
Portb.2 = 1
Waitms 250
Portb.2 = 0

Waitms 750

Portd.0 = 0
Portd.1 = 0
Portb.3 = 0
Portc.1 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portc.2 = 0
Portb.2 = 1
Portd.7 = 1
Portc.3 = 1

Waitms 250
Portb.2 = 0

Waitms 750

Portb.3 = 0
Portc.1 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portc.2 = 1
Portd.7 = 1
Portc.3 = 1
Portb.2 = 1
Waitms 250
Portb.2 = 0

Waitms 750
Portb.3 = 0
Portc.1 = 1
Portd.3 = 1
Portd.4 = 1
Portc.3 = 0
Portb.2 = 1
Portc.2 = 0
Portd.7 = 0
Portd.5 = 0

Waitms 250
Portb.2 = 0

Waitms 750

Portc.1 = 1
Portd.4 = 1
Portd.5 = 1
Portc.2 = 1
Portd.7 = 1
Portc.3 = 1
Portb.2 = 1
Portd.3 = 0

Waitms 250
Portb.2 = 0

Waitms 750
Portb.3 = 0
Portc.1 = 1
Portd.4 = 1
Portd.5 = 1
Portd.7 = 1
Portc.3 = 1
Portb.2 = 1
Portc.2 = 0
Waitms 250
Portb.2 = 0

Waitms 750

Portd.3 = 1
Portc.2 = 0
Portd.4 = 1
Portd.7 = 1
Portc.3 = 1
Portb.2 = 1
Portc.1 = 0
Portd.5 = 0
Waitms 250
Portb.2 = 0

Waitms 750
Portc.2 = 0
Portc.1 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portc.3 = 1
Portb.2 = 1
Portd.7 = 0
Waitms 250
Portb.2 = 0

Waitms 750


Portc.1 = 1
Portd.3 = 1
Portc.3 = 1
Portc.2 = 1
Portd.5 = 1
Portb.2 = 1
Portd.4 = 0
Waitms 250
Portb.2 = 0

Waitms 750

Portd.3 = 1
Portd.4 = 1
Portc.1 = 0
Portd.5 = 0
Portc.2 = 0
Portd.7 = 0
Portc.3 = 0
Portb.2 = 1
Waitms 250
Portb.2 = 0


Waitms 750

Portc.3 = 0
Portc.1 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portc.2 = 1
Portd.7 = 1
Portb.2 = 1
Waitms 250
Portb.2 = 0

Portb.3 = 1
Portb.5 = 1



End If

'

Unterprogramm:
Portd.3 = 1
Portd.4 = 1
Portd.7 = 1
Portd.6 = 1


Return


Ich denke Dein Problem kommt direkt vom ISP Anschluss Deines Proggers.

Edit: Naja, ich muss schneller werden, Michael hat es schon geschrieben ;)
P.s.: Konntest Du Deine Segment Anzeigen nicht auf einen kompletten Port legen ? Du könntest diese dann mit:



7seg0 alias PORTC
7seg0 = &B01111111 ' alle Segmente an bei Common Cathode
7seg0 = &B00111111 ' nur "0" anzeigen


Nur mal so als idee ...

Gruß
Jens

DaveWagner
09.11.2008, 15:26
Hallo

Ja wär besser so
Jedoch funktioniert es jetzt und ich möchte nichts mehr ändern.

Mfg

David