1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Talk SC8in1 eigenbau benötige hilfe

Dieses Thema im Forum "Cardreader/Cardwriter" wurde erstellt von sunny198828, 7. April 2012.

  1. sunny198828
    Offline

    sunny198828 Ist gelegentlich hier

    Registriert:
    20. Oktober 2009
    Beiträge:
    62
    Zustimmungen:
    17
    Punkte für Erfolge:
    8
    Beruf:
    KFS-Mechatroniker Bus Fahrer
    Hallo liebe gemeinde!
    ich habe vor den sc8in1 nachzubauen !
    Das ganze möchte ich mit einem PIC16F876A realiesieren, diesen Programiere ich in assembler.
    Mein problem an der ganzen sache die sourcen von dem sc8in1 sind in C und ich verstehe praktisch kein wort :( ...

    #include <fcntl.h>
    #include <stdio.h>
    #include <stdarg.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/ioctl.h>
    #include <termios.h>
    #include <errno.h>

    // ----------------------------------------------------------------------------
    void SETDTR(int fd) {
    // sets the SC8in1 in command mode
    int lineData;
    ioctl(fd, TIOCMGET, &lineData);
    lineData |= TIOCM_DTR;
    ioctl(fd, TIOCMSET, &lineData);
    }
    // ----------------------------------------------------------------------------
    void RESETDTR(int fd) {
    // sets the SC8in1 in normal mode
    int lineData;
    ioctl(fd, TIOCMGET, &lineData);
    lineData &= ~TIOCM_DTR;
    lineData &= ~TIOCM_RTS;
    ioctl(fd, TIOCMSET, &lineData);
    }
    // ----------------------------------------------------------------------------
    int GETCTS(int fd) {
    // returns the SC8in1 Status
    // 0= no card was changed (inserted or removed)
    // 1= one ore more cards were changed (inserted or removed)
    int result;
    int lineData;
    ioctl(fd, TIOCMGET, &lineData);
    result= (lineData & TIOCM_CTS) / TIOCM_CTS;
    return(result-1);
    }
    // ----------------------------------------------------------------------------
    int readsc8in1( int fd) {
    // Reads the card status
    //
    // the bits in the return bytes:
    // bit0=1 means Slot1=Smartcard inside
    // bit1=1 means Slot2=Smartcard inside
    // bit2=1 means Slot3=Smartcard inside
    // bit3=1 means Slot4=Smartcard inside
    // bit4=1 means Slot5=Smartcard inside
    // bit5=1 means Slot6=Smartcard inside
    // bit6=1 means Slot7=Smartcard inside
    // bit7=1 means Slot8=Smartcard inside
    int res,i;
    unsigned char tmp[128];
    struct termios termio, termiobackup;

    // backup data
    tcgetattr(fd,&termio);
    memcpy(&termiobackup,&termio,sizeof(termio));

    // switch SC8in1 to command mode
    RESETDTR(fd);
    SETDTR(fd);

    // set communication parameters
    termio.c_oflag = 0;
    termio.c_lflag = 0;
    termio.c_cc[VTIME] = 1; // working
    termio.c_cflag = B9600|CS8|CREAD|CLOCAL;
    if (tcsetattr(fd,TCSANOW,&termio) < 0) {
    printf("ERROR: RS232 attributes\n");
    return(-1);
    }
    // get SC8in1 info
    tmp[0]=0x47;
    res=write(fd,tmp,1);
    usleep(50000);
    res=read(fd,tmp,10);

    if ( res==0 ) return(-1); // ERROR !

    // switch SC8in1 to normal mode
    RESETDTR(fd);

    // restore data
    memcpy(&termio,&termiobackup,sizeof(termio));
    if (tcsetattr(fd,TCSANOW,&termio) < 0) {
    printf("ERROR: RS232 attributes\n");
    return(-1);
    }

    if (tmp[res-8]!=0x90) return(-1); // ERROR !

    // return result byte
    return(tmp[res-7]);
    }
    // ----------------------------------------------------------------------------
    int selectslot(int fd, int slot) {
    // selects the Smartcard Socket "slot"
    //
    int res;
    unsigned char tmp[128];
    struct termios termio, termiobackup;
    // backup rs232 data
    tcgetattr(fd,&termio);
    memcpy(&termiobackup,&termio,sizeof(termio));
    // switch SC8in1 to command mode
    SETDTR(fd);
    // set communication parameters
    termio.c_cc[VTIME] = 1; // working
    termio.c_cflag = B9600|CS8|CREAD|CLOCAL;
    if (tcsetattr(fd,TCSANOW,&termio) < 0) {
    printf("ERROR: RS232 attributes\n");
    return(-1);
    }
    // selecd select slot command to SC8in1
    tmp[0]=0x53;
    tmp[1]=slot&0x0F;
    res=write(fd,tmp,2);
    // switch SC8in1 to normal mode
    RESETDTR(fd);
    // restore rs232 data
    memcpy(&termio,&termiobackup,sizeof(termio));
    if (tcsetattr(fd,TCSANOW,&termio) < 0) {
    printf("ERROR: RS232 attributes\n");
    return(-1);
    }
    return(0);
    }
    // ----------------------------------------------------------------------------

    int main (void) {
    int fd,result;

    printf("sc8in1 test utility 1.01\n");

    // open com port
    if((fd=open("/dev/ttyS0",O_RDWR | O_NOCTTY|O_NONBLOCK )) <= 0) {
    int err = errno;
    printf("ERROR: open rs232 port: %s\n", strerror(err));
    return(-1);
    }

    result=readsc8in1(fd);

    if ( result==-1 ) {
    printf("No sc8in1 found\n");
    return(-1);
    }

    if ( result==0 ) {
    printf("No Smartcard inside sc8in1\n");
    } else {
    if ((result&0x01)!=0) printf("Slot1=Smartcard inside\n");
    if ((result&0x02)!=0) printf("Slot2=Smartcard inside\n");
    if ((result&0x04)!=0) printf("Slot3=Smartcard inside\n");
    if ((result&0x08)!=0) printf("Slot4=Smartcard inside\n");
    if ((result&0x10)!=0) printf("Slot5=Smartcard inside\n");
    if ((result&0x20)!=0) printf("Slot6=Smartcard inside\n");
    if ((result&0x40)!=0) printf("Slot7=Smartcard inside\n");
    if ((result&0x80)!=0) printf("Slot8=Smartcard inside\n");
    }

    return(0);
    }

    was ich bis jetzt verstnaden habe das wenn der sc8in1 befehle entgegen nehmen soll das die DTR leitung hi geht.
    zum anfang wird dem sc8in1 der befehlt 0x47 gesendet (get info), was erwartet da das cam zurück ? das verstehe ich nicht.

    Die karten auswahl wird mit 0x53 getroffen , aber was bedeutet dann "tmp[1]=slot&0x0F "

    Vielleicht kann mir ja jemand helfen, wenn dann alles läuft stelle ich gerne hier im board alles zur verfügung

    mit freundlichen grüßen sunny
     
    #1
  2. phantom

    Nervigen User Advertisement

  3. balou1974
    Offline

    balou1974 Newbie

    Registriert:
    31. Juli 2011
    Beiträge:
    4
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Für den PIC gibt es doch auch kostenlose C-Compiler wenn ich nicht irre? Also an so einem Nachbau hätte ich auch Spass ;) Etwas C kann ich aber ist schon ne Weile her, dass ich für ein LCD einen Linux-Treiber auf libusb-Basis programmiert habe und ein Cardreader ist schon deutlich komplexer ...
     
    #2
  4. sunny198828
    Offline

    sunny198828 Ist gelegentlich hier

    Registriert:
    20. Oktober 2009
    Beiträge:
    62
    Zustimmungen:
    17
    Punkte für Erfolge:
    8
    Beruf:
    KFS-Mechatroniker Bus Fahrer
    naa das c programm ist nur für ein demo programm um das makinterface an zu steuern !
    eigentlich ist auf dem interface ein atmel der die befehle entgegen nimmt und dann weiter verarbeitet , also dann auf die richtig karte um zu schalten.
    was ich nicht verstehe ist das hier

    // get SC8in1 info
    tmp[0]=0x47;
    res=write(fd,tmp,1);
    usleep(50000);
    res=read(fd,tmp,10);

    was erwartet da das cam zurück ??

    ich habe einfach mal in oscam einen cardreader eingetragen wie im wiki beschrieben

    und auf der rs232 seite meinen lappi mit hyperterm angeschlossen um zu sehen was das cam zum sc8in1 sendet.

    erst kommt 0x74 (ein kleines t) und dann kommt 0x47 (ein großes G)

    im terminal von meiner dream kommt dann wenn ich oscam beoachte was es macht ein rs232 error, was ja klar ist weil nichts zurück kommt .
     
    #3
  5. balou1974
    Offline

    balou1974 Newbie

    Registriert:
    31. Juli 2011
    Beiträge:
    4
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    tmp[1]=slot&0x0F ich würde sagen tmp[1] = Zwischenspeicher slot = nr des kartenslot und das wird mit dem hexwert und verknüpft ... was das bringt keineahnung da müsste ich mich länger damit beschäftigen - ist schon lange her mit c ...
     
    #4
  6. balou1974
    Offline

    balou1974 Newbie

    Registriert:
    31. Juli 2011
    Beiträge:
    4
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    read und write sind schon mal datei-zugriffe (fd - Dateihandle = Adresse der jeweiligen Datei, tmp beinhaltet die werte nehme ich an, wird ein array sein?, danach am ende die anzahl der bytes die gelesen oder geschrieben wird ...)

    usleep um der karte zeit zum verarbeiten zu lassen nehme ich an
     
    #5
  7. sunny198828
    Offline

    sunny198828 Ist gelegentlich hier

    Registriert:
    20. Oktober 2009
    Beiträge:
    62
    Zustimmungen:
    17
    Punkte für Erfolge:
    8
    Beruf:
    KFS-Mechatroniker Bus Fahrer
    okay andere frage kennt sich jemand ein bisschen mit oscam aus ?

    wie wäre es wenn wir selbst eine routine schreiben um ich sag mal "unseren" cardreader an zu steuern .

    ihr würdet die oscam seite übernehmen ,da das ganze ja in c ist und ich nur bahnhof verstehe, und ich übernehme das PIC programm ?!?

    wäre das eine idee ? , anstatt das wir versuchen rauszufinden was der herr "makinterface" programiert hatte .

    edit :
    ich habe gerade noch was gefunden,

    Dieser Link ist nur für Mitglieder!!! Jetzt kostenlos Registrieren ?



    das werde ich mal in einen pic bringen steht ja alles schön beschrieben
    mfg

    ich habe jetzt in einem anderem forum mit jemanden anders die sourcen auseinander genommen und verstehe das jetzt.
    ich werde mich jetzt mal ans programm für den mux PIC16f876 machen weil den habe ich momentan nur da !

    später soll alles ein 16F887 steuern weil der mehr portpins hat und die neuer generation ist !

    trozdem könnt ihr hier weiterhin eure ideen posten !
     
    Zuletzt bearbeitet: 8. April 2012
    #6
  8. sunny198828
    Offline

    sunny198828 Ist gelegentlich hier

    Registriert:
    20. Oktober 2009
    Beiträge:
    62
    Zustimmungen:
    17
    Punkte für Erfolge:
    8
    Beruf:
    KFS-Mechatroniker Bus Fahrer
    So ich war in den letzten tagen nicht untätig !

    ich habe mal ein Blockschaltbild erstellt
    Den Anhang 53496 betrachten

    In ein paar tagen folgt der eigentliche schaltplan !
    Die Platine wird 2 seitig in SMD (SSOP) und DIL. Keine angst SSOP ist nicht schwer zu löten !
    Die bauteile sind alle bei Reichelt erhältlich die ich verwende.
    Den PIC wer an dem Cardreader interesse hat brenne ich gerne für euch, wenn alles fertig ist !
    Ich versuche die Protokolle MCR4/8 und MAK Interface ins Programm des PIC`s auf zu nehmen.
    MCR4/8 wird automatiusch ausgewählt da ich die Reader 5-8 über ein extra modul an die hauptplatine anbinden werde da ja nicht jeder ein 8fach kartenleser braucht und somit das design des gehäuses flexibel gehalten wird!

    So ich tüftel mal weiter

    MFG sunny

    Edit : Bei dem UART Zwischen Pic und MUX habe ich noch was vergessen da kommt natürlich auch noch ein mux dazwischen der die RX und TX leitungen zwischen Card und PIc umschaltet.
     
    Zuletzt bearbeitet: 15. April 2012
    #7
  9. sunny198828
    Offline

    sunny198828 Ist gelegentlich hier

    Registriert:
    20. Oktober 2009
    Beiträge:
    62
    Zustimmungen:
    17
    Punkte für Erfolge:
    8
    Beruf:
    KFS-Mechatroniker Bus Fahrer
    Hallo,
    ich möchte mich mal wieder melden und meine Fortschritte mitteilen !

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;
    ;; ;;
    ;; ;;
    ;; ;; MCR 8 Kartenleser
    ;; ;;
    ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


    ;**************************************************************
    ;*
    ;* Pinbelegung
    ;* ----------------------------------
    ;* PORTA: 0
    ;* 1
    ;* 2
    ;* 3
    ;* 4
    ;* PORTB: 0
    ;* 1
    ;* 2
    ;* 3
    ;* 4
    ;* 5
    ;* 6
    ;* 7
    ;* PORTC: 0
    ;* 1
    ;* 2
    ;* 3
    ;* 4
    ;* 5
    ;* 6 RS232 TX
    ;* 7 RS232 RX
    ;*
    ;**************************************************************


    ; Includedatei für den 16F876 einbinden

    list p=16f876A
    #include <P16f876A.INC>

    ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES

    ; Variablen
    ; LCD
    w_copy equ 0x21
    s_copy equ 0x22
    LcdDaten equ 0x23
    LcdStatus equ 0x24
    loops equ 0x25
    loops2 equ 0x26
    ; PrintLCD
    TempH equ 0x27
    TempL equ 0x28
    Temp1 equ 0x29
    Temp2 equ 0x2A
    ;RS232
    RS232_in equ 0x2B
    RS232_out equ 0x2C
    ;Warteroutine
    RXData_i2c equ 0x2D
    ; MCP23016
    pause_mcp equ 0x2E
    GP0_0 equ 0x2F
    GP1_0 equ 0x30
    GP0_1 equ 0x31
    GP1_1 equ 0x32

    init
    ; PortB vorbereiten
    bsf STATUS, RP0 ; auf Bank 1 umschalten
    movlw B'00000000' ; PortB alle output
    movwf TRISB
    bcf STATUS, RP0 ; auf Bank 0 zurückschalten
    clrf PORTB ; alle LEDs ausschalten

    ; für LCD-Pins

    PORTControl equ PORTB ; LCD-Control-Port
    PORTDaten equ PORTB ; LCD-Daten-Port
    LcdE equ 0 ; enable Lcd
    LcdRw equ 3 ; read Lcd
    LcdRs equ 2 ; Daten Lcd (nicht control)
    Ini_con Equ B'00000000' ; TMR0 -> Intetupt disable
    Ini_opt Equ B'00000010' ; pull-up

    ; I2C Initialisieren

    ; einstellen von RC3 & RC4 auf input

    bsf STATUS, RP0 ; Bank 1
    movlw B'00011000' ; RC3,4 inputs
    iorwf TRISC, f ; + RC2=CCP1 output
    bcf STATUS, RP0 ; Bank 0

    ; einstellen des I2C-Taktes auf knapp 400 kHz

    bsf STATUS, RP0 ; Bank 1
    movlw d'12' ; clock = 20/(4*(12+1)) = 385kHz
    movwf SSPADD ; für I2C
    bcf STATUS, RP0 ; Bank 0

    ; I2C Master Mode und I2C aktivieren

    movlw B'00001000' ; master mode, clock=Fosc/(4*(SSPADD+1))
    movwf SSPCON ;
    bsf SSPCON, SSPEN ; MSSP-Modul enable


    ; PortC vorbereiten
    bsf STATUS, RP0
    bsf TRISC, 0
    bsf TRISC, 1
    bcf STATUS, RP0

    ;;;;;;;; RS232 Initializieren ;;;;;;;

    ; USART initialisieren
    bsf STATUS,RP0 ; Bank1
    movlw 0x20 ; Sender: RS232
    movwf TXSTA ;
    bsf TRISC,7 ; RX-RS232 für USART-Modul
    bsf TRISC,6 ; TX-RS232 für USART-Modul
    bcf STATUS,RP0 ; Bank 0
    movlw 0x90 ; Empfänger: RS232
    movlw RCSTA ;


    ; USART Baudrate einstellen
    bsf STATUS,RP0 ; Bank1
    movlw D'31' ; Set Baud rate 9,6 kBPS bei 20 MHz
    movwf SPBRG
    bcf TXSTA, BRGH ; BRGH=0
    bcf STATUS,RP0 ; Bank 0

    ; Beide MCP23016 intializieren
    ; MCP 1
    call i2c_on ; I2C Bus im Master Modus übernehmen
    movlw H'40' ; I2C Slaveadresse und LSB '0' senden (A0 0= 0 ; A1 = 0 ; A2 = 0)
    call i2c_tx
    movlw H'06' ; IODIR0
    call i2c_tx
    movlw H'00' ; GP0 alle ausgang
    call i2c_tx
    call i2c_tx ; GP1 alle auf ausgang der Pointer geht automatisch auf 0x07 (IODIR1)

    ; MCP 2
    movlw H'48' ; I2C Slaveadresse und LSB '0' senden (A0 0= 0 ; A1 = 0 ; A2 = 1)
    call i2c_tx
    movlw H'06' ; IODIR0
    call i2c_tx
    movlw H'00' ; GP0 alle ausgang
    call i2c_tx
    movlw H'FF' ; GP1 alle auf eingang der Pointer geht automatisch auf 0x07 (IODIR1)
    call i2c_tx
    call i2c_off

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;; Init fertig ! Hier beginnt das eigentliche Programm !;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;;Hauptprogrammschleife;;

    MCR
    btfsc PORTC, 0 ;; Data in ?
    goto MCR ;; Nein , gehe zu MCR
    call RS232in ;; Ja, Daten aus speicher puffer holen

    ; Abfragen was für ein kommando empfangen wurde

    movlw H'3f' ;; MCR Status
    subwf RS232_in,W ;; 0x3f von RS232_in abziehen
    btfsc STATUS,Z ;; Zero flagg gesetzt ?
    goto MCRStatus ;; ja, MCR Status zurücksenden
    ; Kartenslot auswählen
    movlw H'73' ;; Select Slot
    subwf RS232_in,W ;; 0x73 von RS232_in abziehen
    btfsc STATUS,Z ;; Zero-Flag gesetzt ?
    goto select_slot ;; Ja, gehe zu select_slot
    ; get Version
    movlw H'76' ;; Get Version
    subwf RS232_in,W ;; 0x76 von RS232_in abziehen
    btfsc STATUS,Z ;; Prüfen
    goto get_verison ;; Ja !
    ; Clocks einstellen
    movlw H'63' ;; nein , Set Clock
    subwf RS232_in,W ;; 0x63 von RS232_in abziehen
    btfsc STATUS,Z ;; Zero flagg gesetzt ?
    goto SetClocks ;; Ja, gehe zu SetClock

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;MCR Unterprogramme;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ; Kartenslot auswählen

    select_slot

    call RS232in ;; Welcher Slot soll benutzt werden ?
    movlw H'00' ;; Slot 1
    subwf RS232_in,W ;; Prüfen
    btfsc STATUS,Z ;; Slot 1 ?
    goto slot1 ;; Ja !
    movlw H'01' ;; Nein, Slot 2
    subwf RS232_in,W ;; Prüfen
    btfsc STATUS,Z ;; Slot 2 ?
    goto slot2 ;; Ja !
    movlw H'02' ;; Slot 3
    subwf RS232_in,W ;; Prüfen
    btfsc STATUS,Z ;; Slot 3 ?
    goto slot3 ;; Ja !
    movlw H'03' ;; Slot 4
    subwf RS232_in,W ;; Prüfen
    btfsc STATUS,Z ;; Slot 4 ?
    goto slot4 ;; Ja !
    movlw H'04' ;; Slot 5
    subwf RS232_in,W ;; Prüfen
    btfsc STATUS,Z ;; Slot 5 ?
    goto slot5 ;; Ja !
    movlw H'05' ;; Slot 6
    subwf RS232_in,W ;; Prüfen
    btfsc STATUS,Z ;; Slot 6 ?
    goto slot6 ;; Ja !
    movlw H'06' ;; Slot 7
    subwf RS232_in,W ;; Prüfen
    btfsc STATUS,Z ;; Slot 7 ?
    goto slot7 ;; Ja !
    movlw H'07' ;; Slot 8
    subwf RS232_in,W ;; Prüfen
    btfsc STATUS,Z ;; Slot 8 ?
    goto slot8

    ;; Select Slot an MCP senden

    slot1
    call i2c_on
    movlw B'10000000'
    call i2c_tx
    call i2c_off
    goto MCR

    slot2
    call i2c_on
    movlw B'01000000'
    call i2c_tx
    call i2c_off
    goto MCR

    slot3
    call i2c_on
    movlw B'00100000'
    call i2c_tx
    call i2c_off
    goto MCR

    slot4
    call i2c_on
    movlw B'00010000'
    call i2c_tx
    call i2c_off
    goto MCR

    slot5
    call i2c_on
    movlw B'00001000'
    call i2c_tx
    call i2c_off
    goto MCR

    slot6
    call i2c_on
    movlw B'00000100'
    call i2c_tx
    call i2c_off
    goto MCR

    slot7
    call i2c_on
    movlw B'00000010'
    call i2c_tx
    call i2c_off
    goto MCR

    slot8
    call i2c_on
    movlw B'00000001'
    call i2c_tx
    call i2c_off
    goto MCR

    ; MCR Status zurückgeben

    MCRStatus
    btfsc PORTC,1 ;; Wurde ein Interrupt ausgelöst ?
    call card_detect_int ;; Ja, MCP interruptregister muss ausgelesen werden
    call card_detect ;; Nein, es wird einfach nur OLAT auslesen
    movwf RS232_out ;; Daten in den RS232 puffer speicher
    call RS232out ;; Sende routine RS232
    goto MCR ;; Gehe wieder zurück zum Hauptprogramm

    ;Clock`s an den 8 Kartenslots einstellen, Daten 16bit , MCP0 wird dafür genutzt
    SetClocks
    call i2c_on ;; I2C einschalten
    movlw H'40' ;; MCP0 LSB 0
    call i2c_tx ;; I2C Daten senden
    movlw 0x00 ;; Pointer auf GP0
    call i2c_tx ;; I2C Daten senden
    movlw GP0_0 ;; obere 8 bit in den arbeitsregister
    call i2c_tx ;; obere 8 bit I2C Daten senden
    movlw 0x01 ;; Pointer auf GP1
    call i2c_tx ;; I2C Daten senden
    movlw GP1_0 ;; untere 8 bit in den arbeitsregister
    call i2c_tx ;; untere 8 bit I2C Daten senden
    call i2c_off ;; fertig !, I2C aus
    goto MCR

    ; Welcher Slot ist belegt ? Daten Liegen an MCP1 GP1 !! Wichtig !! Wird nur aufgerufen wenn ein Interrupt vom MCP kommt
    card_detect_int
    call i2c_on ;; I2C einschalten
    movlw H'48' ;; Adresse MCP1 und LSB 0
    call i2c_tx ;; I2C Daten senden
    movlw H'09' ;; Pointer auf INTCAP1, Register muss ausgelesen werden damit der Interruptpin des MCP wieder auf null geht
    call i2c_tx ;; I2C Daten senden
    call i2c_ron ;; I2C reset
    movlw H'49' ;; Adresse MCP1 und LSB 1
    call i2c_tx ;; I2C Daten senden
    call i2c_rx ;; I2C MCP1 INTCAP1 Daten auslesen, da pointer von MCP23016 vorher ja auf INTCAP1 gesetzt wurde
    return

    ; Card detect
    card_detect
    call i2c_on ; I2C einschalten
    movlw H'48' ; Adresse des MCP1 und LSB 0
    call i2c_tx ; I2C Daten senden
    movlw H'03' ; Pointer auf OLAT1
    call i2c_tx ; I2C Daten senden
    call i2c_ron ; I2C reseten
    movlw H'49' ; Adresse MCP1 und LSB 1
    call i2c_tx ; I2C Daten Senden
    call i2c_rx ; I2C MCP1 PORT1 Daten auslesen, da pointer von MCP23016 vorher ja auf OLAT1 gesetzt wurde
    return


    ;;;;;;;;;;;;;; I2C Routinen ;;;;;;;;;;;;;


    ; I2C-Bus im Master-Mode übernehmen
    i2c_on bcf PIR1, SSPIF ; SSPIF Bit löschen
    bsf STATUS, RP0
    bsf SSPCON2, SEN ; Bus Übernahme anweisen
    bcf STATUS, RP0
    i2c_t1
    btfss PIR1, SSPIF ; Testen, ob Bus schon übernommen wurde
    goto i2c_t1 ; nein, noch nicht
    bcf PIR1, SSPIF ; ja, der Bus ist mein! nun noch SSPIF zurücksetzen
    return

    ; I2C-Bus im Master-Mode übernehmen - repeated START
    i2c_ron
    bcf PIR1, SSPIF ; SSPIF Bit zurücksetzen
    bsf SSPCON2, RSEN ; repeated start condition
    btfss PIR1, SSPIF ; Bus schon frei ?
    goto $-1 ;
    bcf PIR1, SSPIF ; ja, Bus ist übernommen
    return

    ; ein Byte aus W senden
    i2c_tx
    movwf SSPBUF ; -> zum I2C-Slave übertragen
    i2c_t2
    btfss PIR1, SSPIF ; ACK schon empfangen?
    goto i2c_t2 ; nein, noch nicht
    bcf PIR1, SSPIF ; ja, Daten sind im Slave, nun noch SSPIF zurücksetzen
    call pause12us
    return


    ;ein Byte vom Slave empfangen
    i2c_rx
    bsf STATUS, RP0
    bsf SSPCON2, RCEN ; Daten Empfang einschalten
    bcf STATUS, RP0
    i2c_r7
    btfss PIR1, SSPIF ; Daten Empfang fertig?
    goto i2c_r7 ; nein, noch nicht
    bcf PIR1, SSPIF ; ja, nun noch SSPIF zurücksetzen

    movf SSPBUF, w ; empfangene Daten -> W
    movwf RXData_i2c ; empfangene Daten -> RXData
    return

    ; I2C-Bus wieder freigeben
    i2c_off
    bsf STATUS, RP0
    bsf SSPCON2, PEN ; Bus Freigabe anweisen
    bcf STATUS, RP0
    i2c_t8
    btfss PIR1, SSPIF ; Bus schon freigegeben?
    goto i2c_t8 ; nein, noch nicht
    bcf PIR1, SSPIF ; ja, alles fertig, nun noch SSPIF zurücksetzen
    return

    ; 12 µs Pause für MCP23016

    pause12us
    movlw 58
    movwf pause_mcp
    loop12
    decfsz pause_mcp,1
    goto loop12
    return

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;Zeitverzögerung um loops * 1 ms;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    WAIT
    top movlw .249 ; timing adjustment variable (1ms)
    movwf loops2
    top2 nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    decfsz loops2, F ; inner loops complete?
    goto top2 ; no, go again
    ;
    decfsz loops, F ; outer loops complete?
    goto top ; no, go again
    retlw 0 ; yes, return from subWAIT


    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;RS232 Sende und empfang routine ;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    RS232in
    btfss PIR1,RCIF ; sind Daten da ?
    goto RS232in ; nein, noch keine Daten da
    movfw RCREG ; RS232-Register auslesen
    movwf RS232_in ; und in den Speicher nach 'Zeichen' schreiben
    return

    RS232out
    btfss PIR1,TXIF ; ist Sender leer ?
    goto RS232out ; nein, noch nicht leer
    movfw RS232_out ; nächstes Byte holen
    movwf TXREG ; und in den RS232-Sender schreiben
    return

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;Initialisierung des LCD-Displays;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LCD Routinen;;;;;;;;;;;;;;;;;;;;;;;

    InitLCD
    movlw D'255' ; 250 ms Pause nach dem Einschalten
    movwf loops
    call WAIT

    movlw B'00110000' ; 1
    movwf PORTB
    bsf PORTB, LcdE
    nop
    bcf PORTB, LcdE

    movlw D'50' ; 50 ms Pause
    movwf loops
    call WAIT

    movlw B'00110000' ; 2
    call Control8Bit
    movlw B'00110000' ; 3
    call Control8Bit
    movlw B'00100000' ; 4
    call Control8Bit

    movlw B'00000001' ; löschen und cusor home
    call OutLcdControl
    movlw B'00101000' ; 5 function set, 4-bit 2-zeilig, 5x7
    call OutLcdControl
    movlw B'00001000' ; 6 display off
    call OutLcdControl
    movlw B'00000110' ; 7 entry mode, increment, disable display-shift
    call OutLcdControl
    movlw B'00000011' ; 8 cursor home, cursor home
    call OutLcdControl
    movlw B'00001111' ; 9 display on
    call OutLcdControl
    return

    ; ein Steuerbyte 8-bittig übertragen
    Control8Bit
    movwf PORTB
    bsf PORTB, LcdE
    nop
    bcf PORTB, LcdE
    movlw D'10'
    movwf loops
    call WAIT
    return

    ; darauf warten, daß das Display bereit zur Datenannahme ist
    LcdBusy
    bsf PORTA, 1 ; Test LED 1 on
    bsf STATUS, RP0 ; make Port B4..7 input
    movlw B'11110000'
    iorwf TRISB, f
    bcf STATUS, RP0
    BusyLoop
    bcf PORTControl, LcdRs
    bsf PORTControl, LcdRw ; Lesen
    bsf PORTControl, LcdE
    nop
    movf PORTDaten, w
    movwf LcdStatus
    bcf PORTControl, LcdE
    nop
    bsf PORTControl, LcdE ; Enable
    nop
    bcf PORTControl, LcdE
    btfsc LcdStatus, 7 ; teste bit 7
    goto BusyLoop
    bcf PORTControl, LcdRw
    bsf STATUS, RP0 ; make Port B4..7 output
    movlw B'00001111'
    andwf TRISB, f
    bcf STATUS, RP0
    bcf PORTA, 1 ; Test LED 1 off
    return

    ; ein Byte mit Steuerdaten von LcdDaten zum Display übertragen
    OutLcdControl
    movwf LcdDaten
    call LcdBusy
    movf LcdDaten, w
    andlw H'F0'
    movwf PORTDaten ; Hi-teil Daten schreiben
    bsf PORTControl, LcdE
    nop
    bcf PORTControl, LcdE ; Disable LcdBus
    swapf LcdDaten, w
    andlw H'F0'
    movwf PORTDaten ; Lo-teil Daten schreiben
    bsf PORTControl, LcdE
    nop
    bcf PORTControl, LcdE ; Disable LcdBus
    return

    ; ein Datenbyte von LCDDaten zum Display übertragen
    OutLcdDaten
    bsf PORTA, 2 ; Test LED 2 on
    movwf LcdDaten
    call LcdBusy
    movf LcdDaten, w
    andlw H'F0'
    movwf PORTDaten ; Hi-teil Daten schreiben
    bsf PORTControl, LcdRs ; Daten
    bsf PORTControl, LcdE ; Enable LcdBus
    nop
    bcf PORTControl, LcdE ; Disable LcdBus
    swapf LcdDaten, w
    andlw H'F0'
    movwf PORTDaten ; Lo-teil Daten schreiben
    bsf PORTControl, LcdRs ; Daten
    bsf PORTControl, LcdE
    nop
    bcf PORTControl, LcdE ; Disable LcdBus
    bcf PORTControl, LcdRs ;
    bcf PORTA, 2 ; Test LED 2 on
    return

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; ;;;;;;;;;;;PrintLCD_Temp - Schreibt die ausgelesene Temperatur im Format '-21.5' auf das Display;;;;;;;;;;;;;;;;;;;;;;
    ; ;;;;;;;;;;;TempH = High Byte des zu schreibenden Temperaturwertes;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; ;;;;;;;;;;;TempL = Low Byte des zu schreibenden Temperaturwertes;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    PrintLCD_Temp
    ; Als erstes wird geschaut ob es sich um eine negative Zahl handelt, wenn ja dann wird ein negatives Vorzeichen ausgegeben
    btfss TempH, 7
    goto notneg
    ; Negatives Vorzeichen
    movlw '-'
    movwf LcdDaten
    call OutLcdDaten
    ; Zahl in Positive wandeln
    comf TempH,f
    ; 1 Addieren
    incf TempH, F
    goto doconvert ; mit der Zahlenkonvertierung anfangen
    notneg

    ; Positives Vorzeichen
    movlw '+'
    movwf LcdDaten
    call OutLcdDaten

    doconvert

    ; Flag register löschen
    clrf Temp2

    ; 100er abzählen
    movlw d'100'
    movwf Temp1
    call GetDigit
    btfsc Temp2, 0
    call OutLcdDaten

    ; 10er abzählen
    movlw d'10'
    movwf Temp1
    call GetDigit
    btfsc Temp2, 0
    call OutLcdDaten

    ; Die einser sind jetzt ganz einfach
    movlw '0'
    addwf TempH, w
    movwf LcdDaten
    call OutLcdDaten ; Einser ausgeben


    ; Nachkommastelle auswerten
    btfss TempL, 7 ; Wenn das LSB gesetzt ist, dann ".5" ausgeben - ansonsten ".0"
    goto kommanull

    movlw '.'
    movwf LcdDaten
    call OutLcdDaten
    movlw '5'
    movwf LcdDaten
    call OutLcdDaten
    return

    kommanull
    movlw '.'
    movwf LcdDaten
    call OutLcdDaten
    movlw '0'
    movwf LcdDaten
    call OutLcdDaten
    return


    GetDigit
    ; ASCII Zeichen '0' in LcdChr schreiben
    movlw '0'
    movwf LcdDaten
    ; Ziffer ermitteln
    ; also schauen wie oft passt Temp1 (Potenz von 10) in die Zahl
    digit_loop
    movfw Temp1
    subwf TempH, w
    btfss STATUS, C
    return ; Zahl wurde negativ - wir sind fertig
    movwf TempH ; Zahl wurde nicht negativ - Ergebnis in TempH speichern
    incf LcdDaten, f ; ASCII Zeichen in LcdChr um 1 erhöhen (hunderter stellen)
    bsf Temp2, 0
    goto digit_loop
    return


    end

    Hier ist erstmal ein auschnitt aus dem Programm! Da ich diese Projeckt nur nebenbei mache und meine eigentliche arbeit mich zimlich in anspruch nimmt geht es nur schleppend voran, ABER es geht vorran !

    ach ja schreiben tue ich in assembler wer interesse hat und mich unterstützen möchte kann dies gerne tun oder mir auch verbesserungs vorschläge fürs programm geben ...

    mit freundlichen grüßen
     
    #8
  10. sunny198828
    Offline

    sunny198828 Ist gelegentlich hier

    Registriert:
    20. Oktober 2009
    Beiträge:
    62
    Zustimmungen:
    17
    Punkte für Erfolge:
    8
    Beruf:
    KFS-Mechatroniker Bus Fahrer
    hallo was ich fragen wollte hat irgendjemand hier im forum so ein sc8in1 von makinterface ?

    wenn ja meldet euch mal bitte per PN

    mfg sunny
     
    #9
  11. sunny198828
    Offline

    sunny198828 Ist gelegentlich hier

    Registriert:
    20. Oktober 2009
    Beiträge:
    62
    Zustimmungen:
    17
    Punkte für Erfolge:
    8
    Beruf:
    KFS-Mechatroniker Bus Fahrer
    AW: SC8in1 eigenbau benötige hilfe

    Hallo,
    ich bin jetzt mal wieder zu meinem Projekt kartenleser gekommen ! ich wollte mal fragen wer hier im forum ganz fit mit eagle ist ? und wer sich erbarmen kann mir ein layout zu fertigen ? Schaltplan liegt nur auf Papier vor .

    mfg sunny
     
    #10
  12. sunny198828
    Offline

    sunny198828 Ist gelegentlich hier

    Registriert:
    20. Oktober 2009
    Beiträge:
    62
    Zustimmungen:
    17
    Punkte für Erfolge:
    8
    Beruf:
    KFS-Mechatroniker Bus Fahrer
    AW: SC8in1 eigenbau benötige hilfe

    Hier habe ich mal noch ein Paar Bilder

    Prototyp kommt erstmal auf lochraster !

    Bestückungsseite

    Dieser Link ist nur für Mitglieder!!! Jetzt kostenlos Registrieren ?


    Lötseite zu etwa 30% fertig gestellt
    Den Anhang 59083 betrachten
    Sieht nicht toll aus funktioniert aber .
    Trozdem habe ich gemerkt das dass platinenlayout nachher 2 seitig werden muss ...

    mfg sunny
     
    #11
  13. sunny198828
    Offline

    sunny198828 Ist gelegentlich hier

    Registriert:
    20. Oktober 2009
    Beiträge:
    62
    Zustimmungen:
    17
    Punkte für Erfolge:
    8
    Beruf:
    KFS-Mechatroniker Bus Fahrer
    AW: SC8in1 eigenbau benötige hilfe

    hi,
    so die software für den steuerpic ist soweit fertig, bestimmt noch ein paar schönheitsfehler aber die finde ich erst raus wenn die hardware soweit fertig ist ich denke so in 2 wochen bin ich fertig, muss viel arbeiten ...

    mfg sunny
     
    #12
  14. Gio.Matrix
    Offline

    Gio.Matrix Ist oft hier

    Registriert:
    24. Februar 2009
    Beiträge:
    130
    Zustimmungen:
    28
    Punkte für Erfolge:
    28
    Hi
    Hab deinen Beitrag jetzt durch Zufall gefunden, da ich auch mit meinem SC 8in1 am testen bin.
    Was ist aus deinem Projekt "SC8in1 eigenbau" geworden ?

    mfg
     
    #13

Diese Seite empfehlen