Forum: Mikrocontroller und Digitale Elektronik PIC16F876A rs232 Port Steuern


von Marcel K. (sunny198828)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe ein kleines problem.
unszwar möchte ich wenn icvh über rs-232 ein 'G' sende das dann PORTB,0
einschaltet leider klappt das nicht manchmal kommen auch wirre zeichen 
vom pic zurück vobwohl er garnichts senden sollte....

PIC läuft auch 20Mhz und soll eine baud von 9600 haben

Vielleicht kann sich ja mal jemand den code anschauen

mfg sunny

von Lästermaul (Gast)


Lesenswert?

Diesen Code möchte ich lieber nicht anschauen.

Habe Bedenken, dein Code ist genau so wirr wie dein Text.

von Marcel K. (sunny198828)


Lesenswert?

okay vergesst meinen ersten post !
Ich versuche es nochmal zu erklären....
Ich möchte über hyperterm ein zeichen an den pic senden, sagen wir 
einfach ein großes g dann soll der pic das zeichen auswerten und nur 
wenn ein großes g gesendet wurde den pin PORTB0 einschalten.
Das ganze möchte ich machen um zu verstehen wie das in assembler 
funktioniert!

wäre ne wenn mir einer helfen könnte.

von Chris (Gast)


Lesenswert?

Vergiss den Interrupt code.

#define inchar  pir1,rcif

getch  skip_inchar
  goto  getch
  movf  rcreg,w         ; move data to w
  return
getche  call getch
putc  bsf  status,rp0
  btfss  txsta,trmt
  goto  putc
  bcf  status,rp0
        movwf TXREG             ; send data in W
  return

; return 0 if no input or input processed, otherwise W contains char.
check_input
        clrw                    ; reset W register
        btfss inchar
        return
        call getch
        xorlw 'G'
        bz  message
        xorlw '?' ^ 'G'
        bz  msg_help
        xorlw 0xA ^ '?'
        bz  msg_nl
        xorlw 0xA               ; restore getch value
        return


; -------
; MESSAGE
; -------
;
message movlw  '1'
        call putc
        movlw  '6'
        call putc
        movlw  'F'
        call putc
        movlw  '8'
        call putc
        movlw  '7'
        call putc
        movlw  '6'
        call putc
        movlw  ' '
        call putc
        movlw  'a'
        call putc
        movlw  'l'
        call putc
        movlw  'i'
        call putc
        movlw  'v'
        call putc
        movlw  'e'
        call putc
msg_cr
        movlw  0x0D ; CR
        call putc
        movlw  0x0A ; LF
msg_done
        call putc
msg_ret clrw
        return

msg_nl  call msg_cr
        movlw  '>'
        goto msg_done

msg_help
        call msg_cr
        movlw 'H'
        call putc
        movlw 'e'
        call putc
        movlw 'l'
        call putc
        movlw 'p'
        goto msg_cr

von Chris (Gast)


Lesenswert?

skip_inchar =        btfss inchar

von Marcel K. (sunny198828)


Angehängte Dateien:

Lesenswert?

@ chris
Danke !!!!

ich habe jetzt nochmal was anderes versucht.
wenn der pic ein großes g empfängt soll er diese zurücksenden aber auch 
nur dann und es klappt !

für alle die sich jetzt fragen was der typ überhaupt vor hat ?

ich versuche den multicardreader von makinterface nach zu bauen ...

nur leider verstehe ich die source nicht ganz und weiß nicht was das 
programm zurück erwartet wenn ein großes g gesendet wird, habe kein plan 
von der 'C' sprache

mfg sunny

von Chris (Gast)


Lesenswert?

