PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wert auf 2 siebensegmenteanzeigen ausgeben



RobbyMartin
03.04.2010, 10:34
Hallo ich möchte den wert des potentiometers auf 2 siebensegmente anzeigen darstelellen von 0 - 99 doch ich habe keine ahnung wie ich es realisieren soll...

$regfile "m8def.dat"

$crystal = 1000000

Dim Ad As Word

Config Portb = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc

Start Adc

Do
Ad = Getadc(0)
If Ad <= 340 Then
Portb.0 = 1 : Portb.1 = 0 : Portb.2 = 0
Elseif Ad > 340 And Ad <= 680 Then
Portb.0 = 0 : Portb.1 = 1 : Portb.2 = 0
Elseif Ad > 680 Then
Portb.0 = 0 : Portb.1 = 0 : Portb.2 = 1
End If
Loop


das ist das programm um zumindestens schonmal 3 leds zum leuchten zu bringen aber wie ich es auf einer sieben segmente anzeige anzeigen soll weiß ich nicht könnte mir jemand helfen ??

das programm ist für den atmega 8

auch ein kleiner schaltplan wo ich dann die sieben segmenteanzeigen anschliesen muss wäre nett

auf antworten freue ich mich sehr

lg
martin

for_ro
03.04.2010, 11:56
Hallo Martin,
wichtig ist zunächst mal, ob der Mega8 noch andere Sachen machen soll oder ob du 14 Pins für die 2 7-Segment Anzeigen frei hast.
Wenn ja, kannst du einen Anschluss der Anzeige direkt von einem Pin des µC treiben lassen. Da muss dann nur noch ein Vorwiderstand dazwischen, um den Strom auf 20mA zu begrenzen.
Dann ist es am einfachsten, wenn du eine Anzeige auf einen kompletten Port legen kannst. Dass geht beim Mega8 mit PortB und PortD. Bei PortB kannst du dann aber keinen Quarz anschließen. Ist bei deinem bisherigen Programm auch unnötig.

Die Anzeigen haben eine gemeinsame Anode oder Kathode, die an VCC bzw. GND kommt.
Die Segmentanschlüsse legst du dann z.B. so
Seg A -> PortB.0
Seg B -> PortB.1
Seg C -> PortB.2
Seg D -> PortB.3
Seg E -> PortB.4
Seg F -> PortB.5
Seg G -> PortB.6

.A.
F B
.G.
E C
.D.

Entsprechend für die zweite Stelle.
Dann speicherst du dir in einem Feld zu den Ziffern 0-9 die entsprechenden Werte ab. Bei gemeinsamer Kathode (dann müssen die Segmente auf 1 um an zu sein) also z.B.
PortB = &B0000_0110 '1
PortB = &B0110_0110 '4
Die Zahlen von 0-99 zerlegst du in die Ziffern z.B. mit
Zehner = Ad / 10
Einer = Ad Mod 10
und gibst dann die Feldwerte für die beiden Stellen aus.

Klar?

Edit: Ich habe die Segmente mal so abgeändert, wie Jaecko meinte. Passt dann auch zu Ches Programm.

Jaecko
03.04.2010, 11:59
Glaub, dass die Segmentanordnung nicht ganz stimmt.
Der "Ring" aussen rum ist um 1 Schritt verdreht; A ist ganz oben, F links oben.

Che Guevara
03.04.2010, 11:59
Hallo Martin,

hier mal ein Code von mir, hab ihn nur auf die schnelle zusammengebastelt, aber ich denke, er müsste funktionieren, wenn du ihn auf deine Hardware (mega8 , quarz) abstimmst.


$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 80
$hwstack = 80
$swstack = 80


Ddra.0 = 0
Porta.0 = 0
Ddrc = 255
Ddrd.0 = 1
Ddrd.1 = 1

Trans_left Alias Portd.0
Trans_right Alias Portd.1

Trans_left = 1
Trans_right = 0


Config Adc = Single , Prescaler = Auto
Start Adc

Config Timer2 = Timer , Prescale = 256
Timer2 = 131
On Timer2 Multiplex
Enable Timer2


Dim Poti_wert As Word
Dim Anzeige As Single
Dim String_1 As String * 3
Dim Anzeige_left_string As String * 2
Dim Anzeige_right_string As String * 2
Dim Anzeige_left As Byte
Dim Anzeige_right As Byte
Dim Anzeige_numb As Bit


Enable Interrupts


Do

Poti_wert = Getadc(0)
Anzeige = Poti_wert / 1024
Anzeige = Anzeige * 99
String_1 = Str(anzeige)
Anzeige_left_string = Left(string_1 , 1)
Anzeige_right_string = Right(string_1 , 1)

Anzeige_left = Val(anzeige_left_string)
Anzeige_right = Val(anzeige_right_string)

Anzeige_left = Lookup(anzeige_left , Seven_segment_tab)
Anzeige_right = Lookup(anzeige_right , Seven_segment_tab)

If Anzeige_numb = 1 Then
Portc = Anzeige_left
Elseif Anzeige_numb = 0 Then
Portc = Anzeige_right
End If

Loop

End


Multiplex:
Timer2 = 131
Toggle Trans_left
Toggle Trans_right
Toggle Anzeige_numb
Return



Seven_segment_tab:
'Data &B00000001 , &B00000110 , &B00011000 , &B00110000 , &B01100000 , &B01110111 , &B01111111 , &B10000011 , &B10111111 , &B11111111


Ganz am Schluss musst du den "Kommentar" wegmachen und für die Anzeigen passende Werte einfügen.
Einen Schaltplan kann / will ich dir jetzt nicht geben, aber im Prinzip ist es ganz einfach:
Du schließt zwei 7 Segmentanzeigen parrallel an, nur die gemeinsame Anode / Kathode nicht. Diese hängst du jeweils an einen Transistor (also trans_left (Portd.0) und trans_right (Portd.1)). Die restlichten parallelen Anschlüsse kommen alle an Portc. Das kannst du natürlich auf jeden beliebigen Port umbauen.
Der Vorteil bei dem Parralel schalten ist, dass du dir ein Paar pins sparst, indem die beiden Anzeigen gemultiplext werden.
Mit diesen Timerwerten läuft die Anzeige auf 500Hz. Ich denke das reicht, falls es aber doch flimmern sollte, musst du die Frequenz erhöhen.

Wenn du noch Fragen hast, melde dich einfach.

Gruß
Chris

RobbyMartin
03.04.2010, 12:13
also die lösung von che guevara klingt schon ganz gut ich denke nicht das ich keinen externen quarz benötige der interne oszilator genügt, da ich keine weiteren auswertungen ^vornehmen werde

was ich nur noch gerne wissen wollte
was ich in die letzte zeile einfügen soll wenn die anzeige von 0-99 hoch gehen soll

Seven_segment_tab:
'Data &B00000001 , &B00000110 , &B00011000 , &B00110000 , &B01100000 , &B01110111 , &B01111111 , &B10000011 , &B10111111 , &B11111111

trotzdem danke für die schnelle antwort

lg
martin

Che Guevara
03.04.2010, 12:18
Du musst nur die Werte des Ports für die Ziffern 0-9 einfügen.
Wenn eine 0 z.b. &B01111110 ist, dann ist das der erste Wert.
Wenn eine 1 z.b. &B01000010 ist, dann ist das der zweite Wert.
usw...

Am besten, du siehst dir dazu nochmal den Beitrag von for_ro an ;-)

Gruß
Chris

Malte0815
03.04.2010, 14:10
Hi,

hab vor kurzem das selbe gemacht.
Schau mal hier:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=53087&highlight=

Das ist genau was du suchst :)