Ich möchte mal sagen: Eine gute Teamleistung!
und
Eine interessante, spannende, Frage.
Das sehe ich genau so.
Vor allen Dingen, weil die letzte combie-Version ebenfalls funktionierte und noch mal wieder einiges an FLASH einsparte:
Der Sketch verwendet 244 Bytes (11%) des Programmspeicherplatzes. Das Maximum sind 2048 Bytes.
Globale Variablen verwenden 18 Bytes (14%) des dynamischen Speichers, 110 Bytes für lokale Variablen verbleiben. Das Maximum sind 128 Bytes.
Nun denn, die obigen Hinweise auf Assembler sind genau diejenigen gewesen, die mir auch vorschwebten. Also bin ich hingegangen, habe den *.HEX-Output von meinen Disassembler entflechten lassen und das ganze Programm etwas (sofern es meine Zeit erlaubte) untersucht. Einige Zuordnungen der einzelnen C++-Zeilen konnte ich (noch) nicht genau identifizieren. Mir fehlt einfach die Zeit für nähere Beschäftigung damit. Dennoch zeigt es, dass noch eine gute Hand voll Bytes drin sitzen. Wahrscheinlich würde es noch sparsamer im FLASH werden, wenn man so etwas direkt in Assembler anfängt.
Egal, den Code habe ich hier eingebunden. Sieht wahrscheinlich wie Kauderwelsch aus und ist noch nicht optimal kommentiert:
;***********************************************************
;17 LEDs an AT Tiny 2313 bei 8 MHz
;-----------------------------------------------------------
;Idee: "Floetzinger" (Member Forum Arduino.CC)
;Optimierung: "conbie" & "RudiDL5" (Menber Forum Arduino.CC)
;***********************************************************
;defines
;--------------------------------------------
.equ SREG = 0x3F
.equ RAMSTART = 0x0060
.equ DDRB = 0x17
.equ DDRD = 0x11
.equ DDRA = 0x1A
.equ schwelleB = 8
.equ schwelleD = 7
;datasegment
;--------------------------------------------
.dseg
.org RAMSTART
zeitMerk: .byte 1
ledTime: .byte 17
;codesegment
;--------------------------------------------
.cseg
.org 0
pwron: RJMP resvect
progmem: .dw 0x3C19 ; 60; 25;
.dw 0x284B ; 40; 75;
.dw 0x215A ; 33; 90;
.dw 0x3918 ; 57; 24;
.dw 0x6444 ; 100; 68;
.dw 0x4950 ; 73; 80;
.dw 0x254B ; 37; 75;
.dw 0xFE61 ; 254; 97;
.dw 0x6900 ; 105; 0;
resvect: CLR r1 ; SREG
OUT SREG, r1 ; "
LDI r26, LOW(RAMSTART)
LDI r27, HIGH(RAMSTART)
;main
;--------------------------------------------
SER r24 ; DDRB = 0b11111111
OUT DDRB, r24 ; "
LDI r24, 0x7F ; DDRD = 0b01111111
OUT DDRD, r24 ; "
LDI r24, 0x03 ; DDRA = 0b00000011
OUT DDRA, r24 ; "
;while
;--------------------------------------------
LDI r20, 0x01
LDI r21, 0x00
while1: LDI r26, 0x61
LDI r27, 0x00
LDI r24, 0x00
LDI r25, 0x00
;for
;--------------------------------------------
L_006E: LDS r19, zeitMerk ; diff = zeitMerk - ledTime[LED]
MOV r18, r24 ; "
MOVW r31:r30, r25:r24 ; " (berechnet zeiger auf progmem-
SUBI r30, 0xFE ; " adressen für "Z" OHNE isr-vectoren)
SBCI r31, 0xFF ; "
LPM r30, Z ; takt = pgm_read_byte( &ledTakt[LED] )
LD r22, X ; "
MOV r23, r19 ; "
SUB r23, r22 ; "
CP r23, r30 ; if( diff >= takt )
BRCS next ; ...
ST X, r19 ; if( bit < schwelleB )
CPI r24, schwelleB ; ...
CPC r25, r1 ;
BRCC L_00A0 ;
MOVW r23:r22, r21:r20 ;
MOV r0, r24 ;
RJMP L_0098 ;
L_0094: LSL r22 ;
ROL r23 ;
L_0098: DEC r0 ;
BRPL L_0094 ;
OUT 0x16, r22 ; schreibt BIT nach PORT B
RJMP next ; continue
L_00A0: LDI r19, 0xF8 ; if( bit < schwelleD )
ADD r19, r24 ; ...
CPI r19, schwelleD ;
BRCC L_00B8 ;
MOVW r23:r22, r21:r20 ;
RJMP L_00B0 ;
L_00AC: LSL r22 ;
ROL r23 ;
L_00B0: DEC r19 ;
BRPL L_00AC ;
OUT 0x10, r22 ; schreibt BIT nach PORT D
RJMP next ; continue
L_00B8: SUBI r18, 0x0F ;
MOVW r23:r22, r21:r20 ;
RJMP L_00C2 ;
L_00BE: LSL r22 ;
ROL r23 ;
L_00C2: DEC r18 ;
BRPL L_00BE ;
OUT 0x19, r22 ; schreibt BIT nach Port A
next: ADIW r25:r24, 0x01 ; "next" FOR ?
ADIW r27:r26, 0x01 ; "
CPI r24, 0x11 ; "
CPC r25, r1 ; "
BRNE L_006E ; "
;_delay_ms(99)
;--------------------------------------------
del99: LDI r23, 0xBF
LDI r24, 0x6A
LDI r25, 0x02
del99_1: SUBI r23, 0x01
SBCI r24, 0x00
SBCI r25, 0x00
BRNE del99_1
;zeitMerker++
;--------------------------------------------
LDS r24, zeitMerk
SUBI r24, 0xFF
STS zeitMerk, r24
;end of while(1)
;--------------------------------------------
RJMP while1
Aber was solls? Das Programm wurde noch mal kürzer:
;-------------------------------------
;Alles Okay, keine Fehler vorhanden
;Bytes .CSEG: 178 von max. 2048
;Bytes .DSEG: 18 von max. 128
;Bytes .ESEG: 0 von max. 128
;-------------------------------------
2738 Bytes zu 178 Bytes FLASH
262 Bytes zu 18 Bytes SRAM
So viel zum Thema "Hilfe mein Sketch ist zu groß" ![]()
Beste Grüße
Rudi