Naja, ich habe dir das Beispiel des Parsen von 3 Zeichen gemacht.
Dein Code funktioniert gut, solange du nur ein Zeichen parst, danach 
macht
man es normalerweise wie ich es dir gezeigt hatte.
Auch beim Senden, das funktioniert bei dir, wenn du genau ein Zeichen 
sendest, oder wenn du extern eine Pause zwischen mehrere Zeichen machst,
aber du kannst keine zwei Zeichen hintereinander senden, da bekommst du 
einen
Framing Error auf der Empfängerseite, du schaust eben im falschen 
Register nach. Das ist ungefähr dasselbe wie dein Interruptcode. Durch 
falsche Speicherbereiche (w_temp) und nicht richtigen Code (status_temp) 
geht dein
uC ins Nirvana sobald ein Interrupt auftritt wenn du dich nicht in 
Codebank 0
befindest. War bei deinem Programm nicht so, wenn es erweitert wird,
dann aber sicher. Ev. schau dir mal Great Cow Basic an. Ist kostenlos.

von Marcel K. (sunny198828)


Lesenswert?

okay das verstehe ich jetzt.
aber kannst du mir vielleicht helfen mit dem makinterface code ich 
verstehe nicht was das programm zurückerwartet wenn es 0x47 sendet ...

mfg

von Chris (Gast)


Lesenswert?

Der code ist für PC geschrieben. Wenn DTR aktiv ist, dann ist der 
Multiplexer aktiv, ansonsten ist die ausgesuchte Smartcard.
Achtung, die Geschwindigkeit kann, bzw ist sicherlich unterschiedlich, 
also
würde dein Code nicht funktionieren, ausser du verwendest einen HW Mux.
Command 0x47 ist doch gut beschrieben, es erwartet ein return byte 
welches
folgende Bedeutung hat. Aus deinem Code:

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

von Marcel K. (sunny198828)


Lesenswert?

okay danke !
Mit der geschwindigkeit muss ich glaube ich wiedersprechen !

denn wenn ich das jetzt richtig verstehe im code

  // 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);

wird hier die rs-232 schnitstelle auf 9600 baud gesetzt

korriegiert mich bitte wenn ich falsch liege ...

mfg

von Chris (Gast)


Lesenswert?

Das Commando-Interface (DTR) ist immer auf 9.6k, aber die Smartcard 
nicht.
Deshalb wird ja immer bei den zwei Befehlen, die ja unterstützt werden,
die Geschwindigkeit neu eingestellt, auch auf PC Seite, denn durch 
dieselbe
Schnittstelle wird ja die Smartcard gelesen.

von Marcel K. (sunny198828)


Lesenswert?

okay also ich versuche mal zu erklären wie ich das jetzt verstnaden habe 
...

das mit DTR ist mir klar .

also läufts so ab

SC8in1 liest aus in welche slots karten sind

DTR geht auf LOW
Muxer aktiv
muxer empfängt 0x47
muxer gibt den status von PORTB aus <- die schalter an PORTB
DTR geht wieder HIGH
Muxer inaktiv <- gewählte karte aktiv

so jetzt seitens vom muxer

Muxer setzt CTS auf LOW
Das programm an der gegnstelle erkennt dieses und macht dann nur ein 
"get SC8in1 info"

so aber mit dem select slot das verstehe ich noch nicht ganz ...

erst wird ja 0x53 gesendet
danach slot&0x0F

woher bekommt das programm aber den wert von slot ??

ist es das hier am ende des programms ??

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");

also müsste dann ja zum beispiel slot5 so heißen

tmp[1]=0x10&0x0F

bin mal gespannt auf antwort ob ich das jetzt richtig verstanden habe...

mit besten und freundlichen grüßen

sunny

von Chris (Gast)


Lesenswert?

Bei Slot5 enthält tmp[1] warscheinlich den Wert 4 , könnte aber auch 5 
sein.
Ich behaupte mal 4, weil es in meinen Augen so aussieht, daß es 16 
mögliche
Smartcards geben könnte, aus denen man auswählen kann, oder aber auch 
nur
8, aber mit unterschiedlichen Frequenzen. Deshalb dann auch die Zählung
mit 0 beginnend, aber das sind einfach nur Annahmen. Auch ist 
warscheinlich
daß nachdem ein Select gemacht wurde, die Karte am selben Interface 
mitgeloggt werden kann. Mir ist noch unklar was du überhaupt realisieren
willst, willst du ein vorhandenes sc8in1 ansteuern, emulieren, oder 
einfach
nur kopieren und den Chip nicht kaufen ?

