PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 7Segmentanzeige auslösen durch zwei Tasten in bestimmter Zeitfolge / Attiny 24



Joschi1711
19.02.2012, 21:45
Hallo Leute,
Ich habe unten stehenden Code zur Verfügung, der bisher mit einem LDR ausgelöst wurde , und möchte nun, das die Segmentanzeige startet, wenn innerhalb von 5min zwei Tasten nacheinander betätigt werden. Nach Ablauf dieser Zeit muss die erste Taste erneut betätigt werden. Sprich mit Taste 1 startet die ganze Sache und Taste 2 löst dann die Segmentanzeige aus.
Leider komme ich hier nicht ganz zurecht und hoffe unter euch jemanden zu finden, der mir da etwas helfen kann.
Bisher bekam ich immer nur als Antwort, lernen und suchen und lesen, dazu fehlt mir momentan leider etwas die Zeit ^^.



$hwstack = 20 'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
$regfile = "ATtiny24.DAT"
$crystal = 128000 'Frequenz des internen Oszillators




Config Adc = Single , Prescaler = Auto
Config Portb = &B00000111 'Pinb.0-3 auf 'Ausgang', Rest auf 'Eingang' schalten
Config Porta = &B10001011 'Pina.0+1+3+7 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0 'Ausgänge auf Low setzen
Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen

Wdtcr = &B11010011 'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset
Enable Interrupts 'Interrupts freigeben


Anzeige:
Restore Daten 'Am Beginn der Daten anfangen
Alt = 1023 'Doppelauslösung verhindern
Do
Read Zeichen
Wdtcr = &B11010111 'Watchdog auf 2s stellen
If Zeichen = "0" Then Gosub P0 'schreibt 0 ins Display
If Zeichen = "1" Then Gosub P1 'schreibt 1 ins Display
If Zeichen = "2" Then Gosub P2 'schreibt 2 ins Display
If Zeichen = "3" Then Gosub P3 'schreibt 3 ins Display
If Zeichen = "4" Then Gosub P4 'schreibt 4 ins Display
If Zeichen = "5" Then Gosub P5 'schreibt 5 ins Display
If Zeichen = "6" Then Gosub P6 'schreibt 6 ins Display
If Zeichen = "7" Then Gosub P7 'schreibt 7 ins Display
If Zeichen = "8" Then Gosub P8 'schreibt 8 ins Display
If Zeichen = "9" Then Gosub P9 'schreibt 9 ins Display
If Zeichen = "n" Then Gosub Pn 'schreibt n ins Display
If Zeichen = "e" Then Gosub Pe 'schreibt E ins Display
If Zeichen = "re" Then Gosub Rechts 'Lauflicht rechts herum
If Zeichen = "li" Then Gosub Links 'Lauflicht links herum
If Zeichen = " " Then Gosub Leer 'leerzeichen-keine Anzeige
If Zeichen = "ost" Then Gosub East 'schreibt OSt ins Display
If Zeichen = "nord" Then Gosub North 'schreibt nord ins Display
If Zeichen = "p" Then Gosub Pp 'Pause zwischen Zeichen'
Wdtcr = &B11010011 'Watchdog wieder auf 125ms stellen
If Zeichen = "X" Then Return
Loop

Pp:
Waitms 500
Return

P0:
Portb = &B00000111
Porta = &B10000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P1:
Portb = &B00000110
Reset Watchdog
Powerdown
Portb = 0
Return

P2:
Portb = &B00000011
Porta = &B10001010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P3:
Portb = &B00000111
Porta = &B00001010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P4:
Portb = &B00000110
Porta = &B00001001
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P5:
Portb = &B00000101
Porta = &B00001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P6:
Portb = &B00000101
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P7:
Portb = &B00000111
Reset Watchdog
Powerdown
Portb = 0
Return

P8:
Portb = &B00000111
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P9:
Portb = &B00000111
Porta = &B00001001
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Pn:
Portb = &B00000100
Porta = &B10001000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Pe:
Portb = &B00000001
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Rechts:
Wdtcr = &B11010100
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0
Porta = &B00000010
Reset Watchdog
Powerdown
Porta = 0
Porta = &B10000000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Portb = 0
Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0
Porta = &B00000010
Reset Watchdog
Powerdown
Porta = 0
Porta = &B10000000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Portb = 0
Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0
Porta = &B00000010
Reset Watchdog
Powerdown
Porta = 0
Porta = &B10000000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Links:
Wdtcr = &B11010100
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0
Porta = &B10000000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00000010
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

East:
Wdtcr = &B11010101
Portb = &B00000111
Porta = &B10000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Portb = &B00000101
Porta = &B00001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Porta = &B10001011
Reset Watchdog
Powerdown
Porta = 0
Return

North:
Wdtcr = &B11010101
Portb = &B00000100
Porta = &B10001000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Portb = &B00000100
Porta = &B10001010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Porta = &B10001000
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00000110
Porta = &B10001010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Leer:
Reset Watchdog
Powerdown

