Aktuelles
Digital Eliteboard - Das Digitale Technik Forum

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

SC8in1 eigenbau benötige hilfe

    Nobody is reading this thread right now.

sunny198828

Ist gelegentlich hier
Registriert
20. Oktober 2009
Beiträge
72
Reaktionspunkte
19
Punkte
38
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
 
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 ...
 
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 .
 
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 ...
 
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
 
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,

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:
So ich war in den letzten tagen nicht untätig !

ich habe mal ein Blockschaltbild erstellt


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:
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
 
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
 
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
 
AW: SC8in1 eigenbau benötige hilfe

Hier habe ich mal noch ein Paar Bilder

Prototyp kommt erstmal auf lochraster !

Bestückungsseite
attachment.php

Lötseite zu etwa 30% fertig gestellt

Sieht nicht toll aus funktioniert aber .
Trozdem habe ich gemerkt das dass platinenlayout nachher 2 seitig werden muss ...

mfg sunny
 
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
 
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
 
Zurück
Oben