BoondockDuck
09.09.2008, 20:52
Hi
ich habe einen Code der eigentlich auch funktioniert.
Wollte ihn jetzt auf einen Attiny2313 schreiben, nur dummerweise reicht der SRAM nicht aus.
Vor allem das 'config dcf' scheint ausschlaggebend zu sein. Gibt es irgendwo eine Angabe wieviel SRAM 'config dcf' verschlingt?
Besteht noch Hoffnung den Code so abzuändern dass es passt?
Beim Complieren sagt er bereits bei "Dim Dig0 As Byte , Dig1 As Byte..." er seit out of SRAM.
$regfile = "attiny2313.dat"
$crystal = 1000000
Config Dcf77 = Pinb.3 , Timer = 1 , Debug = 1 , Inverted = 1 , Timer1sec = 1 , Check = 1
Config Timer0 = Timer , Prescale = 1 , Edge = Rising
Config Date = Dmy , Separator = .
Config Portb.0 = Output ' din
Config Portb.1 = Output ' cs
Config Portb.2 = Output ' clk
Max_din Alias Portb.0
Max_cs Alias Portb.1
Max_clk Alias Portb.2
Set Max_din ' cs, din, clk = high
Set Max_cs
Set Max_clk
Dim Ausgabe As String * 8
Ausgabe = "_-HELP-_"
Dim I As Integer
Dim Sec_old As Byte , Dcfsec_old As Byte
Dim Merker As Byte
Declare Sub Max7221datenout(daten As Word)
Declare Sub Max7221zeichenlesen
Declare Sub Max7221init
Dim Led_operation As Word
Dim Dig0 As Byte , Dig1 As Byte , Dig2 As Byte , Dig3 As Byte , Dig4 As Byte , Dig5 As Byte , Dig6 As Byte , Dig7 As Byte
Gosub Max7221init
Gosub Max7221zeichenlesen
Enable Interrupts
Dim Zaehler As Byte
Zaehler = 0
Sec_old = 99 : Dcfsec_old = 99 ': DCF_Debug_Timer = 0
Do
For I = 1 To 78 'vorher 78
Waitms 10
If Sec_old <> _sec Then
Exit For
End If
If Dcfsec_old <> Dcf_sec Then
Exit For
End If
Next
Waitms 220
Sec_old = _sec
If Dcf_sec <> Dcfsec_old Then Gosub Led
Dcfsec_old = Dcf_sec
If _sec = 50 And Merker = 0 Then Gosub Schaltsekunde 'Softuhr ist 3 Sec. zu schnell
If _sec > 55 Then Merker = 0
If Zaehler <= 8 Then
Ausgabe = Time$
Dig7 = &B01100110
Else
Ausgabe = Date$
Dig7 = &B01001000
End If
Incr Zaehler
If Zaehler = 11 Then Zaehler = 0
Gosub Max7221zeichenlesen
Loop
Schaltsekunde:
Merker = 1
_sec = _sec - 3
Return
Led:
'Toggle Portc.0
Return
End 'end program
Sub Max7221zeichenlesen
Dim Db_zeiger As Word
Dim Tl As Byte
Dim Ez As Byte
Dim Dat(8) As Byte
Dim Einzelzeichen As String * 1
Tl = Len(ausgabe)
Dim A As Byte , B As Byte
B = 1
For A = 1 To Tl
Einzelzeichen = Mid(ausgabe , A , 1)
Ez = Asc(einzelzeichen)
Select Case Ez
Case 32 : Db_zeiger = 0
Case 45 : Db_zeiger = 1
Case 48 : Db_zeiger = 2
Case 49 : Db_zeiger = 3
Case 50 : Db_zeiger = 4
Case 51 : Db_zeiger = 5
Case 52 : Db_zeiger = 6
Case 53 : Db_zeiger = 7
Case 54 : Db_zeiger = 8
Case 55 : Db_zeiger = 9
Case 56 : Db_zeiger = 10
Case 57 : Db_zeiger = 11
Case 69 : Db_zeiger = 12
Case 72 : Db_zeiger = 13
Case 76 : Db_zeiger = 14
Case 80 : Db_zeiger = 15
Case 95 : Db_zeiger = 16
Case Else Db_zeiger = 0
End Select
Dat(b) = Lookup(db_zeiger , Zeichensatz)
Incr B
Next A
B = 8
For A = 0 To 7
Dig0.a = Dat(b).6
Dig1.a = Dat(b).5
Dig2.a = Dat(b).4
Dig3.a = Dat(b).3
Dig4.a = Dat(b).2
Dig5.a = Dat(b).1
Dig6.a = Dat(b).0
Decr B
Next A
Led_operation = &B0000000100000000 + Dig0 'dig0
Call Max7221datenout(led_operation)
Led_operation = &B0000001000000000 + Dig1 'dig1
Call Max7221datenout(led_operation)
Led_operation = &B0000001100000000 + Dig2 'dig2
Call Max7221datenout(led_operation)
Led_operation = &B0000010000000000 + Dig3 'dig3
Call Max7221datenout(led_operation)
Led_operation = &B0000010100000000 + Dig4 'dig4
Call Max7221datenout(led_operation)
Led_operation = &B0000011000000000 + Dig5 'dig5
Call Max7221datenout(led_operation)
Led_operation = &B0000011100000000 + Dig6 'dig6
Call Max7221datenout(led_operation)
Led_operation = &B0000100000000000 + Dig7 'dig7
Call Max7221datenout(led_operation)
Return
End Sub
Sub Max7221init
Led_operation = &B0000110000000000 ' shutdown mode normal operation
Call Max7221datenout(led_operation)
Led_operation = &B0000110000000001 ' shutdown mode normal operation
Call Max7221datenout(led_operation)
Led_operation = &B0000100100000000 ' decode mode code b for digit 7-0
Call Max7221datenout(led_operation)
Led_operation = &B0000101000000000 ' intensity | &H0A01 = 2/16 | &H0A09 = 10/16 | &H0A0F = 15/16(max on)
Call Max7221datenout(led_operation)
Led_operation = &B0000101100000111 ' scan limit digit 0-7
Call Max7221datenout(led_operation)
Return
End Sub
Sub Max7221datenout(daten As Word)
Max_cs = 0
Shiftout Max_din , Max_clk , Daten , 1 , 16
Max_cs = 1
Waitms 10
End Sub
Zeichensatz: 'Segment A,B,C,D,E,F,G - sortiert nach ASCII
Data 0 'SPACE DEC32
Data 1 '- DEC45
Data 126 '0 DEC48
Data 48 '1 DEC49
Data 109 '2 DEC50
Data 121 '3 DEC51
Data 51 '4 DEC52
Data 91 '5 DEC53
Data 95 '6 DEC54
Data 112 '7 DEC55
Data 127 '8 DEC56
Data 115 '9 DEC57
Data 79 'E DEC69
Data 55 'H DEC72
Data 14 'L DEC76
Data 103 'P DEC80
Data 8 '_ DEC95
ich habe einen Code der eigentlich auch funktioniert.
Wollte ihn jetzt auf einen Attiny2313 schreiben, nur dummerweise reicht der SRAM nicht aus.
Vor allem das 'config dcf' scheint ausschlaggebend zu sein. Gibt es irgendwo eine Angabe wieviel SRAM 'config dcf' verschlingt?
Besteht noch Hoffnung den Code so abzuändern dass es passt?
Beim Complieren sagt er bereits bei "Dim Dig0 As Byte , Dig1 As Byte..." er seit out of SRAM.
$regfile = "attiny2313.dat"
$crystal = 1000000
Config Dcf77 = Pinb.3 , Timer = 1 , Debug = 1 , Inverted = 1 , Timer1sec = 1 , Check = 1
Config Timer0 = Timer , Prescale = 1 , Edge = Rising
Config Date = Dmy , Separator = .
Config Portb.0 = Output ' din
Config Portb.1 = Output ' cs
Config Portb.2 = Output ' clk
Max_din Alias Portb.0
Max_cs Alias Portb.1
Max_clk Alias Portb.2
Set Max_din ' cs, din, clk = high
Set Max_cs
Set Max_clk
Dim Ausgabe As String * 8
Ausgabe = "_-HELP-_"
Dim I As Integer
Dim Sec_old As Byte , Dcfsec_old As Byte
Dim Merker As Byte
Declare Sub Max7221datenout(daten As Word)
Declare Sub Max7221zeichenlesen
Declare Sub Max7221init
Dim Led_operation As Word
Dim Dig0 As Byte , Dig1 As Byte , Dig2 As Byte , Dig3 As Byte , Dig4 As Byte , Dig5 As Byte , Dig6 As Byte , Dig7 As Byte
Gosub Max7221init
Gosub Max7221zeichenlesen
Enable Interrupts
Dim Zaehler As Byte
Zaehler = 0
Sec_old = 99 : Dcfsec_old = 99 ': DCF_Debug_Timer = 0
Do
For I = 1 To 78 'vorher 78
Waitms 10
If Sec_old <> _sec Then
Exit For
End If
If Dcfsec_old <> Dcf_sec Then
Exit For
End If
Next
Waitms 220
Sec_old = _sec
If Dcf_sec <> Dcfsec_old Then Gosub Led
Dcfsec_old = Dcf_sec
If _sec = 50 And Merker = 0 Then Gosub Schaltsekunde 'Softuhr ist 3 Sec. zu schnell
If _sec > 55 Then Merker = 0
If Zaehler <= 8 Then
Ausgabe = Time$
Dig7 = &B01100110
Else
Ausgabe = Date$
Dig7 = &B01001000
End If
Incr Zaehler
If Zaehler = 11 Then Zaehler = 0
Gosub Max7221zeichenlesen
Loop
Schaltsekunde:
Merker = 1
_sec = _sec - 3
Return
Led:
'Toggle Portc.0
Return
End 'end program
Sub Max7221zeichenlesen
Dim Db_zeiger As Word
Dim Tl As Byte
Dim Ez As Byte
Dim Dat(8) As Byte
Dim Einzelzeichen As String * 1
Tl = Len(ausgabe)
Dim A As Byte , B As Byte
B = 1
For A = 1 To Tl
Einzelzeichen = Mid(ausgabe , A , 1)
Ez = Asc(einzelzeichen)
Select Case Ez
Case 32 : Db_zeiger = 0
Case 45 : Db_zeiger = 1
Case 48 : Db_zeiger = 2
Case 49 : Db_zeiger = 3
Case 50 : Db_zeiger = 4
Case 51 : Db_zeiger = 5
Case 52 : Db_zeiger = 6
Case 53 : Db_zeiger = 7
Case 54 : Db_zeiger = 8
Case 55 : Db_zeiger = 9
Case 56 : Db_zeiger = 10
Case 57 : Db_zeiger = 11
Case 69 : Db_zeiger = 12
Case 72 : Db_zeiger = 13
Case 76 : Db_zeiger = 14
Case 80 : Db_zeiger = 15
Case 95 : Db_zeiger = 16
Case Else Db_zeiger = 0
End Select
Dat(b) = Lookup(db_zeiger , Zeichensatz)
Incr B
Next A
B = 8
For A = 0 To 7
Dig0.a = Dat(b).6
Dig1.a = Dat(b).5
Dig2.a = Dat(b).4
Dig3.a = Dat(b).3
Dig4.a = Dat(b).2
Dig5.a = Dat(b).1
Dig6.a = Dat(b).0
Decr B
Next A
Led_operation = &B0000000100000000 + Dig0 'dig0
Call Max7221datenout(led_operation)
Led_operation = &B0000001000000000 + Dig1 'dig1
Call Max7221datenout(led_operation)
Led_operation = &B0000001100000000 + Dig2 'dig2
Call Max7221datenout(led_operation)
Led_operation = &B0000010000000000 + Dig3 'dig3
Call Max7221datenout(led_operation)
Led_operation = &B0000010100000000 + Dig4 'dig4
Call Max7221datenout(led_operation)
Led_operation = &B0000011000000000 + Dig5 'dig5
Call Max7221datenout(led_operation)
Led_operation = &B0000011100000000 + Dig6 'dig6
Call Max7221datenout(led_operation)
Led_operation = &B0000100000000000 + Dig7 'dig7
Call Max7221datenout(led_operation)
Return
End Sub
Sub Max7221init
Led_operation = &B0000110000000000 ' shutdown mode normal operation
Call Max7221datenout(led_operation)
Led_operation = &B0000110000000001 ' shutdown mode normal operation
Call Max7221datenout(led_operation)
Led_operation = &B0000100100000000 ' decode mode code b for digit 7-0
Call Max7221datenout(led_operation)
Led_operation = &B0000101000000000 ' intensity | &H0A01 = 2/16 | &H0A09 = 10/16 | &H0A0F = 15/16(max on)
Call Max7221datenout(led_operation)
Led_operation = &B0000101100000111 ' scan limit digit 0-7
Call Max7221datenout(led_operation)
Return
End Sub
Sub Max7221datenout(daten As Word)
Max_cs = 0
Shiftout Max_din , Max_clk , Daten , 1 , 16
Max_cs = 1
Waitms 10
End Sub
Zeichensatz: 'Segment A,B,C,D,E,F,G - sortiert nach ASCII
Data 0 'SPACE DEC32
Data 1 '- DEC45
Data 126 '0 DEC48
Data 48 '1 DEC49
Data 109 '2 DEC50
Data 121 '3 DEC51
Data 51 '4 DEC52
Data 91 '5 DEC53
Data 95 '6 DEC54
Data 112 '7 DEC55
Data 127 '8 DEC56
Data 115 '9 DEC57
Data 79 'E DEC69
Data 55 'H DEC72
Data 14 'L DEC76
Data 103 'P DEC80
Data 8 '_ DEC95