Return

End

Daten:
' Data "nord"
Data "re"
Data "n" , "5" , "1" , " " , "0" , "1" , " " , "1" , "2" , "5"
Data " "
' Data "ost"
Data "e" , "0" , "1" , "3" , " " , "3" , "9" , " " , "7" , "3" , "0"
Data "re"
Data "X"


Anbei habe ich den Schaltplan, wie es mir so vorschwebt.

Danke für eventuelle Tips.

Gruß aus Freital

Jörg

Sauerbruch
19.02.2012, 23:26
Hallo Jörg,

so ganz kann ich mir noch nicht vorstellen, was die Schaltung eigentlich tun soll.

Was meinst Du damit, dass "die Segmentanzeige startet"? Soll sie angehen, und wenn ja, was soll sie anzeigen?
Was meinst Du damit, dass "Taster 1 die ganze Sache startet"? Und dass "Taster 2 die Segmentanzeige auslöst"???

Versuch doch mal etwas genauer zu beschreiben, was eigentlich genau (!!) passieren soll :-)

Und was mindestens genauso wichtig ist: Welches Problem tritt denn exakt (!!) auf? Dass Du "nicht ganz zurechtkommst" ist zwar betrüblich, aber um den Fehler zu finden müsste man schon sehr viel genauer wissen, was tatsächlich passiert!

Optimistische Grüße,


Daniel

Joschi1711
20.02.2012, 07:11
Hallo ,
Also ganz von vorn.
Stellen wir uns ein Labyrinth vor, es gibt einen Startpunkt und ein Ziel. An diesen beiden Punkten soll je ein Schalter sein.
Wird in einer festgelegten Zeit Schalter1 am Start und Schalter2 am Ziel betätigt, sollen mit der 7Segmentanzeige Koordinaten ausgegeben werden.

Hubert.G
20.02.2012, 10:44
So wie ich das sehe hast du zwar PortB4 und 5 auf Eingang geschaltet, für die Taster aber keinen PullUp aktiviert.
Ich sehe auch nicht wo du die Tasten abfragst. Ein bisschen Kommentar im Programm wäre nicht schlecht, da müsst man sich nicht alles zusammen klauben.

Sauerbruch
20.02.2012, 12:37
Mal abgesehen von den anderen guten Hinweisen (PullUp-Widerstände und so...) würde ich das in etwa so lösen:

Du konfigurierst zwei Interrupts, die mit je einem der Taster ausglöst werden. Im ersten startest Du Timer0, der bei 128 kHz Taktfrequenz und einem Prescaler von 1024 alle 0,48 s überläuft, d.h. in 5 Minuten 614 mal. In jedem Timer0-Überlauf-Interrupt lässt Du eine Word-Variable um 1 hochzählen.
Im anderen Interrupt setzt Du ein Tasten-"Flag".
In der Hauptschleife Checkst Du einerseits das Tasten-Flag, und wenn es 1 wird, lässt Du die Anzeige das anzeigen, was auch immer sie anzeigen soll (auch darüber wissen wir ja noch recht wenig). Andererseits prüfst Du, ob die Hochzähl-Variable den Wert von 614 überschreitet, ohne dass das Tasten-Flag gesetzt ist, d.h. der zweite Tastendruck NICHT 5 Minuten nach dem ersten Tastendruck erfolgte. Was dann geschehen soll, blieb ja auch noch etwas unklar...

Ich hoffe, dass Dich diese Denkanstöße etwas weiterbringen - und im Zweifelsfall führen viele Wege zum Ziel :-)

Joschi1711
20.02.2012, 14:51
Ich habe jetzt erstmal auf einfache Art die Sache soweit hinbekommen, das nach Betätigung des ersten Tasters und anschliesend des zweiten in der Segmentanzeige Koordinaten angezeigt werden.
Muss aber auch dazu sagen, das ich da ein absolut unwissender Anfänger bin ^^.

werde mal weiter probieren und mich zu Sauerbruch´s Denkanstoß weiter durchwurschteln.

hier nochmal der funktionierende Code ohne die 5 min Zeit.

Sinn des ganzen ist, ein Minnilabyrinth mit einer Stahlkugel, am Start betätigt diese den ersten Schalter und am Ziel den zweiten.
Schafft man das ganze in 5min, so soll die Segmentanzeige die Koordinaten anzeigen.
Das ganze muss dann noch mit der üblichen Energiesparfunktion versehen werden.


$hwstack = 20 'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
$regfile = "ATtiny24.DAT"
$crystal = 128000 'Frequenz des internen Oszillators

Dim A As Byte
Dim Alt As Integer
Dim Zeichen As String * 1

Config Adc = Single , Prescaler = Auto
Config Portb = &B00000111 'Pinb.0-3 auf 'Ausgang', Rest auf 'Eingang' schalten
Config Porta = &B10001011 'Pina.0+1+3+7 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0 'Ausgänge auf Low setzen



Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen

