PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : kurz vorm durchdrehen



Xeus
03.01.2005, 16:34
Hallo
ich hab mit hilfe eines mega8s einen Zähler realisiert, der impulse
zählt, und diesen Wert an ein LCD ausgibt.
Nun will ich diesen wert auch noch zusätzlich über eine 7Segmentanzeige
ausgeben lassen. Dazu hab ich auch schon einen fertigen
Bascom Code bekommen. Das dumme ist nur, das der code nur für ein digit
ausgelegt ist, ich aber meine dreistellige zähler variable über drei
digits ausgeben lassen will. Das erste problem auf das ich gestoßen
bin, war dass ich die zahl in ziffern zerlegen musste, um sie einer
einstelligen integer variable zuortnen zukönnen.

123 in 1 2 3

Das zweite war, die drei variablen über die einzelnen Segmente
ausgeben. und da scheiterts. ich kann den code immer nur so verändern,
dass mir das display eine ziffer ausgibt. die anderen beiden digits
zeigen nur schrott z.b. L und P

kann mir vielleicht einer von euch den code so umänder das es funzt,
ich bin echt schon voll am verzweifeln!

gruß xeus


$regfile = "m8def.dat"

$crystal = 1000000 'Quarz:
3.6864 MHz
$baud = 4800 'Baudrate
der UART: 9600 Baud

'LCD config
Dim I As Byte
Config Lcdpin = Pin , Db4 = Portb.7 , Db5 = Portd.5 , Db6 = Portd.6 ,
Db7 = Portd.7 , E = Portb.6 , Rs = Portd.4 ' Natürlich so wie es
wirklich angeschlossen ist (4-Bit-Modus)
Dim A As Byte
Config Lcd = 20 * 4 'configure
lcd screen


'WR portconfig
Config Pinb.1 = Input
Config Pinc.3 = Output

'7-Seg Port Conf
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.5 = Output
Disp_en Alias Portb.2 '
chip-select for display driVer
Ser_clk Alias Portb.5 ' clk for
display driver
Ser_data Alias Portb.3


'Var
Dim Wr1 As Integer 'Integer
Dim W As Byte
Dim Insgesamt As Integer
Dim Kw As Integer
Dim D1 As Integer
Dim D2 As Integer
Dim D3 As Integer

'Var 7 Seg
Dim Disp_num1 As Byte
Dim Disp_data1 As Byte
Dim Disp_num2 As Byte
Dim Disp_data2 As Byte
Dim Disp_num3 As Byte
Dim Disp_data3 As Byte
Dim Seg1 As Integer
Dim Seg2 As Integer
Dim Seg3 As Integer
Dim Seg4 As Integer
Dim Seg5 As Integer
Dim Seg6 As Integer
Dim Seg7 As Integer

'SUB Progs
Declare Sub Status
Declare Sub Wr1status
Declare Sub Rs232
Declare Sub Kw
Declare Sub Störung
Declare Sub 7seg

'Display Init
Cls
Locate 1 , 1
Lcd "Iliocontrol"
Locate 2 , 1
Lcd "Wechselrichter1"
Locate 3 , 18
Lcd "kW"

Wr1 = 1
'WR1-Portabfrage
Do
If Pinb.1 = 0 Then
Call Wr1status
'Else
'Call Störung
End If
Call Rs232
Call 7seg
'Insgesamt:= WR1+WR2..
Insgesamt = Wr1
Loop

Sub Wr1status
Wr1 = Wr1 + 1
Call Status
End Sub


Sub Status
Call Kw
Locate 3 , 1
Lcd Kw
End Sub

Sub Kw
Kw = Wr1 ' / 1000
End Sub

Sub Störung
Locate 3 , 1
Lcd "Stoerrung!!!"
End Sub


Sub Rs232
If Usr.rxc = 1 Then
I = Udr 'turn
display on
Select Case I
Case "1"
Print "Wechselrichter1 " ; Wr1
Case "2"
Print "Wechselrichter2 ist nicht vorhanden!"
Case "I"
Print "Gesamtertrag " ; Insgesamt

Case "S"
Do
Portc.3 = 0
Return
Loop
End Select

End If
Return
End Sub

Sub 7seg

Seg1 = Wr1 / 100 'digit3
Seg2 = Wr1 / 10
Seg3 = Seg2 * 10
Seg4 = Seg1 * 100
Seg5 = Wr1 - Seg4
Seg6 = Seg5 / 10 'digit2
Seg7 = Wr1 - Seg3 'digit1

