Going OLD-School with Assembler


Ok, Seit ein paar Tagen bin ich stolzer Besitzer eines Dev-Kits für einen C8051F930 von Silicon Labs.
Da ich mir das Teil für die Technikerschule angeschafft habe musste ich gleich mal ein wenig damit Spielen. In der Technikerschule arbeiten wir zwar mit einem Anderen Prozessortyp (Infineon SAB80C517) aber der Kern ist derselbe ein 8051.
Somit kann man das Board zum üben verwenden, man muss allerdings aufpassen das man mit den Registernamen sowie den Eigenheiten nicht durcheinander kommt.
Beim 80C517 gibt es bspw. einen Watchdog den man in Assembler mittels

SETB WDT
SETB SWDT

bedienen muss. Beim C8051F930 geschieht dies anders.
Des Weiteren wurde bei dem Dev-Kit eine „Vollversion“ von Keil µVision V4 mitgeliefert.
Die Vollversion bezieht sich allerdings nur auf die µCs von Silicon Labs, was durchaus verständlich ist.
Zum Spielen hab ich mir mal 2 Programme geschrieben und deren Footprint im Flash des µCs gegenübergestellt.
Die Programme schalten jeweils nur die LED die am Portpin 1.6 angeschlossen ist ein und gehen dann in eine Dauerschleife.
Zuerst die Assemblerversion:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Name Test
; Description: Turn on the LED connected to PortPIN 1.6
; Author: Manuel Koenig
; Date: 03.03.2014

$include(C8051F930.INC)

CSEG AT 0000h

MOV P1MDIN,#60h ;// P1.5, P1.6 are digital
MOV P1MDOUT,#60h ;// P1.5, P1.6 are push-pull
MOV XBR2,#40h ;// Enable crossbar and
;// enable weak pull-ups

;// High = LED Off, Low = LED On
MOV P1,#0FFh ;// Turn off all LEDs
CLR P1.6 ;// Turn on LED on Portpin 1.6

endlos: JMP endlos
END

Assembler footprint im Flash
1
2
3
4
5
6
C:0x0000 75F260 MOV P1MDIN(0xF2),#0x60
C:0x0003 75A560 MOV P1MDOUT(0xA5),#0x60
C:0x0006 75E340 MOV XBR2(0xE3),#0x40
C:0x0009 7590FF MOV P1(0x90),#VDM0CN(0xFF)
C:0x000C C296 CLR 0x90.6
C:0x000E 80FE SJMP C:000E

Hier das C Programm:

C-Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <compiler_defs.h> // compiler declarations
#include <C8051F930_defs.h> // SFR declarations

SBIT (YELLOW_LED, SFR_P1, 6); // ‚0‘ means ON, ‚1‘ means OFF
#define LED_ON 0

void main (void)
{
P0MDIN |= 0x0C; // P0.2, P0.3 are digital
P1MDIN |= 0x60; // P1.5, P1.6 are digital

P0MDOUT &= ~0x0C; // P0.2, P0.3 are open-drain
P1MDOUT |= 0x60; // P1.5, P1.6 are push-pull

XBR2 = 0x40; // Enable crossbar and enable
// weak pull-ups
YELLOW_LED = LED_ON; // Turn on the LED on Portpin 1.6

while (1) {} // Spin forever
}

Assembler footprint im Flash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:0x0000 020016 LJMP C:0016
C:0x0003 43F10C ORL P0MDIN(0xF1),#0x0C
C:0x0006 43F260 ORL P1MDIN(0xF2),#0x60
C:0x0009 53A4F3 ANL P0MDOUT(0xA4),#0xF3
C:0x000C 43A560 ORL P1MDOUT(0xA5),#0x60
C:0x000F 75E340 MOV XBR2(0xE3),#0x40
C:0x0012 C296 CLR YELLOW_LED(0x90.6)
C:0x0014 80FE SJMP C:0014
C:0x0016 787F MOV R0,#0x7F
C:0x0018 E4 CLR A
C:0x0019 F6 MOV @R0,A
C:0x001A D8FD DJNZ R0,C:0019
C:0x001C 758107 MOV 0x81,#0x07
C:0x001F 020003 LJMP C:0003
.
.
.

Wie man sieht hat man bei C einen deutlichen Overhead, daher sollte man bei begrenztem Speicher, hier max. 64kB (-Variablen, -Stack,-etc.) auf Assembler zurückgreifen.
Wer möchte kann die beiden Programme gerne runterladen und selbst ausprobieren sofern Ihr das Dev-Kit habt.

Test_ASM.zip Test_C.zip