Hilfe beim Sketch verkleinern

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ß" :wink:
Beste Grüße
Rudi