PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bin am verzweifeln mit out of sram space



graffiti
09.04.2009, 12:14
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:



$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

PicNick
09.04.2009, 12:37
Warum definierst du alles mit "------ AT &Hxx" ????
Was ist mit dem Bereich &H60 - &HA0 ?

graffiti
09.04.2009, 12:49
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:


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

for_ro
09.04.2009, 13:13
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

graffiti
09.04.2009, 13:22
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

PicNick
09.04.2009, 13:35
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.

for_ro
09.04.2009, 14:35
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