von Marcel K. (sunny198828)


Lesenswert?

mit deiner letzten aussage hast du den nagel auf dem kopf getroffen ;-)

Ich möchte das programm für den steuer µC selber schreiben
aber jetzt haben wir ja auch fast alles jetzt müsste ich nur noch wissen 
was bei select slot gesendet wird aber ich denke das werde ich noch raus 
bekommen ....

aber warscheinlich hast du recht bei slot5 wirds wohl warscheinlich eine 
4 sein.
ich werde einfach mal das programm so weit schreiben und bei der 
slotauswahl werde ich mir dann den wert binär an einem port ausgeben 
lassen da sehe ich dann ja was gesendet wird !

von Chris (Gast)


Lesenswert?

Wenn du nur wenige Smartcard hast, brauchst du die multiplexer nicht,
und du kannst mit den Pins des uC die Karte Multiplexen.

von Marcel K. (sunny198828)


Lesenswert?

ich habe genau das ja auch vor nur musste ich ja wissen was vom receiver 
zum muxer gesendet wird.
mit der hardware habe ich ja jede menge möglichkeiten.

überleget hatte ich mir einen mcp23017 zu nehmen.

was ich noch fragen wollte kann ich eigentlich eine guarz nehmen mit 
74hc00 und den ausgang auf mehrer smartcards verteilen ? theoretisch 
müsste das doch gehen wenn ich jetzt nach einem analogschalter noch 1/4 
74hc00 nachschalte. machen will ich das das ich praktisch nur 4 quarze 
brauche um auf allen 8 karten 4 frequenzen auswählen kann .

von Chris (Gast)


Lesenswert?

Ohne Mux dachte ich an 2-4 Karten, du willst 8 Karten machen und vier 
Frequenzen, das wird ein TTL Grab wenn du nicht ein CPLD nimmst.
Ich würde an jeder Smartcard ein 74hc00 zur Umschaltung zwischen zwei
Frequenzen nehmen. Jedes dieser Frequenzeingäge führt auf ein 74hc125 
sowie 74hc126, wobei sich vier Gatter ein Steuereingang teilen.
Also 16 Ic sowie 16 Steuereingänge oder 1 Ic und drei Steuereingänge der
2x74hc595.
8x 4066/74066 zahlen sich nicht aus, da du dann 4x 74hc595 hast + 2 
buffer-ic, also 14 IC aber nicht über 10Mhz hinauskommst.

von Marcel K. (sunny198828)


Lesenswert?

okay.
das mit den 74hc125 und 74hc126 verstehe ich aber nicht ganz kannst du 
das mal näher erklären ??

mfg sunny

von Chris (Gast)


Lesenswert?

Schau dir mal den SN74HC251 an, günstig erhältlich und warscheinlich 
einfacher zu realisieren.

125 und 126 sind 4 Gates mit tristate enable. Das enable ist einmal low 
activ und einmal high activ. Wenn du jeweils ein 125 + 126 nimmst und 
die
enable von einem 125 und einem 126 Gatter zusammenschaltest, dann hast 
du
einen 2:1 mux.

von Marcel K. (sunny198828)


Lesenswert?

okay also nehme ich jetzt 2 74hc4051 um den reset und I/O pin zu 
multiplexen.
und um meine 4 quarze auf jede karte zu muxen nehme ich acht 74hc153 .
für die quarze dachte ich nehme ich quarzoszilatoren da spare ich schon 
mal 4 cmos ... und dann noch 2 cd4094 um die acht 74hc153 an zu steuern 
für die beiden 74hc4051 kann ich ja direkt die portpins des pics nehmen 
!.

