PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : programm für 7 sekment-anzeige



Gary
02.08.2009, 16:25
hi leute,

ich habe eine 7 sekment anzeige (0-9 anzeige) an einen atmega8 angeschlossen. ich habe mir mit meinem anfängerwissen eine liste mit den befehlen für die darstellung der zahlen gemacht, allerdings ist die bestimmt ziemlich unkonventionell. bitte um hilfe^^


$regfile = "m8def.dat"
$framesize = 60
$swstack = 60
$hwstack = 60
$crystal = 8000000
$baud = 9600

Config Pind.7 = Input
Taster Alias Pind.7
Portd.7 = 1
Config Pind.6 = Input
Taster2 Alias Pind.6
Portd.6 = 1
Config Portc.5 = Output
Led1 Alias Portc.5
Config Portc.4 = Output
Led2 Alias Portc.4
Config Portc.3 = Output
Led7 Alias Portc.3
Config Portc.2 = Output
Led3 Alias Portc.2
Config Portc.1 = Output
Led4 Alias Portc.1
Config Portc.0 = Output
Led6 Alias Portc.0
Config Portb.1 = Output
Led5 Alias Portb.1


Dim Ziffer1 As Bit
Dim Ziffer2 As Bit
Dim Ziffer0 As Bit
Dim Angeschaltet As Bit
Dim Zaehler As Integer

Do

If Taster = 1 Then Angeschaltet = 1
If Taster = 0 And Angeschaltet = 1 Then
Angeschaltet = 0
Zaehler = Zaehler + 1
End If
Waitms 10

If Ziffer0 = 1 Then
Led1 = 1
Led2 = 1
Led3 = 1
Led4 = 1
Led5 = 1
Led6 = 1
Led7 = 0
Ziffer0 = 0
End If
If Ziffer1 = 1 Then
Led1 = 0
Led2 = 0
Led3 = 0
Led4 = 0
Led5 = 1
Led6 = 1
Led7 = 0
Ziffer1 = 0
End If
If Ziffer2 = 1 Then
Led1 = 1
Led2 = 0
Led3 = 1
Led4 = 1
Led5 = 0
Led6 = 1
Led7 = 1
Ziffer2 = 0
End If

If Zaehler = 0 Then
Ziffer0 = 1
Ledon = 0
End If
If Zaehler = 1 Then
Ziffer1 = 1
If Taster2 = 0 Then
Ziffer0 = 1
Ledon = 1
Waitms 125
Ziffer9 = 1
Waitms 125
Ziffer8 = 1
Waitms 125
Ziffer7 = 1
Waitms 125
Ziffer6 = 1
Waitms 125
Ziffer5 = 1
Waitms 125
Ziffer4 = 1
Waitms 125
Ziffer3 = 1
Waitms 125
Ziffer2 = 1
Waitms 125
Ziffer1 = 1
Waitms 125
Ziffer0 = 1
Waitms 750
Ledon = 0
End If
End If
If Zaehler = 2 Then Zaehler = 1
Loop

021aet04
02.08.2009, 16:57
Wenn es so funktioniert, passt es schon so. Besser wäre es, wenn du es in ein Array schreibst.

Gary
02.08.2009, 17:08
ne es get eben nicht^^
wen der zaehler1 = 1 ist, entstet eine befehlsschleife für ziffer 1 und die anzeige bleibt dauerhaft auf 1 stehen.


ach sorry wa das falsche programm xD habs mal editiert

021aet04
02.08.2009, 17:17
Was geht nicht. Zeigt er nichts an oder zeigt er das Falsche an. Hast du für das SSG Vorwiderstände drinnen? Hast du schon probiert einzelne Leds leuchten lassen?

Gary
02.08.2009, 18:37
das is der völlig falsche ansatz, denn die platiene ist schon seit 2 monaten in gebrauch. nein es liegt am programm. hast du dir das denn auch mal angegugt? wen der "zaehler=1" ist, und ich dann den timer mit dem "taster2" betätige bleibt der "zaehler" ja auf 1 stehen. also befindet sich "ziffer1" in einer dauerschleife. ich möchte halt einfach alle 7 sekmente mit einem befehl aktivieren/deaktivieren da das erstens weniger speicher verbraucht und wesentlich übersichtlicher ist.

021aet04
02.08.2009, 19:38
Es fehlt ein Endif im "Do" Block Nach den Dim Befehlen

Besserwessi
02.08.2009, 21:34
Ich habe selten ein so unübersichtliches Programm gesehen.

Das Programm kann etwas übersichtlicher und kürzer werden, wenn man das Zählen einzeln schritt für schritt macht, sondern mit einer Variable die von 1-9 zählt. Für die Ausgabe bietet sich select/case an, oder halt ein konstantes Array. Die Schleife wird dann bei jedem Zählschritt durchlaufen, und nicht nur einmal um von 0 bis 9 zu zählen.

Wenn man schon das ganze einfach so hintereinander Programmieren will, könnte man es auch fast ganz ohne variablen machen. Also einfach die Position im programm als "zählvariable". Wenn man später mehr damit machen will ist das aber nicht so flexibel. Für nur die Ausgabe wäre es ein gute Lösung.

Gary
03.08.2009, 11:33
ok ich versuchs mal mit nem array

danke

Gary
03.08.2009, 14:18
Für die Ausgabe bietet sich select/case an, oder halt ein konstantes Array.

fileicht sagst du mal 2-3 sätze zu den beiden alternativen, damit ich weis womit ich es zu tun habe.^^