Wdtcr = &B11010011 'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset
Enable Interrupts 'Interrupts freigeben


Config Pina.4 = Input
Config Porta.4 = 1 'Pin 9 (A4) auf Eingang schalten
'Pullup aktivieren
Do
If Pina.4 = 1 Then Gosub Abfrage2 'Pin 9 (A4) Abfragen, bei Kontakt zu Abfrage2 springen
Loop


Abfrage2:
Config Pina.5 = Input 'Pin 8 (A5) auf Eingang schalten
Config Porta.5 = 1 'Pullup aktivieren

Do
If Pina.5 = 1 Then Gosub Anzeige 'Pin8 (A5) abfragen , bei Kontakt zu Anzeige springen und Koordinaten anzeigen
Loop
Return


Anzeige:
Restore Daten 'Am Beginn der Daten anfangen
Alt = 1023 'Doppelauslösung verhindern
Do
Read Zeichen
Wdtcr = &B11010111 'Watchdog auf 2s stellen
If Zeichen = "0" Then Gosub P0 'schreibt 0 ins Display
If Zeichen = "1" Then Gosub P1 'schreibt 1 ins Display
If Zeichen = "2" Then Gosub P2 'schreibt 2 ins Display
If Zeichen = "3" Then Gosub P3 'schreibt 3 ins Display
If Zeichen = "4" Then Gosub P4 'schreibt 4 ins Display
If Zeichen = "5" Then Gosub P5 'schreibt 5 ins Display
If Zeichen = "6" Then Gosub P6 'schreibt 6 ins Display
If Zeichen = "7" Then Gosub P7 'schreibt 7 ins Display
If Zeichen = "8" Then Gosub P8 'schreibt 8 ins Display
If Zeichen = "9" Then Gosub P9 'schreibt 9 ins Display
If Zeichen = "n" Then Gosub Pn 'schreibt n ins Display
If Zeichen = "e" Then Gosub Pe 'schreibt E ins Display
If Zeichen = "re" Then Gosub Rechts 'Lauflicht rechts herum
If Zeichen = "li" Then Gosub Links 'Lauflicht links herum
If Zeichen = " " Then Gosub Leer 'leerzeichen-keine Anzeige
If Zeichen = "ost" Then Gosub East 'schreibt OSt ins Display
If Zeichen = "nord" Then Gosub North 'schreibt nord ins Display
If Zeichen = "p" Then Gosub Pp 'Pause zwischen Zeichen'
Wdtcr = &B11010011 'Watchdog wieder auf 125ms stellen
If Zeichen = "X" Then Return
Loop

Pp:
Waitms 500
Return

P0:
Portb = &B00000111
Porta = &B10000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P1:
Portb = &B00000110
Reset Watchdog
Powerdown
Portb = 0
Return

P2:
Portb = &B00000011
Porta = &B10001010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P3:
Portb = &B00000111
Porta = &B00001010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P4:
Portb = &B00000110
Porta = &B00001001
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P5:
Portb = &B00000101
Porta = &B00001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P6:
Portb = &B00000101
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P7:
Portb = &B00000111
Reset Watchdog
Powerdown
Portb = 0
Return

P8:
Portb = &B00000111
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

P9:
Portb = &B00000111
Porta = &B00001001
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Pn:
Portb = &B00000100
Porta = &B10001000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Pe:
Portb = &B00000001
Porta = &B10001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Rechts:
Wdtcr = &B11010100
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0
Porta = &B00000010
Reset Watchdog
Powerdown
Porta = 0
Porta = &B10000000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Portb = 0
Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0
Porta = &B00000010
Reset Watchdog
Powerdown
Porta = 0
Porta = &B10000000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Portb = 0
Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0
Porta = &B00000010
Reset Watchdog
Powerdown
Porta = 0
Porta = &B10000000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Links:
Wdtcr = &B11010100
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Porta = &B00000001
Reset Watchdog
Powerdown
Porta = 0
Porta = &B10000000
Reset Watchdog
Powerdown
Porta = 0
Porta = &B00000010
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00000100
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

East:
Wdtcr = &B11010101
Portb = &B00000111
Porta = &B10000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Portb = &B00000101
Porta = &B00001011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Porta = &B10001011
Reset Watchdog
Powerdown
Porta = 0
Return

North:
Wdtcr = &B11010101
Portb = &B00000100
Porta = &B10001000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Portb = &B00000100
Porta = &B10001010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Porta = &B10001000
Reset Watchdog
Powerdown
Porta = 0
Portb = &B00000110
Porta = &B10001010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return

Leer:
Reset Watchdog
Powerdown

Return

End

Daten:
' Data "nord"
Data "re"
Data "n" , "5" , "1" , " " , "0" , "1" , " " , "1" , "2" , "5"
Data " "
' Data "ost"
Data "e" , "0" , "1" , "3" , " " , "3" , "9" , " " , "7" , "3" , "0"
Data "re"
Data "X"

Ich hoffen mal mich nicht all zu doof anzustellen. ^^