- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Codefehler?E-Bauteil shrott? Bitte Helfen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.11.2005
    Ort
    Burscheid
    Alter
    33
    Beiträge
    20

    Codefehler?E-Bauteil shrott? Bitte Helfen

    Anzeige

    E-Bike
    Hi,
    das Programm funst net (RP5):

    Hier mal der Zusammenhängende Prog. Code (war ursprünglich der Beispielcode zur Batteriespannung den ich auf die Basiserweiterung (8 statt 4 LED's umgeprogt habe):
    IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIII
    'IIIIIIIIII MOBILE ROBOT EVALUATION PROGRAM IIIIIIIIIIII
    'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIII
    '... (ich hab ma die Erklärung des Programs und Portdefines rausgenommen)...
    '---------- INIT---------------
    SYS PLM_SLOW:gosub SUBSYS_PWR_ON:REV_L=off:REV_R=off
    beep 368,10,0ause 50
    PGM=1


    '--------------------------------------------
    '--- SPANNUNGSÜBERWACHUNG FÜR DEN AKKU ---
    '--------------------------------------------
    gosub LEDSOFF
    SPEED_L=20:SPEED_R=20
    #WATCH_AKKU
    if SYS_VOLTS > 189 then goto L8ON
    if SYS_VOLTS > 184 then goto L8BLINK
    if SYS_VOLTS > 179 then goto L7ON
    if SYS_VOLTS > 173 then goto L7BLINK
    if SYS_VOLTS > 168 then goto L6ON
    if SYS_VOLTS > 163 then goto L6BLINK
    if SYS_VOLTS > 158 then goto L5ON
    if SYS_VOLTS > 153 then goto L5BLINK
    if SYS_VOLTS > 146 then goto L4ON
    if SYS_VOLTS > 141 then goto L4BLINK
    if SYS_VOLTS > 136 then goto L3ON
    if SYS_VOLTS > 130 then goto L3BLINK
    if SYS_VOLTS > 125 then goto L2ON
    if SYS_VOLTS > 119 then goto L2BLINK
    if SYS_VOLTS > 114 then goto L1ON
    if SYS_VOLTS > 109 then goto L1BLINK

    goto WATCH_AKKU
    #L8ON
    gosub LED1ON:gosub LED2ON:gosub LED3ON:gosub LED4ON:gosub LED5ON:gosub LED6ON:gosub LED7ON
    gosub LED8ON:goto WATCH_AKKU
    #L8BLINK
    gosub LED1ON:gosub LED2ON:gosub LED3ON:gosub LED4ON:gosub LED5ON:gosub LED6ON:gosub LED7ON
    gosub LED8ONause 20:gosub L8OFFause 20:goto WATCH_AKKU
    #L7ON
    gosub LED1ON:gosub LED2ON:gosub LED3ON:gosub LED4ON:gosub LED5ON:gosub LED6ON
    gosub LED7ON:goto WATCH_AKKU
    #L7BLINK
    gosub LED1ON:gosub LED2ON:gosub LED3ON:gosub LED4ON:gosub LED5ON:gosub LED6ON
    gosub LED7ONause 20:gosub L7OFFause 20:goto WATCH_AKKU
    #L6ON
    gosub LED1ON:gosub LED2ON:gosub LED3ON:gosub LED4ON:gosub LED5ON:gosub LED6ON
    goto WATCH_AKKU
    #L6BLINK
    gosub LED1ON:gosub LED2ON:gosub LED3ON:gosub LED4ON:gosub LED5ON
    gosub LED6ONause 20:gosub L6OFFause 20:goto WATCH_AKKU
    #L5ON
    gosub LED1ON:gosub LED2ON:gosub LED3ON:gosub LED4ON
    gosub L5ON:goto WATCH_AKKU
    #L5BLINK
    gosub L1ON:gosub L2ON:gosub L3ON:gosub L4ON
    gosub L5ONause 20:gosub L5OFFause 20:goto WATCH_AKKU
    #L4ON
    gosub L1ON:gosub L2ON:gosub L3ON
    gosub L4ON:goto WATCH_AKKU
    #L4BLINK
    gosub L1ON:gosub L2ON:gosub L3ON
    gosub L4ONause 20:gosub L4OFFause 20:goto WATCH_AKKU
    #L3ON
    gosub L1ON:gosub L2ON
    gosub L3ON:goto WATCH_AKKU
    #L3BLINK
    gosub L1ON:gosub L2ON
    gosub L3ONause 20:gosub L3OFFause 20:goto WATCH_AKKU
    #L2ON
    gosub L1ON:gosub L2ON:goto WATCH_AKKU
    #L2BLINK
    gosub L1ON
    gosub L2ONause 20:gosub L2OFFause 20:goto WATCH_AKKU
    #L1ON
    gosub L1ON:goto WATCH_AKKU
    #L1BLINK
    gosub L1ONause 20:gosub L1OFFause 20:goto WATCH_AKKU


    'IIIIIIIIIII LED DRIVER IIIIIIIIIIIIIIIII
    #LED1ON
    L1_F=on:goto EXTPORT_WRITE
    #L1OFF
    L1_F=off :goto EXTPORT_WRITE
    #LED2ON
    L2_F=on:goto EXTPORT_WRITE
    #L2OFF
    L2_F=off:goto EXTPORT_WRITE
    #LED3ON
    L3_F=on:goto EXTPORT_WRITE
    #L3OFF
    L3_F=off:goto EXTPORT_WRITE
    #LED4ON
    L4_F=on:goto EXTPORT_WRITE
    #L4OFF
    L4_F=off:goto EXTPORT_WRITE
    #LED5ON
    L5_F=on:goto EXTPORT_WRITE
    #L5OFF
    L5_F=off :goto EXTPORT_WRITE
    #LED6ON
    L6_F=on:goto EXTPORT_WRITE
    #L6OFF
    L6_F=off:goto EXTPORT_WRITE
    #LED7ON
    L7_F=on:goto EXTPORT_WRITE
    #L7OFF
    L7_F=off:goto EXTPORT_WRITE
    #LED8ON
    L8_F=on:goto EXTPORT_WRITE
    #L8OFF
    L8_F=off:goto EXTPORT_WRITE
    #LEDSOFF
    EXTPORT=EXTPORT and &H0F:goto EXTPORT_WRITE
    #EXTPORT_WRITE
    SYS SYSTEMulse STROBE:RETURN

    'IIIIII SYSTEMROUTINEN COMM/NAV SYSTEM IIIII
    #GET_IRDATA
    SUBCMD=1:sys COMNAV:return
    #SEND_IRDATA
    SUBCMD=0:sys COMNAV:return
    #RC5
    SUBCMD=4:sys COMNAV:LBYTE= HBYTE and &HFC
    HBYTE=00:SUBCMD=2:sys COMNAV:return
    #RC5_INT
    SUBCMD=4:sys COMNAV:LBYTE= (HBYTE and &HFE)or 2
    HBYTE=00:SUBCMD=2:sys COMNAV:return
    #REC80
    SUBCMD=4:sys COMNAV:LBYTE= (HBYTE or &H01)and&HFD
    HBYTE=00:SUBCMD=2:sys COMNAV:return
    #REC80_INT
    SUBCMD=4:sys COMNAV:LBYTE= (HBYTE or &H03)
    HBYTE=00:SUBCMD=2:sys COMNAV:return
    'IIIIII SYSTEMROUTINEN SYSTEM IIIIIIIIIIII
    #NO_ACS_INT
    SUBCMD=4:sys COMNAV:LBYTE= HBYTE and &HFB
    HBYTE=00:SUBCMD=2:sys COMNAV:return
    #ACS_INT_200
    SUBCMD=4:sys COMNAV:LBYTE= HBYTE or &H04
    HBYTE=50:SUBCMD=2:sys COMNAV:return
    #SUBSYS_PWR_ON
    sdio=on:sclio=on:strobe=off:EXTPORT=(EXTPORT and &HFE)or 8
    sys SYSTEM:return
    #SUBSYS_PWR_OFF
    EXTPORT=(EXTPORT and &HF7)or 1:sys SYSTEM
    deact sdio:deact sclio:return


    #CLR_DISTANCE
    SUBCMD=3:sys COMNAV:return
    #L_DISTANCE
    SUBCMD=6:sys COMNAV:return
    #R_DISTANCE
    SUBCMD=7:sys COMNAV:return
    '---------COM/NAV GERÄTEREIBER -------------
    'syscode "p5driv.s19"
    Zur zusätzlichen Erklärung: mit ' vorangehende Zeilen wwerden grau hinterlegt und sind nicht Coderelevant....

    Es kann übrigens, auch sein, das nen Elektirisches Bauteil auf der Platine schrott ist, da ich beim laden den Roby ausversehen mal ausgeschaltet habn, bitte gebt eure meinung dazu ab....

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    sag doch mal genau, was es nicht tut und was es GENAU tun sollte. kurzer pseudocode oder so. ich kann mir gut vorstellen, dass einige leute dir helfen könnten, aber von der codemenge abgeschreckt werden.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.11.2005
    Ort
    Burscheid
    Alter
    33
    Beiträge
    20
    Zitat Zitat von Goblin
    sag doch mal genau, was es nicht tut und was es GENAU tun sollte. kurzer pseudocode oder so. ich kann mir gut vorstellen, dass einige leute dir helfen könnten, aber von der codemenge abgeschreckt werden.
    JA, es soll halt die Bateriespannung mit den 8 LED's wiedergeben...
    Nun, das laden auf den Robo klappt, auch , das die Motoren Strom auf Stufe 20 bekommen (das die sich gerade noch nicht bewegen) aber es leuten keine Leds (auch mit zus. ext. Stromversorgung nicht)... aber mit der ext. Stromversorgung müssten Eigendlich alle Led's leuchten...
    so, ich hoffe, ich konnte es euch genug erklären...
    MFG
    RoboterStef

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo RoboterStef,

    wo wird denn SYS_VOLTS in deinen Programm gesetzt?
    Ich sehe nur Abfragen, oder ist SYS_VOLTS eine Funktion?

    Gruß Peter

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    10.11.2005
    Ort
    Burscheid
    Alter
    33
    Beiträge
    20
    Sorry, hate aus codlängengründen den teil ausgeschnitten:
    '--------------------------
    '------ I/O PORTS ---------
    '--------------------------
    '- INTERFACE LCD/EXTPORT --
    define sdio port[1]
    define sclio port[3]
    define strobe port[4]
    '-- INTERFACE COM/NAV -----
    define DATALINE port[1]
    define CLOCKLINE port[2]
    '--------------------------
    '------ SENSORS ---------
    '--------------------------
    define LIGHT_L ad[7]
    define LIGHT_R ad[6]
    define SYS_VOLTS ad[3]
    define CHRG_CURRENT ad[2]
    define SYS_CURRENT ad[1]
    define MIC ad[4]
    define TOUCH ad[5]
    '---------------------------
    '------ DRIVE -------------
    '---------------------------
    define SPEED_L da[1]
    define SPEED_R da[2]
    define REV_L port[6]
    define REV_R port[5]
    '--------------------------
    '---- SYSTEM MEMORY -------
    '--------------------------
    '--- INTERFACE BUFFER ----
    define LBYTE byte[1]
    define HBYTE byte[2]
    define SUBCMD byte[3]
    '---- OPERATION DATA ------
    define EXTPORT byte[4]
    define LED1_F bit[29]
    define LED2_F bit[30]
    define LED3_F bit[31]
    define LED4_F bit[32]
    define SYSTEM_STATUS byte[5]
    define LEDPORT byte[6]
    define L1_F bit[41]
    define L2_F bit[42]
    define L3_F bit[43]
    define L4_F bit[44]
    define L5_F bit[45]
    define L6_F bit[46]
    define L7_F bit[47]
    define L8_F bit[48]
    '--------------------------
    '---- USER MEMORY -------
    '--------------------------
    define SVOLTS byte[6]
    define PGM byte[7]
    '--- SYSTEMROUTINEN -----------
    define PLM_SLOW &H01C4
    define SYSTEM &H01C9
    define COMNAV &H0154
    '- ERWEITERTE SYSTEM ROUTINEN -
    define REVR &H0101 'ANTRIEB RECHTS RÜCKWÄRTS
    define REVL &H0106 'ANTRIEB LINKS RÜCKWÄRTS
    define FWDR &H010B 'ANTRIEG RECHTS VORWÄRTS
    define FWDL &H0110 'ANTRIEB LINKS VORWÄRTS
    define ROTR &H0115 'RECHTS DREHEN
    define ROTL &H0119 'LINKS DREHEN
    define REV &H011D 'RÜCKWÄRTS
    define FWD &H0121 'VORWÄRTS
    define COMNAV_STATUS &H0125 'UPDATED ALLE FLAGS IM STATUS-REGISTER
    define ACS_LO &H01E1 'ACS POWER LO
    define ACS_HI &H01E9 '
    define ACS_MAX &H01F1 '
    define SEND_TLM &H014A 'SENDET TELEMETRIE (CH=HBYTE,DATEN=LBYTE)
    define SEND_SPEEDR &H0134 'SENDET TLM KANAL 8,PLM RECHTS
    define SEND_SPEEDL &H013A 'SENDET TLM KANAL 7,PLM LINKS
    define SEND_SYSSTAT &H0144 'SENDET TLM KANAL 0,SYSTEM STATUS
    '(FLAGS für ACS,FWD/REV, ACS_LO/HI/MAX)
    so, habe ihn rot markiert...
    ich hoffe ich konnte wieder nen stück weiterhelfen beim helfen... ^^
    MFG
    RoboterStef oder auch einfach Stefan (o.k oder mein Standartnick Stefan1991^^)

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo Stefan,

    ich meinte natürlich in welcher Funktion der Wert für SYS_VOLTS bzw. ad[3]
    verändert wird. Eine Interrupt Funktion vielleicht. Irgendwo muß ja eine A/D Wandlung gestartet werden zur Abfrage der Batteriespannung und dieser Wert in einer Variable abgelegt werden. Das vermisse ich bei obigem Programm.

    Was ist das überhaupt für ein System? (Prozessor, Programmiersprache etc.)

    Gruß Peter

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    CCBASIC

    Hallo Stefan,

    es gibt in deinem Prog 3 größere Probleme:
    1. In der Schleife WATCH_AKKU muss ein Befehl zum Ausschalten der LEDs am Ende der Schleife stehen. Sieh dir das noch 'mal im Beispielprog zum Robby an.
    2. Die Unterprogramme zum Ansteuern der 8 LEDs auf der Basiserweiterung sind etwas anders, als die für die 4 LEDs auf dem Robby. Hier sind sie:

    Code:
    '--- LEDS AUF DER BASIS ERWEITERUNG  ------
    #L1ON
    L1_F=on:goto LEDPORT_WRITE
    #L1OFF
    L1_F=off :goto LEDPORT_WRITE
    #L2ON
    L2_F=on:goto LEDPORT_WRITE
    #L2OFF
    L2_F=off :goto LEDPORT_WRITE
    #L3ON
    L3_F=on:goto LEDPORT_WRITE
    #L3OFF
    L3_F=off :goto LEDPORT_WRITE
    #L4ON
    L4_F=on:goto LEDPORT_WRITE
    #L4OFF
    L4_F=off :goto LEDPORT_WRITE
    #L5ON
    L5_F=on:goto LEDPORT_WRITE
    #L5OFF
    L5_F=off :goto LEDPORT_WRITE
    #L6ON
    L6_F=on:goto LEDPORT_WRITE
    #L6OFF
    L6_F=off :goto LEDPORT_WRITE
    #L7ON
    L7_F=on:goto LEDPORT_WRITE
    #L7OFF
    L7_F=off :goto LEDPORT_WRITE
    #L8ON
    L8_F=on:goto LEDPORT_WRITE
    #L8OFF
    L8_F=off :goto LEDPORT_WRITE
    #LOFF
    LEDPORT=0 :goto LEDPORT_WRITE
    #LON
    LEDPORT=&HFF
    #LEDPORT_WRITE
    SYS LED_DRIVE:pulse LSTROBE:RETURN
    Du kannst also nicht einfach die 4 Unterprogramme für die LEDs des Robby auf 8 "aufbohren", sondern must die o.g. Routinen nehmen.
    Zum Löschen aller LEDs dient dann "gosub LOFF".

    3. Du must, wenn du die Basiserweiterung hast, den Treiber p5driv12.s19 nehmen, und nicht den p5driv.s19. Du must dann auch noch die define-Zeilen unter '- ERWEITERTE SYSTEM ROUTINEN - entsprechend anpassen.

    Viel Erfolg
    Dirk

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    10.11.2005
    Ort
    Burscheid
    Alter
    33
    Beiträge
    20
    Zitat Zitat von m.a.r.v.i.n
    Hallo Stefan,

    ich meinte natürlich in welcher Funktion der Wert für SYS_VOLTS bzw. ad[3]
    verändert wird. Eine Interrupt Funktion vielleicht. Irgendwo muß ja eine A/D Wandlung gestartet werden zur Abfrage der Batteriespannung und dieser Wert in einer Variable abgelegt werden. Das vermisse ich bei obigem Programm.

    Was ist das überhaupt für ein System? (Prozessor, Programmiersprache etc.)

    Gruß Peter
    em, die RP5 Programiersprache, Joa, prozessor müste also CC1 sein.. ^^ Jo, wird wohl interupt sein, habe einfach den standartcode verändert...

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    10.11.2005
    Ort
    Burscheid
    Alter
    33
    Beiträge
    20

    Re: CCBASIC

    Zitat Zitat von Dirk
    Hallo Stefan,

    es gibt in deinem Prog 3 größere Probleme:
    1. In der Schleife WATCH_AKKU muss ein Befehl zum Ausschalten der LEDs am Ende der Schleife stehen. Sieh dir das noch 'mal im Beispielprog zum Robby an.
    2. Die Unterprogramme zum Ansteuern der 8 LEDs auf der Basiserweiterung sind etwas anders, als die für die 4 LEDs auf dem Robby. Hier sind sie:

    Code:
    '--- LEDS AUF DER BASIS ERWEITERUNG  ------
    #L1ON
    L1_F=on:goto LEDPORT_WRITE
    #L1OFF
    L1_F=off :goto LEDPORT_WRITE
    #L2ON
    L2_F=on:goto LEDPORT_WRITE
    #L2OFF
    L2_F=off :goto LEDPORT_WRITE
    #L3ON
    L3_F=on:goto LEDPORT_WRITE
    #L3OFF
    L3_F=off :goto LEDPORT_WRITE
    #L4ON
    L4_F=on:goto LEDPORT_WRITE
    #L4OFF
    L4_F=off :goto LEDPORT_WRITE
    #L5ON
    L5_F=on:goto LEDPORT_WRITE
    #L5OFF
    L5_F=off :goto LEDPORT_WRITE
    #L6ON
    L6_F=on:goto LEDPORT_WRITE
    #L6OFF
    L6_F=off :goto LEDPORT_WRITE
    #L7ON
    L7_F=on:goto LEDPORT_WRITE
    #L7OFF
    L7_F=off :goto LEDPORT_WRITE
    #L8ON
    L8_F=on:goto LEDPORT_WRITE
    #L8OFF
    L8_F=off :goto LEDPORT_WRITE
    #LOFF
    LEDPORT=0 :goto LEDPORT_WRITE
    #LON
    LEDPORT=&HFF
    #LEDPORT_WRITE
     '--- LEDS AUF DER BASIS ERWEITERUNG  ------
    #L1ON
    L1_F=on:goto LEDPORT_WRITE
    #L1OFF
    L1_F=off :goto LEDPORT_WRITE
    #L2ON
    L2_F=on:goto LEDPORT_WRITE
    #L2OFF
    L2_F=off :goto LEDPORT_WRITE
    #L3ON
    L3_F=on:goto LEDPORT_WRITE
    #L3OFF
    L3_F=off :goto LEDPORT_WRITE
    #L4ON
    L4_F=on:goto LEDPORT_WRITE
    #L4OFF
    L4_F=off :goto LEDPORT_WRITE
    #L5ON
    L5_F=on:goto LEDPORT_WRITE
    #L5OFF
    L5_F=off :goto LEDPORT_WRITE
    #L6ON
    L6_F=on:goto LEDPORT_WRITE
    #L6OFF
    L6_F=off :goto LEDPORT_WRITE
    #L7ON
    L7_F=on:goto LEDPORT_WRITE
    #L7OFF
    L7_F=off :goto LEDPORT_WRITE
    #L8ON
    L8_F=on:goto LEDPORT_WRITE
    #L8OFF
    L8_F=off :goto LEDPORT_WRITE
    #LOFF
    LEDPORT=0 :goto LEDPORT_WRITE
    #LON
    LEDPORT=&HFF
    #LEDPORT_WRITE
    SYS LED_DRIVE:pulse LSTROBE:RETURN
    Du kannst also nicht einfach die 4 Unterprogramme für die LEDs des Robby auf 8 "aufbohren", sondern must die o.g. Routinen nehmen.
    Zum Löschen aller LEDs dient dann "gosub LOFF".

    3. Du must, wenn du die Basiserweiterung hast, den Treiber p5driv12.s19 nehmen, und nicht den p5driv.s19. Du must dann auch noch die define-Zeilen unter '- ERWEITERTE SYSTEM ROUTINEN - entsprechend anpassen.

    Viel Erfolg
    Dirk
    1.Tya, das prob ist, ich habe das Beispielprogramm ja geändert, nicht in ner anderen datei , Die CD ist schon vor einiger Zeit (als ich mich mal nicht um den Robby gekümmerd hab) verlorengegangen und c-robotics wird umgestaltet, da gibs z.Z. die beispielbrograme net zum download... und was muss den da stehen?

    2.o.k, ich habe den neuen code den du mir gegeben hast eingefügt, jetzt sagt mir aber CCRP, das bei SYS LED_DRIVEulse LSTROBE:RETURN eine Konstante erwartet wird... und habe ich das richtig verstanden, das dann
    Code:
    #LED_WRITE
    gosub LOFF
    kommen muss?

    3. em, wo gibt man den treiber an? und, was miss man unter - ERWEITERTE SYSTEM ROUTINEN - entsprechend ändern?


    Ich weis, ich bin dumm, aber das weis ich schon selbst...^^ Ich guck gerade mal, vil. kann ich ja das 1. auch aus nem anderen Beispielprogramm herausfinden...

    MFg
    Stefan (und danke schonmal für die Hilfe...)

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Rahmenprogramm

    Hallo Stefan,

    im Anhang [Gelöscht!] schicke ich dir ein Prog LED-Test.bas.
    Es testet alle 12 LEDs mit einem Lauflicht.
    Gleichzeitig ist das ein "Rahmenprogramm" für den Robby mit Basiserweiterung (und evtl. mit LCD). Du kannst es als Grundlage für eigene Progs nehmen.
    Die vielen Erklärungen zum Robby kannst du nach dem Lesen auch rausschmeißen.

    Gruß Dirk

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress