-         

Ergebnis 1 bis 7 von 7

Thema: bin am verzweifeln mit out of sram space

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.04.2005
    Ort
    89331 Burgau
    Beiträge
    32

    bin am verzweifeln mit out of sram space

    Anzeige

    letzte Woche lief mit der 1.11.9.3 noch alles 1a, auf einen Schlag kam immer die Fehlermeldung Out of SRAM space [Error 22 Line 11]
    Ich habe jetzt schon zig Einstellungen getestet nichts geht.

    In der 1.11.9.1 gehts momemtan noch.

    hier mal der Code:

    Code:
    $prog &HFC , &HFF , &HD9 , &H00
    
    
    $regfile = "attiny2313.dat"
    $crystal = 4000000
    
    Open "COMD.0:9600,8,n,2" For Input As #1                    ' Software UART konfigurieren
    
    
    ' Variablendeklaration
    Dim Zeiger As Byte At &HA0
    Zeiger = 1
    Dim Flag As Byte At &HA1
    Dim Adresse As Eram Byte
    Dim Hot As Eram Byte                                        'Scharfschalt-Status im eeProm
    Dim Adresse_temp As Byte At &HA2
    Dim Tempword As Word At &HA3
    Adresse_temp = Adresse
    Dim Tempbyte As Byte At &HA5
    Dim Tempbyte2 As Byte At &HA6
    Dim Init As Byte At &HA7
    
    Dim Protokoll(10) As Byte
    
    'Ausgangsports konfigurieren
    Ddrd = &B10111110
    Ddrb = &B11111111                                           'Beispiel:  DDRx = &B0000100      'Pin Px2 Ausgang, Rest Eingang
    
    Portb = 0
    Portd = &B01000000
    
    ' 2-mal Timer konfigurieren
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Timer_irq                                         'Nosave
    Stop Timer0
    
    Config Timer1 = Timer , Prescale = 64
    On Timer1 Timer_irq2                                        'Nosave
    Disable Timer1
    Stop Timer1
    Timer1 = 0
    
    Enable Timer0
    Enable Interrupts
    
    
     Waitms 100                                                 ' Initialisieren bereit
     If Pind.6 = 0 Then
     Waitms 100
     If Pind.6 = 0 Then
     Portd.5 = 0
     Init = 1
     Hot = 0
     Waitms 100
     Timer1 = 20500
     Enable Timer1
     Start Timer1
     End If
     End If
    
    
     If Hot = 1 And Init = 0 Then                               'Scharfschalt-Status setzen
     Portd.5 = 1
     End If
    
    
    
    
    
    
    Do                                                          ' Mainloop, hier dreht der Controller seine Runden
    
      Tempbyte = Waitkey(#1)                                    ' ware auf Zeichenempfang über Soft-UART
      Gosub Zeichenempfang                                      ' gehe zu Zeichenverarbeitung
    
      If Flag = 1 Then                                          ' Protokoll ist komplett ?
         Gosub Proto
         Flag = 0                                               ' Protokollflag wieder rücksetzen
         Zeiger = 1
      Elseif Flag = 2 Then                                      ' Protokoll ist komplett ?
         Gosub Scharfschalten                                   ' Protokoll abarbeiten
         Flag = 0                                               ' Protokollflag wieder rücksetzen
         Zeiger = 1                                             ' zeiger für Speicherung des nächsten eingehenden Zeichens rücksetzen
      End If
    
    Loop
    
    
    
    Zeichenempfang:
    
       'Tempbyte = Udr
       Protokoll(zeiger) = Tempbyte                             ' empfangenes Byte in Protokoll ablegen
    
       If Tempbyte = 0 Then                                     ' Protokollende erreicht
          Zeiger = 1                                            ' Protokollzeiger zurücksetzen
       End If
    
       If Protokoll(1) = 27 Then                                ' Wenn Protokollbeginn erkannt
            If Tempbyte = 0 Then                                ' und aktuell empfangenes Byte ist Protokollende
                Flag = 1                                        ' Protokollabarbeitung veranlassen
            End If
    
            Incr Zeiger                                         ' sonst nächste Speicherstelle für Protokoll auswählen
    
       Elseif Protokoll(1) = 35 Then                            ' Wenn Protokollbeginn erkannt
            If Tempbyte = 0 Then                                ' und aktuell empfangenes Byte ist Protokollende
                Flag = 2                                        ' Protokollabarbeitung veranlassen
            End If
    
            Incr Zeiger                                         ' sonst nächste Speicherstelle für Protokoll auswählen
    
       Else
            Zeiger = 1                                          ' Protokoll wieder von vorne beginnen
            Timer0 = 0                                          ' Timer 0 resetten
            Start Timer0                                        ' timer 0 starten
            Enable Timer0                                       ' und Interrupt aktivieren
       End If
    
    Return
    End
    
    
    
    Timer_irq:
       Stop Timer0
       Disable Timer0
       Zeiger = 1
    Return
    End
    
    
    
    Timer_irq2:
    If Init = 1 Then
       Timer1 = 60500
       Toggle Portb.0
    Else
       Portb = 0                                                ' Ports rücksetzen
       Timer1 = 0                                               ' Timer zurücksetzen
       Disable Timer1                                           ' Timer interrupt deaktivieren
       Stop Timer1                                              ' Timer stoppen
       Protokoll(1) = 0
       Protokoll(2) = 0
       Protokoll(3) = 0
       Protokoll(4) = 0
    End If
    
    Return
    End
    
    
    
    Proto:
    
                If Protokoll(2) = Adresse_temp Then             ' prüfen ob diese Platine angesprochen ist
                    Flag = 3
                End If
    
                If Protokoll(2) = 255 Then                      ' prüfen ob alle angesprochen sind
                    Flag = 3
                End If
    
            If Flag = 3 Then                                    ' Ausführung wenn Adresse stimmt oder alle angesprochen sind
                    Flag = Protokoll(3)
    
                If Flag = 64 And Init = 0 Then                  ' Programm verzweigen nach Steuerbyte des Protokolls
                    Portb = Protokoll(4)                        ' Port setzen
    
                    Timer1 = 53036
                    Enable Timer1
                    Start Timer1
                End If
    
    
    ' INITIALISIEREN
    
                If Flag = 72 And Init = 1 Then
                    Init = 0
                    Flag = Protokoll(4)
                    Adresse = Flag                              ' Adresse in EEPROM speichern, wird bei nächstem Reset verwendet
                    Adresse_temp = Protokoll(4)                 ' neue Adresse ab sofort verwenden, auch ohne Reset
                    Portb = 0
                End If
    
            End If
    
    
          Protokoll(1) = 0                                      ' gespeichertes Protokoll löschen
          Protokoll(2) = 0
          Protokoll(3) = 0
          Protokoll(4) = 0
    
    
    
    Return
    End
    
    Scharfschalten:                                             ' Programmteil scharf schalten
    
    If Init = 0 Then
    
            Portb = 0
    
            If Protokoll(2) = 255 Then
                    Flag = 4
    
                If Flag = 4 Then
                     Flag = Protokoll(3)
                End If
    
                If Flag = 64 Then
                     Flag = Protokoll(4)
                End If
    
                If Flag = 0 Then
                     Portd.5 = 0                                'Module unscharf
                     Hot = 0                                    'Status ins eeProm
                End If
    
                If Flag = 1 Then
                     Portd.5 = 1                                'Module scharf
                     Hot = 1                                    'Status ins eeProm
                End If
    
             End If
    
    
    
                 Protokoll(1) = 0                               ' gespeichertes Protokoll löschen
                 Protokoll(2) = 0
                 Protokoll(3) = 0
                 Protokoll(4) = 0
    
    
                 Timer1 = 53036
                 Enable Timer1
                 Start Timer1
    
    End If
    
    Return
    End
    Ich danke euch schon mal im vorraus, für die Hilfe

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Warum definierst du alles mit "------ AT &Hxx" ????
    Was ist mit dem Bereich &H60 - &HA0 ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    09.04.2005
    Ort
    89331 Burgau
    Beiträge
    32
    gerade mal getestet

    wenn ich alle Definitionen weg lasse, ist der Fehler auch weg

    mit den Definitionen kenne ich mich eigentlich nicht aus,
    der Code wurde im Ursprung von einem Bekannten geschrieben
    und ich habe die Def. nur weitergeführt.

    wie muß ich das ungefär anwenden ?
    Brauche ich das überhaupt?

    habs mal geändert auf:

    Code:
    Dim Zeiger As Byte At &H60
    Zeiger = 1
    Dim Flag As Byte At &H62
    Dim Adresse As Eram Byte
    Dim Hot As Eram Byte                                        'Scharfschalt-Status im eeProm
    Dim Adresse_temp As Byte At &H68
    Dim Tempword As Word At &H73
    Adresse_temp = Adresse
    Dim Tempbyte As Byte At &H80
    Dim Tempbyte2 As Byte At &H85
    Dim Init As Byte At &H90
    das geht wieder

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Wie PicNick schon sagte: Lass all die AT &H.. Zusätze weg.
    Absolut unsinnig und unnötig. also so:

    Dim Zeiger As Byte
    Dim Flag As Byte
    Dim Adresse As Eram Byte
    Dim Hot As Eram Byte 'Scharfschalt-Status im eeProm
    Dim Adresse_temp As Byte
    Dim Tempword As Word
    Dim Tempbyte As Byte
    Dim Tempbyte2 As Byte
    Dim Init As Byte

    Zeiger = 1
    Adresse_temp = Adresse

    Einzige Ausnahme und genau das hast du es nicht:

    Dim Adresse As Eram Byte at &H01
    Dim Hot As Eram Byte at &H02

    Damit lässt du die Position 0 im EEPROM frei, die beim Resetten überschrieben werden kann.

    Lass auch das $PROG am Anfang weg. Damit schreibst du die Fuse bits immer wieder neu.

    Gruß

    Rolf

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    09.04.2005
    Ort
    89331 Burgau
    Beiträge
    32
    Vielen Dank für eure Hilfe, ihr habt meinen Tag um einiges verbessert
    ich tüftle schon seit gestern dran rum, was ich aber nicht verstehe
    die letzten 4 Wochen ist kein Fehler gekommen

    habe die Definitonen jetzt weggelassen und bei den Erams dazugefügt

    die Fusebits ist für mich praktischer dann kann ich gleich ein paar Stück nacheinander beschreiben ohne die Fuses neu zu setzen

    gruß Gerhard

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Fehler abhängig von der Bascom-Version:
    Ich nehme an (sollte man aber anhand der reports beweisen), daß die neue Version andere Defaultwerte für Stack und Frame verwendet.
    (das sind die Bereiche, die von oben am SRAM knabbern).
    Wenn deine Definitionen (von unten) sich mit diesen in der Mitte des SRAM treffen, schnackelt es.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Ich hatte auch schon mal festgestellt, dass in 1.11.9.3 nach dem Neukompilieren 2 Byte weniger im SRAM frei waren, als in der Version 1.11.9.0. Nur kann ich nicht sagen, ob das generell so ist oder nur unter bestimmten Bedingungen.
    Da kann man dann schon einmal Pech haben.

    Gruß

    Rolf

Berechtigungen

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