meine frage jetzt muss ich jetzt noch die 74hc00 nach dem 
quarzoszillator schalten um die signale vom quarzoszilator praktisch zu 
verstärken oder könnte im schlimmsten fall auch mit einem quarz 4 
smartcards versorgen ohne zusätlichen cmos ?

puuuhhhhh jetzt weiß ich was du mit cmos grab meintest.

gibt es nicht vielleicht auch ein ic womit ich die frequenzen generieren 
könnte ?

mfg sunny

edit : hab gerade noch was gefunden könnte ich dafür den LTC1799 nehmen 
oder wäre der zu ungenau ?

von Marcel K. (sunny198828)


Lesenswert?

hmmm ich glaube ich bleibe lieber bei meinem cmos grab ^^

von Chris (Gast)


Lesenswert?

Marcel Klug schrieb:
> und um meine 4 quarze auf jede karte zu muxen nehme ich acht 74hc153 .
Wenn du 74hc353 nimmst, dann kannst du die anderen Mux als inverter 
verwenden, und zwar um Quarzoszillatoren zu machen.

> für die quarze dachte ich nehme ich quarzoszilatoren da spare ich schon
> mal 4 cmos ...
Verstehe ich nicht, um 4-8 Quarzoszillatoren zu realisieren brauchst du
ein IC, sowie etwas Kleinfutter und die Quarze.
Zusätzlich, ein Quarzoszillator ist bereits im Pic, welchen du natürlich
(Xout) auch als Takt nimmst, also brauchst du nur noch 3 
Quarzoszillatoren
aufzubauen. Quarzoszillatoren mit 7.5Mhz, 15Mhz usw sind normalerweise 
etwas kostspielig, bzw schwer aufzutreiben.

> und dann noch 2 cd4094 um die acht 74hc153 an zu steuern

> für die beiden 74hc4051 kann ich ja direkt die portpins des pics nehmen
> !.

>
> meine frage jetzt muss ich jetzt noch die 74hc00 nach dem
> quarzoszillator schalten um die signale vom quarzoszilator praktisch zu
> verstärken oder könnte im schlimmsten fall auch mit einem quarz 4
> smartcards versorgen ohne zusätlichen cmos ?
Machst du 8 oder 4 Smartcard ??
Nein, wofür willst du noch 74hc00 haben ? Ich würde die Oszillatoren mit
einem Inverter aufbauen, geht natürlich nur im eingeschränkten 
Temperaturbereich, was ja der Fall ist, und mit den weiter 4 invertern 
das
Signal abkoppeln, damit die Kapazitäten der Pins nicht das Quarz 
beeinflussen. Da ein Osc ja im Pic ist, bleibt dir ein Inverter übrig.
Den könntest du als Smartmouse/Phönix Umschalter nehmen (Jumper), wenn
du einen FTDI232R nimmst, dieser bieter auch bereits ein 6Mhz sowie 
12Mhz
Clock, sowie wenn du einen 1:3 Teiler nimmst (Counter + Nand) dann hast
du auch gleich 4Mhz, 8Mhz sowie 16Mhz, dann kommst du mit dem Quarz des
uC aus. Es gibt neuere Pics, welche ein CLC integriert haben und damit
den 1:3 Teiler ohne externe IC realisieren könen. Mit einem Quarz wäre
das dann 3.57Mhz, 4/8Mhz, 6Mhz, 12Mhz als Beispiel.

> edit : hab gerade noch was gefunden könnte ich dafür den LTC1799 nehmen
> oder wäre der zu ungenau ?
Wenn du den LTc Temperaturcompensierst (Mittels Pic), dann geht dies
Problemlos. Einfach Frequenz mit dem Pic messen und dann eine kleine
PCB Heizung unter den Bausteinen platzieren, welche von 2-3 Pins des
Pics gesteuert wird.

von Marcel K. (sunny198828)


Lesenswert?

