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
Diesen Code möchte ich lieber nicht anschauen. Habe Bedenken, dein Code ist genau so wirr wie dein Text.
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.
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
@ 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
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.
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
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
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
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.
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
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 ?
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 !
Wenn du nur wenige Smartcard hast, brauchst du die multiplexer nicht, und du kannst mit den Pins des uC die Karte Multiplexen.
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 .
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.
okay. das mit den 74hc125 und 74hc126 verstehe ich aber nicht ganz kannst du das mal näher erklären ?? mfg sunny
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.
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 ?
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.
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
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
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
> 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.
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
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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.