- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 23 von 23

Thema: Hilfe: Programm übersetzen C -> BasCom [ Oszi Uhr ]

  1. #21
    Benutzer Stammmitglied
    Registriert seit
    08.02.2007
    Alter
    45
    Beiträge
    40
    Anzeige

    Praxistest und DIY Projekte
    ..hab dank, jetzt komme ich erstmal weiter.

    LG MaXX

  2. #22
    Benutzer Stammmitglied
    Registriert seit
    08.02.2007
    Alter
    45
    Beiträge
    40
    ...ich habe den C.Code mal umgesetzt und habe das ganze an mein Oszi angeschlossen. (ein Pin direkt an den ext. Triggger und den anderen über den 2Bit-R2R an den 1. Kanal)

    EDIT:
    Aktualisierter Code-> Ich habe die Sub 'Zustand' entfernt und verwende jetzt einen 16Mhz Quarz.

    Code:
    '------------[Meta]-------------------------------------------------------------
    $regfile = "m32def.dat"
    $crystal = 16000000
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    '------------[Lib für KS108-gLCD]-----------------------------------------------
    $lib "glcdKS108.lbx"
    
    '------------[GLCD Config]------------------------------------------------------
    Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 1 , Ce2 = 2 , Cd = 3 , Rd = 4 , Reset = 0 , Enable = 5
    Cls
    Setfont Font6x8                                             ' Forn laden
    
    
    '------------[Const & Variabeln definieren]-------------------------------------
    Const Max_digit = 6                                         ' Sechs Zeichen müssen dargestellt werden
    Const Slots = Max_digit * 3 + 4                             ' Anzahl der Zeitschlitze -> 2 für Header, 3 pro Zeichen, 2 für Trailer
    
    Dim Ss As Byte                                              ' Sekunde
    Dim Mn As Byte                                              ' Minute
    Dim Hh As Byte                                              ' Stunde
    
    Dim Line_(slots) As Byte
    Dim Didx As Byte                                            ' Zeitschlitz (timeslot) counter
    Dim Fidx As Byte                                            ' Frame counter
    
    Dim I As Byte
    
    Dim Display_(max_digit) As Byte                             ' anzeigbare Zeichen
    
    Dim S As Byte
    Dim P As Byte
    
    Dim Tmp As Byte                                             ' temp
    
    '------------[Ports definieren]-------------------------------------------------
    '------------[AVR-Atmega32-Pins]--------------------------------------------
     'PortA.0 =         | PortB.0 =            | PortC.0 =                | PortD.0 =
     'PortA.1 =         | PortB.1 =            | PortC.1 =                | PortD.1 =
     'PortA.2 =         | PortB.2 =            | PortC.2 =                | PortD.2 = DCF-77
     'PortA.3 =         | PortB.3 =            | PortC.3 =                | PortD.3 = Status-LED
     'PortA.4 =         | PortB.4 =            | PortC.4 =                | PortD.4 = R2R-Bit.2
     'PortA.5 =         | PortB.5 =            | PortC.5 =                | PortD.5 = R2R-Bit.1
     'PortA.6 =         | PortB.6 =            | PortC.6 =                | PortD.6 = Trigger
     'PortA.7 =         | PortB.7 =            |                          | PortD.7 =
    '-------------------------------------------------------------------------------
    
    '----[Trigger-Output]-----------------------------------------------------------
    Config Pind.6 = Output
    Trigger Alias Portd.6
    
    '----[2Bit R2R DAU]-------------------------------------------------------------
    Config Pind.5 = Output
    Bit1 Alias Portd.5
    '----[2Bit R2R DAU]-------------------------------------------------------------
    Config Pind.4 = Output
    Bit2 Alias Portd.4
    
    '----[Status-LED]---------------------------------------------------------------
    Config Pind.3 = Output
    Led Alias Portd.3
    Led = 1                                                     ' LED einschalten
    
    '----[Taster_Stunde]------------------------------------------------------------
    Config Pinb.0 = Input
    Taster_hr Alias Pinb.0
    Portb.0 = 1                                                 ' Pullup aktivieren
    '----[Taster_Minute]------------------------------------------------------------
    Config Pinb.1 = Input
    Taster_mn Alias Pinb.1
    Portb.1 = 1                                                 ' Pullup aktivieren
    
    '----[DCF_77-Input]-------------------------------------------------------------
    Config Pinb.2 = Input
    Dcf_77 Alias Pinb.2
    Portb.2 = 0                                                 ' Pullup deaktivieren
    
    '------------[Timer1 konfigurieren]---------------------------------------------
    Config Timer1 = Timer , Prescale = 256
    On Timer1 Ontimer
    Const Pre = 43200
    Load Timer1 , Pre
    
    
    '------------[Interrupts aktivieren]--------------------------------------------
    Enable Interrupts                                           ' Interrupts aktivieren
    
    '------------[Programm]---------------------------------------------------------
    '------------[Start]------------------------------------------------------------
    Cls
    
    ' ------[TEST]------------------------------------------------------------------
    ' Zustand 90 : Lcdat 1 , 0 , "Zero  " : Wait 1               ' Zero
    ' Zustand 76 : Lcdat 1 , 0 , "Lower " : Wait 1               ' Lower
    ' Zustand 77 : Lcdat 1 , 0 , "Middle" : Wait 1               ' Middle
    ' Zustand 72 : Lcdat 1 , 0 , "High  " : Wait 1               ' High
    ' Lcdat 1 , 0 , "run.."
    
    
    Enable Timer1
    
    Do
    '  Lcdat 1 , 0 , Hh , ":" , Mn . ":" , Ss
    ' ----------[Buffer leeren]-----------------------------------------------------
        For I = 1 To Slots : Line_(i) = 0 : Next
        For I = 1 To Max_digit : Display_(i) = 0 : Next
    
    ' ----------[Prepare display buffer]--------------------------------------------
        Display_(6) = Ss Mod 10                                 ' Sekunden
        Display_(5) = Ss / 10
    
        Display_(4) = Mn Mod 10                                 ' Minuten
        Display_(3) = Mn / 10
    
        Display_(2) = Hh Mod 10                                 ' Stunden
        If Hh > 9 Then Display_(1) = Hh / 10 Else Display_(1) = 10       ' blank first, digit if Zero
    
    ' ----------[Tasterabfrage zum einstellen der Uhrzeit]--------------------------
        Debounce Taster_mn , 0 , Incr_mn , Sub                  ' Minuten einstellen
        Debounce Taster_hr , 0 , Incr_hr , Sub                  ' Stunden einstellen
    
        Mn = Mn Mod 60                                          ' prevent minute overflow
        Hh = Hh Mod 24                                          ' prevent hours overflow
    
    ' ----------[Prepare time slot flags]-------------------------------------------
    
        For I = 1 To Max_digit                                  ' Für jedes Zeichen
    
            S = Lookup(display_(i) , Septseg)                   ' Get 7 segment encoding
    
            Tmp = Lookup(i , Sidx)                              ' get pointer to time slot, left part of the digit
            P = Line_(tmp)
    
            '=======================================================================
    
            P.0 = S.0                                           ' Bit.0 | Segment A
            P.1 = S.6                                           ' Bit.6 | Segment G
            P.2 = S.3                                           ' Bit.3 | Segment D
    
            P.6 = S.4                                           ' Bit.4 | Segment E
            P.7 = S.5                                           ' Bit.5 | Segment F
    
            '=======================================================================
    
            Incr P                                              ' Next slot ,center part of the digit
    
            '=======================================================================
    
            P.0 = S.0                                           ' Bit.0 | Segment A (fortsetzung)
            P.1 = S.6                                           ' Bit.6 | Segment G (fortsetzung)
            P.2 = S.3                                           ' Bit.3 | Segment D (fortsetzung)
    
            Incr P                                              ' Next slot, right part of the digit
    
            P.6 = S.2                                           ' Bit.6 | Segment B
            P.7 = S.1                                           ' Bit.1 | Segment C
            '=======================================================================
    
        Next I
    
    ' ------[Teil des ISR Interruptsprung aus dem C-Code]---------------------------
    
             '----------------------------------------------------------------------
                 If Line_(didx).6 = 1 And Line_(didx).7 = 1 Then       ' if full vertical bar
                         Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1       'Low,High,Low,High -> 16 mal durchlaufen damit die Seitenleiste breiter wird…
                         Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 1
                  Elseif Line_(didx).6 = 1 Then                 ' if lower vertical bar
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1       'Mid,Low,Mid,Low -> 16 mal durchlaufen damit die Seitenleiste breiter wird…
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 0 : Bit2 = 1
                  Elseif Line_(didx).7 = 1 Then                 ' if upper vertical bar
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
                         Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1 : Bit1 = 1 : Bit2 = 0 : Bit1 = 1 : Bit2 = 1
                 End If
    
                 If Didx = 7 Then                               ' Stunden : Minuten separator
                           Bit1 = 0 : Bit2 = 1 : Waitus 10      ' Low
                           Bit1 = 1 : Bit2 = 0 : Waitus 10      ' Mid
                 Elseif Didx = 14 Then                          ' Minuten : Sekunden separator
                        If Timer1 < 22336 Then                  ' Blink ~0.5 Hz -> (65536- const pre)
                           Bit1 = 0 : Bit2 = 1 : Waitus 10      ' Low
                           Bit1 = 1 : Bit2 = 0 : Waitus 10      ' Mid
                        End If
                 End If
    
                 Select Case Fidx                               ' Je nach Frameindex
                        Case 0 : If Line_(didx).0 = 1 Then      ' obere Linie
                                   Bit1 = 1 : Bit2 = 1          ' High
                                 Else
                                   Bit1 = 0 : Bit2 = 0          ' Zero
                                 End If
                        Case 1 : If Line_(didx).1 = 1 Then      ' mittlere Linie
                                   Bit1 = 1 : Bit2 = 0          ' Mid
                                 Else
                                   Bit1 = 0 : Bit2 = 0          ' Zero
                                 End If
                        Case 2 : If Line_(didx).2 = 1 Then      ' untere Linie
                                   Bit1 = 0 : Bit2 = 1          ' Low
                                 Else
                                   Bit1 = 0 : Bit2 = 0          ' Zero
                                 End If
                 End Select
    
                 Incr Didx                                      ' nächster Slot
                 If Didx = Slots Then                           ' letzter Slot ?
                    Didx = 0                                    ' lösche Slot
                    Trigger = 1                                 ' Oszi triggern (EIN)
                    Incr Fidx                                   ' nächster Frame
                    If Fidx = 3 Then                            ' letzter Frame ?
                       Fidx = 0                                 ' lösche Frame
                       Trigger = 0                              ' Oszi triggern (AUS)
                    End If
                 End If
          ' ---------------------------------------------------------------------
    Loop
    
    
    '======[Adjust-Time Labels]=====================================================
    Incr_mn:
      Ss = 0
      Incr Mn
    Return
    
    Incr_hr:
      Ss = 0
      Incr Hh
    Return
    
    
    
    '------------[Timer Interrupt Sprungmarke]--------------------------------------
    Ontimer:
             '----------------------------------------------------------------------
                 Toggle Led
    
                 Incr Ss                                        ' nächste Sekunde
                 If Ss = 60 Then                                ' letzte Sekunde in der Minute ?
                    Ss = 0                                      ' lösche Sekunde
                    Incr Mn                                     ' nächste Minute
    
                    If Mn = 60 Then                             ' letzte Minute in der Stunde ?
                       Mn = 0                                   ' lösche Minute
                       Incr Hh                                  ' nächste Stunde
    
                       If Hh = 24 Then                          ' letzte Stunde am Tag?
                          Hh = 0                                ' lösche Stunde
                       End If
                    End If
                 End If
    
             '----------------------------------------------------------------------
             Load Timer1 , Pre
    Return
    
    
    '---------[Ende]----------------------------------------------------------------
    End
    
    
    '----[Segment defenitionen]-----------------------------------------------------
    Septseg:
    Data &H3F , &H06 , &H5B , &H4F , &H66 , &H6D , &H7D , &H07 , &H7F , &H6F , &H00
    '        0      1        2       3       4       5       6       7       8       9      -
    'BiN: 0111111,0000110,1011011,1001111,1100110,1101101,1111101,0000111,1111111,1101111,0000000
    '     gfedcba,gfedcba,gfedcba,gfedcba,gfedcba,gfedcba,gfedcba,gfedcba,gfedcba,gfedcba,gfedcba
    
    '----[Slot Index für Zeichen-Start]---------------------------------------------
    Sidx:
    Data 1 , 4 , 8 , 11 , 15 , 18
    
    $include "font6x8.font"                                     ' Fontdatei einfügen
    Ich bekomme bis jetzt nur zwei Punkte (einen auf Low und der andere auf Middle) und die Nullinie angezeig.

    Den Part
    Code:
                    if(line[dIdx].F6 && line[dIdx].F7)              // if full vertical bar
                            {
                            LOW, HIGH, LOW, HIGH ;			16 mal durchlaufen damit die Seitenleiste breiter wird.
                            LOW, HIGH, LOW, HIGH ;
                            LOW, HIGH, LOW, HIGH ;
                            LOW, HIGH, LOW, HIGH ;
                            LOW, HIGH, LOW, HIGH ;
                            LOW, HIGH, LOW, HIGH ;
                            LOW, HIGH, LOW, HIGH ;
                            LOW, HIGH, LOW, HIGH ; }
    
                    else if(line[dIdx].F6)                          // if lower vertical bar
                            {
                            MID, LOW, MID, LOW ;
                            MID, LOW, MID, LOW ;
                            MID, LOW, MID, LOW ;
                            MID, LOW, MID, LOW ;
                            MID, LOW, MID, LOW ;
                            MID, LOW, MID, LOW ;
                            MID, LOW, MID, LOW ;
                            MID, LOW, MID, LOW ; }
    
                    else if(line[dIdx].F7)                          // if upper vertical bar
                            {
                            MID, HIGH, MID, HIGH ;
                            MID, HIGH, MID, HIGH ;
                            MID, HIGH, MID, HIGH ;
                            MID, HIGH, MID, HIGH ;
                            MID, HIGH, MID, HIGH ;
                            MID, HIGH, MID, HIGH ;
                            MID, HIGH, MID, HIGH ;
                            MID, HIGH, MID, HIGH ; }
    
                    if(dIdx == 7)                                   // hour : minute separator
                            { LOW, Delay10us() ;
                              MID, Delay10us() ; }
                    else if(dIdx == 14)                             // minute : second separator
                            {
                            if(scaler < MAX_SCALER / 2)             // blink 0.5 Hz
                                    { LOW, Delay10us() ;
                                      MID, Delay10us() ; }
                            }
                            
                    switch(fIdx)                                    // depending on frame index
                            { case 0:                                 // upper line
                                    if(line[dIdx] & 1)
                                            ( HIGH ; )
                                    else
                                            ( ZERO ; )
                                    break ;
    
                              case 1:                                 // middle line
                                    if(line[dIdx] & 2)
                                            ( MID ; )
                                    else
                                            { ZERO ; )
                                    break ;
    
                              case 2:                                 // lower line
                                    if(line[dIdx] & 4)
                                            { LOW ; }
                                    else
                                            { ZERO ; }
                                    break ;
                            }
    
    
                    dIdx++ ;                                          // next slot
                    if (dIdx == SLOTS)                                // last slot ?
                            { dIdx = 0 ;                              // clear slot
                              TRIGGER = 1 ;                           // triggers the scope
                              fIdx++ ;                                // next frame
                              if(fIdx == 3)                           // last frame ?
                                    { fIdx = 0 ; )                    // clear frame
                              TRIGGER = 0 ; )                         // end trigger
    aus dem C.Code habe ich mit in die Hauptschleife einbezogen. Hier könnte der Fehler liegen.

    Kann sich das mal jemand anschauen?

    DANKE!

    Gruß MaXX

  3. #23
    Benutzer Stammmitglied
    Registriert seit
    08.02.2007
    Alter
    45
    Beiträge
    40
    EDIT: der obrige Beitrag wurde noch mal editiert...

    Ich glaube das Problem liegt an der Timereinstellung.

    In meinem Bascom.Code ist der Timer so konfiguriert, daß er jede Sekunde überläuft.

    Im C.Code ist das etwas anders gelöst.. Wie kann ich das in Bascom umsetzen??
    (dann könnte auch der letzte Part aus dem C.Code wieder in den ISR Interruptsprung)

    Ich danke euch
    Gruß MaXX

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad