Wenn es so funktioniert, passt es schon so. Besser wäre es, wenn du es in ein Array schreibst.
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
Wenn es so funktioniert, passt es schon so. Besser wäre es, wenn du es in ein Array schreibst.
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
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?
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.
Es fehlt ein Endif im "Do" Block Nach den Dim Befehlen
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.
ok ich versuchs mal mit nem array
danke
fileicht sagst du mal 2-3 sätze zu den beiden alternativen, damit ich weis womit ich es zu tun habe.^^Zitat von Besserwessi
bin noch ziemlich am anfang meiner basic lektionen und über arrays oder select/case hab ich noch garnichts gelehrnt.
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.
Lesezeichen