D1 = Seg7
D2 = Seg6
D3 = Seg1



Gosub Max7219_setup
Main:

Disp_num3 = 3 ' ( 0 - 7 ) digit#
Disp_data3 = D3

Disp_num2 = 2 ' ( 0 - 7 ) digit#
Disp_data2 = D2
' (0 - 15 ) number to display.
Disp_num1 = 1 ' ( 0 - 7 )
digit#
Disp_data1 = D1

Gosub Disp_write




'setup max7219 config. registers
Max7219_setup:
Disp_num1 = &H0C : Disp_data1 = 0 ' Shutdown On
Gosub Disp_write
Disp_num1 = 9 : Disp_data1 = &B0011_0111 ' Decode "B" For 1st
6
Gosub Disp_write
Disp_num1 = &H0A : Disp_data1 = &H0F ' Brightness Full
Gosub Disp_write
Disp_num1 = &H0B : Disp_data1 = 7 ' # Digits 8
Gosub Disp_write
Disp_num1 = &H0F : Disp_data1 = 0 ' Test Off
Gosub Disp_write
Disp_num1 = &H0C : Disp_data1 = 1 ' Shutdown Off
Gosub Disp_write

Disp_num2 = &H0C : Disp_data2 = 0 ' Shutdown On
Gosub Disp_write
Disp_num2 = 9 : Disp_data2 = &B0011_0111 ' Decode "B" For 1st
6
Gosub Disp_write
Disp_num2 = &H0A : Disp_data2 = &H0F ' Brightness Full
Gosub Disp_write
Disp_num2 = &H0B : Disp_data2 = 7 ' # Digits 8
Gosub Disp_write
Disp_num2 = &H0F : Disp_data2 = 0 ' Test Off
Gosub Disp_write
Disp_num2 = &H0C : Disp_data2 = 1 ' Shutdown Off
Gosub Disp_write

Disp_num3 = &H0C : Disp_data3 = 0 ' Shutdown On
Gosub Disp_write
Disp_num3 = 9 : Disp_data3 = &B0011 ' Decode "B" For 1st 6
Gosub Disp_write
Disp_num3 = &H0A : Disp_data3 = &H0F ' Brightness Full
Gosub Disp_write
Disp_num3 = &H0B : Disp_data3 = 7 ' # Digits 8
Gosub Disp_write
Disp_num3 = &H0F : Disp_data3 = 0 ' Test Off
Gosub Disp_write
Disp_num3 = &H0C : Disp_data3 = 1 ' Shutdown Off
Gosub Disp_write



Return

' Sends data to the Max7219 display driver
Disp_write:
Disable Interrupts
Reset Ser_data
Reset Ser_clk
Reset Disp_en
Shiftout Ser_data , Ser_clk , Disp_num1 , 1
Shiftout Ser_data , Ser_clk , Disp_data1 , 1

'Disable Interrupts
'Reset Ser_data
'Reset Ser_clk
'Reset Disp_en
Shiftout Ser_data , Ser_clk , Disp_num2 , 1
Shiftout Ser_data , Ser_clk , Disp_data2 , 1

'Disable Interrupts
'Reset Ser_data
'Reset Ser_clk
'Reset Disp_en
Shiftout Ser_data , Ser_clk , Disp_num3 , 1
Shiftout Ser_data , Ser_clk , Disp_data3 , 1

Set Disp_en
Enable Interrupts
Return
End Sub


End

sebastian.heyn
03.01.2005, 17:12
hallo programmier doch anders.

die 7 segment alle drei hast du sicher gemeinsame catode und kannst sie getrennt anwählen. dann lässt du im hauptprogramm

do
portx=1 'erste sieben-segment aktivieren
call ausgabe(einer) 'ausgaberoutine aufrufen
waitms 2
portx=2 'zweite sieben-segment aktivieren
call ausgabe(zehner) 'ausgaberoutine aufrufen
waitms 2
portx=4 'dritte sieben-segment aktivieren
call ausgabe(hunderter) 'ausgaberoutine aufrufen
waitms 2
loop

einer, zehner und hunderter. ausgeführt als interrupt.

zaehlerinc:
einer=einer+1
if einer=10 then
einer=0
zehner=zehner+1
end if
if zehner=10 then
zehner=0
hunderter=hunderter+1
end if
end sub


