- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: kurz vorm durchdrehen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.07.2004
    Ort
    Regensburg
    Alter
    39
    Beiträge
    366

    kurz vorm durchdrehen

    Anzeige

    Powerstation Test
    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

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    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]

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.07.2004
    Ort
    Regensburg
    Alter
    39
    Beiträge
    366
    Cool vielen Dank, angenommen ich hab eine Anzeige mit gemeinsammer Anode funzt des dann genauso?

    gruß
    xeus

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken 7segment.jpg  

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.07.2004
    Ort
    Regensburg
    Alter
    39
    Beiträge
    366
    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

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    ACHSOOOOOOOOOOOOOOOO!
    Hätte ich mal in deinen Code geguck, wie peinlich!

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.07.2004
    Ort
    Regensburg
    Alter
    39
    Beiträge
    366
    Könntest du mir vielleicht trozdem bei meinem Problem helfen. Wär echt super, weil ich komm einfach nicht vorran.

    xeus

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    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.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.07.2004
    Ort
    Regensburg
    Alter
    39
    Beiträge
    366
    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

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    Kannst du eine andere zahl auf das zweite digit ausgeben lassen?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests