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