ja da hast du recht mit dem ftdi ich habe mir jetzt mal das datenblatt 
dazu angeschaut. ich werde auch den ftdi nehmen aber wie bekomme ich da 
jetzt meine clocks ich brauche 3,57 ; 3,68 ; 6 ; und 8mhz die 3,68 mhz 
werden bestimmt schwierig .... als ic würde ja der hc163 gehen wenn ich 
das richtig verstehe ... man das ist kompliezierter als ich geglaubt 
habe !

aber ich gebe nicht auf ^^

mfg

ich mache 8 smartcards aber kann ja auch passieren das ich 4 karten mit 
6mhz habe ich möchte das ein bisschen individuell gestalten

von Chris (Gast)


Angehängte Dateien:

Lesenswert?

Den FTDI dachte ich wenn du die Kartenleser an ein USB ansteckst.
Nicht wegen der Frequenzausgänge.

Ein OSC ist simple, hier ein Beispiel. Inverter, nimm jeden der geht, 
ist
unkritisch (bei eingeschränktem Temperaturbereich), sowie nimm das Xout
des Pics.
PS, die Smartcards haben normierte Takte, schau dir mal den ATR an,
welchen die Karte zurückgiebt, 
http://de.wikipedia.org/wiki/Answer_to_Reset
Ev. bist du mit einem 4Mhz Takt besser dran.
Wie du hier siehst, ein paar Karten aus dem Web kopiert,
können alle diese Karten 5Mhz und arbeiten mit 19.2kbps bei 3.57Mhz ,
leicht übertaktet aber mit 5.33Mhz machen sie 28.8kbps. Im Prinzip
kommt es nur darauf an, welche krummen Frequnzen du bei der seriellen
Schnittstelle einstellen kannst.
Fi=372, Di=2, 186 cycles/ETU (21505 bits/s at 4.00 MHz, 26881 bits/s for 
fMax=5 MHz).

3B 78 12 00 00 47 C4 03 00 8F F1 90 00
  Sattelite bg 23.5 East cryptoworks card
3B 78 12 00 00 54 C4 03 00 8F F1 90 00
   Skylink irdeto from Towercom a.s. company
3B 78 12 00 00 65 C4 05 00 8F F1 90 00
  Digitürk Cryptoworks
3B 78 12 00 00 65 C4 05 05 8F F1 90 00
  Turkie Digiturk Cryptoworks
3B 78 12 00 00 A0 C4 03 06 8F F1 90 00
  ORF Digital (Irdeto/Cryptoworks) (pay tv)
3B 78 12 00 00 A0 C4 03 07 8F F1 90 00
  IRDETO-Smartcard for crytoworks for austrian television (ORF),
3B 78 12 00 00 A0 C4 06 00 8F F1 90 00
  Cryptoworks/Nagravision decoding card
3B 78 12 00 00 A0 C4 06 07 8F F1 90 00
  Skylink CZ/SK - Cryptoworks

von Marcel K. (sunny198828)


Angehängte Dateien:

Lesenswert?

okay jetzt habe ich das auf der hardware seite verstanden !

wie ist das aber mit dem ATR , wenn ich das im wiki richtig verstanden 
habe sendet die karte den atr wenn sie den reset bekommt.

dan muss ich zur karte also insgesamt 2 leitungen vom rs232 muxen den 
I/O und den Reset. den card detect mache ich ja über den pic.

die clock versorgung der karten passiert dann über 74hc353.
die 6mhz und 12mhz klaue ich mir vom ft232 und die 3,68 und 3,57 nehme 
ich quarz mit inverter

in der datenleitung zur karte ist noch ein 100 ohm widerstand, ist der 
wichtig ? weil ich auch schon schaltungen gesehen habe ohne widerstand.

mit der diode zwischen rx und tx läuft das zuverlässig ? weil da habe 
ich eine schaltung gesehen mit hex buffer 74ls07. ich hänge die 
schaltung mal oben an.

sorry wenn ich hier so viel frage

mfg

von Chris (Gast)


Lesenswert?