bin noch ziemlich am anfang meiner basic lektionen und über arrays oder select/case hab ich noch garnichts gelehrnt.

Besserwessi
03.08.2009, 18:37
Für die umrechnung von einer normalen Ziffer (0...9) in die 7 Segmentdarstellung kann man ein konstantes array verwenden. Besonders einfach ist das, wenn die LEDs alle an einem Port hängen. Dann reicht so etwas wie:

segtab[0] = ....
segtab[1] = ....
....
Portb = segtab[n]
schon aus um die Zahl n auszugeben. Im array wird einfach wie ein erner tabelle nachgesehn was man ausgeben muß für die Zahl. Also so eine Art Zeichensatz. Wenn die LEDs wie hier nicht an einem Port sind, muß man die Bits noch etwas verteilen. Die meisten Bits kann man einfach mit einer Maske aussuchen. Die paar die übrig bleiben, dann z.B. per IF Then ELSE.


Die Alternative mit dem select case ist dann etwa so. Abhängig von der zahl die Ausgegben wird, wird einer der Fälle aufgerufen und da dann ausgegeben. Bis auf die Werte die Ausgegeben werden sehen die Fälle gleich aus. Auch damit kriegt man so etwas wie eine Funktion um eine ziffer auszugeben, die dann in einer schleife mehrmals aufgerufen wird.

Gary
03.08.2009, 19:41
wie können denn alle 7 sekmente an einem port hängen? also ich hab jez so ne led anzeige die aus 7 led sekmenten bestet^^

so n ding http://www.robotic.at/images/vgzs3_7segment_DJ700A.gif

Besserwessi
03.08.2009, 21:48
Mit einem Port sind die Pins gemeint, die über eine Register angesprochen werden. Also z.B. Portb.0 , Portb.1 ... Portb.7 . Das sind je nach Chip bis zu 8 Pins. Das paßt also genau für die 7 Segmente und den Dezimalpunkt.

Gary
03.08.2009, 22:48
Besonders einfach ist das, wenn die LEDs alle an einem Port hängen.

ja ich bin schon ein depp. du meinst natürlich wen jede LED an einem eigenen pin hängt. ich dachte du meinst ich sollte jez alle LEDs zusammen an einen pin hängen xD

ich habs falsch verstanden.

ne das mit den pins und ports weis ich, so weit bin ich schon^^

ok das sagt mir jetzt allerdings nicht so fiel
also ich hab gegooglet und mit den anleitungen kann ich irgentwie nichts anfangen.
also:

segtab[0] = ....
segtab[1] = ....
....
Portb = segtab[n]

pack ich hinter die "segtab[0] =" die LEDs die angesprochen werden sollen? wen ja, wie soll das aussehen? und in welche zeile kommt dann die array liste?
ich habe einfach keien vorstellung davon wie das aussehen muss.

Besserwessi
04.08.2009, 18:19
Wie schon vermutet kommt bei den zuweisungen der Array werte rein, welche LEDs an sein sollen. Da kommen also feste zahlen rein, abhängig davon wechles Segment an welchen Pin kommt. Also z.B. segtab[0] = 252. Am besten wird man hier wohl eine binäre schreibweise nehmen, wenn BASCOM das zuläßt.
So übersichtlich wie in C geht das in Bascom aber nicht, denn es ist ja nur ein + in der Zeile erlaubt.
Die Definietionen kommen irgendwo ganz an den Anfang, also z.B. hinter die Definitonen der Ein/Ausgänge.

Gary
05.08.2009, 16:34
ich folge genau deinen anweisungen aber irgentwas muss ich noch falsch machen.

wie würde das ohne binäre aussehen?
was sagen die zahlen denn aus, woraus bestehen sie? ist es die portbezeichnung?

am besten verstehe ich solche dinge wen ich sie einmal gesehen habe, fileicht kannst du mal ein kleines beispiel machen in dem du alle "..." und lehre stellen mit werten füllst, dann kann ich mir das mal im ganzen ansehen.

Besserwessi
05.08.2009, 19:04
Bei BASCOM sieht die binäre schreibweise z.B. so aus:
&B1100111

Je nach Art der Anzeige entspricht dann eine 1 einem LED Segment das an ist. Die erste Stelle entsprocht dabei dem Bit 7, abso z.B, Portb.7.

Sonst einfach man das Bscom Tutorial wenigsten grob durch lesen. Ein fertiges programm gibt es von mir nicht.

Gary
06.08.2009, 12:00
nene das programm will ich schon selber schreiben^^

in der schule wa das genau so, ich muste die aufgabe ersteinmal gesehen und verstanden haben bevor ich es selber probieren konnte, egal ob es mir der lehrer gezeigt hat oder es im buch stand.

nur is das problem das alle arrays die ich google, ganz weit weck von µC sind
und mir eigentlich garnichts sagen.

Besserwessi
06.08.2009, 18:43
Das Bascom basic hat auch nicht so viel mit normalem basic zu tun. Mit geht es oft auch so das Beispiele besser sind als eine sogenannte Erklärung.
Ein paar beispiel findet man auch hier im RN Wissen bereich. Auch bei Bascom Selber sind eine ganze Menge Beispiele dabei. Zwar zum Teil für andere µCs, aber da sind die unterschiede minimal.

Gary
11.08.2009, 14:57
kennst du fileicht ein buch was ich mir kaufen kann das sich mit bascom basic beschäftigt oder eine gite inet seite. ja auf RN findet man ein paar tips, aber ich bin anfänger und muss erstmal alles lehrnen