ich schicke dir mal meine uhr, auch auf dem mega8 programmiert. (ich werd gegen 23/24uhr daheim sein. vielleicht hilft se dir
[/code]

Xeus
04.01.2005, 06:23
Cool vielen Dank, angenommen ich hab eine Anzeige mit gemeinsammer Anode funzt des dann genauso?

gruß
xeus

sebastian.heyn
04.01.2005, 08:48
Wie hast du sie denn dann angeschlossen?

Hab mal eingezeichnet wie ichs machen würde um sicher zu gehen:

Wenn du Portx.0 und Porty.0 auf null setzt dann leuchtet das entsprechende segment. Bei portx.0 und porty.1 das gleiche segment des anderen digits.
Ist natürlich blöd weil du alle werte invertiert ausrechnen musst.
So wie in meiner Zeichnung müsste es funktionieren. Auf die Transistorstufen würde ich nicht verzichten, wegen des hohen stroms...
Die Widerstandswerte sind so PI*Daumen geschätzt

Xeus
04.01.2005, 10:09
Bahnhof! Ich bin SCK, MISO und einem Portpin auf den MAX7219 geganegen. Von dort aus, auf meine Segmente und auf die einzelnen Digits.
Ich glaube nicht, das es an der Hardware liegt, da ich mir ohne Probleme einstellige zahlen anzeigen lassen kann. Mein Problem ist halt einfach, dass mein Program automatisch bei mehrstelligen Zahlen die entsprechenden Digits zu anzeige nutzt.
z.B.

1 nur ein digit
12 dritte und zweite digit
123 dritte, zweite und erste digit

Danke für deine Bemühung,
xeus

sebastian.heyn
04.01.2005, 10:31
ACHSOOOOOOOOOOOOOOOO!
Hätte ich mal in deinen Code geguck, wie peinlich!

Xeus
04.01.2005, 11:58
Könntest du mir vielleicht trozdem bei meinem Problem helfen. Wär echt super, weil ich komm einfach nicht vorran.

xeus

sebastian.heyn
04.01.2005, 12:20
Also nur zum Verständniss:

die erste ziffer wird immer richtig ausgegeben? Ich kenne den MAX nicht, also praktisch... kommt der damit klar das du ne 1 als 1 und ne 2 als 2 ausgibst?


Bastel gerade an einer Software für nen Mega8 die laufschrift, zeit etc als Standalone-Lösung wir 4digit7segment und später alphanummerisch (8digit) ausgibt.

Xeus
04.01.2005, 13:07
Also es ist kein problem eine ziffer mit diser routine auszugeben



Gosub Max7219_setup
Main:

Disp_num2 = 1 ' ( 0 - 7 ) digit#
Disp_data2 = 2 ' (0 - 15 ) number to display.

Gosub Disp_write




'setup max7219 config. registers

Max7219_setup:
Disp_num1 = &H0C : Disp_data1 = 0 ' Shutdown On
Gosub Disp_write
Disp_num1 = 9 : Disp_data1 = &B0011_0111 ' Decode "B" For 1st 6
Gosub Disp_write
Disp_num1 = &H0A : Disp_data1 = &H0F ' Brightness Full
Gosub Disp_write
Disp_num1 = &H0B : Disp_data1 = 7 ' # Digits 8
Gosub Disp_write
Disp_num1 = &H0F : Disp_data1 = 0 ' Test Off
Gosub Disp_write
Disp_num1 = &H0C : Disp_data1 = 1 ' Shutdown Off
Gosub Disp_write
Return

' Sends data to the Max7219 display driver
Disp_write:
Disable Interrupts
Reset Ser_data
Reset Ser_clk
Reset Disp_en
Shiftout Ser_data , Ser_clk , Disp_num1 , 1
Shiftout Ser_data , Ser_clk , Disp_data1 , 1

Set Disp_en
Enable Interrupts
Return
End Sub




Wenn ich z.b. eine 3 stellige zahl habe, wie muss ich die zahl ausgeben lassen kann. denn 3stellig bedeutet drei digits

gruß
xeus

sebastian.heyn
04.01.2005, 17:41
Kannst du eine andere zahl auf das zweite digit ausgeben lassen?

Xeus
05.01.2005, 13:31
Wie eine andere zahl?

ich kann auf jedes digit jede beliebige zahl von 0-9 anzeigen lassen. Aber halt nicht alle drei digits gleichzeitig.

z.b

1 - -
- 2 -
- - 3

- = Digits die nichts anzeigen