> wie ist das aber mit dem ATR , wenn ich das im wiki richtig verstanden
> habe sendet die karte den atr wenn sie den reset bekommt.
richtig

> dan muss ich zur karte also insgesamt 2 leitungen vom rs232 muxen den
> I/O und den Reset. den card detect mache ich ja über den pic.
Davon ging ich aus, daß du das verstanden hattest. Du sprachst auch von
zwei 74hc4051 für acht Smartcards, macht genau Zwei gemuxte I/O.

>in der datenleitung zur karte ist noch ein 100 ohm widerstand, ist der
> wichtig ? weil ich auch schon schaltungen gesehen habe ohne widerstand.
Wenn dir die Karte/Kartenleserschaltung wichtig ist, dann schon. Es 
braucht
die nicht wenn die Karte NIE bei laufendem Lesegerät rein bzw 
rausgesteckt
wird.

>
> mit der diode zwischen rx und tx läuft das zuverlässig ? weil da habe
> ich eine schaltung gesehen mit hex buffer 74ls07. ich hänge die
> schaltung mal oben an.
Ist dasselbe, aber wenn du ein FTDI als RS232 nimmst, dann kannst du 
auch
den Ausgang als OC umprogrammieren und brauchst keine Diode.

von Marcel K. (sunny198828)


Lesenswert?

okay und wie programiere ich den pin als OC ? im mprog habe ich auf den 
datenleitungen nur invert als option.

was heißt eigentlich OC ?

ich  sage dir erstmal ein richtig fettes dankeschön das du die zeit 
genommen hast mir die sachen hier zu erklären !!!

mfg

von Chris (Gast)


Lesenswert?

OC, http://de.wikipedia.org/wiki/Open_Collector
Stimmt, mein Fehler, OC wird von Silabs unterstützt, nicht aber von 
FTDDI.

Bei der Lösung mit der Diode kommt auch ein OC Signal als Resultat 
hervor.

von Marcel K. (sunny198828)


Lesenswert?

okay ich habe mir jetzt überlegt um den mux zu steuern hänge ich an 
meinem pic einen mcp23016 ich weiß ist ne menge aufwand aber das fördert 
auch den lernprozess !

also so wie ich das aus dem datenblatt verstehe muss ich wie bei jedem 
i2c erstmal die adresse des slaves senden das ist mir klar

dann den pointer auf 0x06

und dann noch zweimal 0x00 um beide ports auf output zu setzten

um dann in den port zu schreiben muss ich ja einfach 0x00 und dann die 
daten für port 0

und für port 1 ja einfach 0x01 und dann die daten...

so müsste das ja eigentlich passen wenn ich das richtig verstehe

mfg sunny

von Marcel K. (sunny198828)


Angehängte Dateien:

Lesenswert?

Hallo,

irgendwie drehe ich gerade durch schreibe die ganze zeit an meinem 
programm und plötzlich baut mit MPLAB nicht mehr die hex ... ich klann 
den fehler einfach nicht finden und der error code wiederspricht sich 
eigentlich.
da steht das TRIS register nicht in bank 0 währe hat ja auch recht aber 
ich habe ja eindeutig mit BSF STATUS,RP0 auf Bank 1 umgestellt ich 
verstehe das nicht ... vllt kann mir ja jemand helfen

von Marcel K. (sunny198828)


Lesenswert?

Also ich habe jetzt das programm noch mal neu geschrieben , 
beziehungsweiße in MPLAB neues projekt angelegt und alles nach einander 
rein kopiert und jetzt läufts wieder ... also ich verstehe das nicht

von Marcel K. (sunny198828)


Lesenswert?

hallo jungs kann mir nochmal jemand helfen ?
also ich habe das programm jetzt soweit fast fertig lediglich das get 
info geht nicht also ich sende erstaml nur 0xFF zurück also 8 einsen nur 
kommt dann im oscam sc8in1 error muss ich da noch irgendwas anderes 
davor senden ??

mfg sunny

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.