Hallo zusammen, Ich habe folgendes Problem. habe einen spannungswandler gebaut (siehe bild) ist ein LD1117. Nun schliese ich das FTDI-TTL-232R-3V3 an den wandler an und dann an den Pic. Die spannung stimmt. Jetzt möchte ich meine Werte von den angeschlossenen I2C modulen per Uart zum PC schicken und HIER kommt nur blödsinn an. FTDI Verbindung geprüft RX & TX zusammen gestecket und über den Wandler mit Putty signale geschickt. FUNKTIONIERT Die Baudraten sind beide richtig eingestellt auf Pic und PC seite. Muss ich irgendwas beim FTDI Kabel ncoh einstellen das er die Logikwerte von 5v auf 3,3v convertiert? geht ein PIC kaputt wenn ich wärend der Programmierung den internen Quartz umstelle? danke im vorraus
Tim Halbach schrieb: > Muss ich irgendwas beim FTDI Kabel ncoh einstellen das er die Logikwerte > von 5v auf 3,3v convertiert? Wo kommen bei Dir 5V vor?
Marvin schrieb: > Was genau hat I2C mit RS232 zu tun ? sind 2 verscheidene schnitstellen zum übertragen von daten. das ist mir klar. ich möchte aber meine werte die ich von einem sensor bekomme per i2c an die rs232 schnitstelle übertragen und diese soll an den pc gesendet werden. MfG
Hi, Du beschreibst Dein Problem nicht vollständig und man muss raten... Also der PIC (3,3V) nimmt die Daten über I2C entgegen und sendet diese über seine UART Schnittstelle an den FTDI ? Der FTDI ist ein RS232 zu USB Wandler ? Dann muss zwischen PIC und FTDI noch ein MAX232 oder ähnliches... BR
Marvin schrieb: > Du beschreibst Dein Problem nicht vollständig und man muss raten... Ich habe ein Pic18F45K20 Demoboard aus dem PIckit3 Debug express. EIn FTDI Kalbel TTL-232R-3V3 ( http://www.ftdichip.com/Support/Documents/DataSheets/Cables/DS_TTL-232R_CABLES.pdf ) Das FTDI Kabel wir an meinem PC angeschlossen und an den PIC über einen SpannungsWandler. Die Module arbeiten nur bis max 3,6V deswegen der Spannungswandler da aus einem USB port 5 V kommen die Module aber nciht mehr arbeiten und sogar zerstört werden können. Das PicBoard wird mit strom über das FTDI Kabel mitversorgt. Ich schliese mein temp sensor über SDA, SCL, + und GND an das board an um die abfrage der daten über den pic zu realisieren. Die daten die von dem Temp sensor über i2c an den Pic gesendet werden sollen von dort aus weiter zum Pc gesendet werden. Und da ist mein fehler. soweit ichw eis brauche ih keinen MAX232 dazwischen da der chip ja integriert ist im FTDI Kabel. danke im vorraus Mit freundlichen Grüßen
Hi, Das FTDI 3.3V Kabel hat ein 3.3V Interface, da muss nix dazwischen. Wieviel Strom nimmt Dein ganzer Aufbau auf ? Das FTDI Kabel kann bei 5V "nur" 75mA liefern laut Datenblatt...das mag in undefiniertem Verhalten enden, falls Deine Sensoren mehr brauchen. Schreibe erst mal auf PIC Seite ein einfaches Programm, was z.B. "Hallo Welt !" ausgibt, bau alle andere Hardware ab und schau, ob das funktioniert. Gruß
Marvin schrieb: > Schreibe erst mal auf PIC Seite ein einfaches Programm, was z.B. "Hallo > Welt !" ausgibt, bau alle andere Hardware ab und schau, ob das > funktioniert. Funktioniert.
1 | /*=========================================================
|
2 | * GLOBAL VARIABLES
|
3 | *=========================================================*/
|
4 | uint8_t uartConfig = 0, baud = 0; |
5 | /*=========================================================
|
6 | * MAIN
|
7 | *=========================================================*/
|
8 | void main(void) { |
9 | setupClock(); |
10 | OpenUSART(uartConfig,baud); |
11 | putsUSART("wert "); |
12 | |
13 | }// end main |
14 | /*=========================================================
|
15 | * FUNCTIONS
|
16 | *=========================================================*/
|
17 | void setupClock(void){ |
18 | //8Mhz = 0x60 4Mhz = 0x50 16Mhz= 0x70
|
19 | asm("BANKSEL OSCCON"); |
20 | asm("MOVLW 0x70"); |
21 | asm("MOVWF OSCCON"); |
22 | }
|
23 | void setupUart(void){ |
24 | //pins auf input setzten, Pic Configuriert sich die pins nach bedarf für USART
|
25 | TRISCbits.RC7 = 1; |
26 | TRISCbits.RC6 = 1; |
27 | |
28 | uartConfig = USART_RX_INT_ON & USART_TX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_HIGH; |
29 | baud = 103; // Baudrate 9600 = 51 (8Mhz), 103(16mhz)= 9615 |
danke @ Marvin für die Zeit die du dir nimmst
Hallo Tim, also ..... Der FTDI ( Ich hoffe es ist ein FT232-R Chip) hat einen eignen 3,3V Regler. Dieser ist mit max ca. 80mA belastbar. PIN 17. So ist kein zusätzlicher Notwendig. Mehr Strom ?!?! Weiter unten.... Wenn ich es richtig gelesen habe, ist dies auch ausreichend deine Schaltung zu betreiben. Ein externener LDO ist nicht nötig. Und ein reines 5V Netzteil mit USB gibt es für billig Geld. Dann, Der Unterschied zwischen einen 3V3 und 5V FTDI Interface ist folgender. Die IO/ Pins am FTDI haben einen eigenen IO-Versorgungseingang. PIN4. Dieser wird wahlweise mit Pin17 oder mit Pin20 Eingang 5V-LDO Regler. verbunden. Damit wird gewährleistet, dass die passenden Spannungen am Controller anliegen. Bei deinem Fall 3V3 = Pin 17. --Wenn ein externer LDO als Spannungsversorgung benutzt wird, sollte der PIN4 mit dieser Spannungsversorgung verbunden werden, damit arbeiten alle aus der selben Quelle. -- Dann: Einen MAX232 hat in dieser Schaltung nichts mehr zu suchen. Der macht aus 5V +/-12V. Die Verbindung zwischen PIC und FTDI schaut so aus. TX-Pic <-> RX-FTDI und RX-Pic <-> TX-FTDI. Was gerne vor aller Aufregung vergessen wird. GND !!! Muss auch verbunden werden. Dann sollte es gehen.... Hier gehts so mit Atmel viele mal..... Gruß Thomas
Hi Tim, Wenn das funktioniert, hast Du evt. folgende Probleme: * In Deinem I2C to UART ist die Software Konfiguration anders als in Deinem Beispiel (Clock/Ports) oder Du überschreibst Dir aus Versehen die Konfiguration später * Die Daten die Du vom I2C ließt sind schon Müll * Deine Konvertierung ist Müll * Du überschreitest die ca. 75mA Hardwaremäßig ist Deine serielle Schnittstelle scheinbar erst mal in Ordnung...also Softwarefehler oder tatsächlich ein Stromproblem ? Was ließt Du von I2C ? Wie schickst Du die Daten weiter ? Gruß
Thomas schrieb: > Der FTDI ( Ich hoffe es ist ein FT232-R Chip) danke Thomas es ist nur kein chip im demsinne sonder es ist Ein fertiges Kabel von FTDI (USB TTL Serial mit integriertem FT232R) Link zum Kabel im ersten Post. Die verbindung von Rx zu Tx ist logisch, dass mit der Masse (GND) mache ich schon automatisch immer. so wie ich es verstanden habe ist das Kabel was ich benutze TTL 3,3v wobei die VDD immer noch 5V ist. Wenn ich das richtig verstanden habe, können Rx & TX 3,3V pegel in logische 1 und 0 umwandeln. Die Versorungsspannung ist aber immer noch 5 V (Die von USB kommt) Da meine Module aber nur max 3,6 V können muss ich sie ja durch den spannungswandler auf 3,3v bringen. Das FTDI kabel soll nicht nur zur übertragung sein sondern auch zur stromversorgung. Möchte den PIC ohne die PICKit 3 versogung Betreiben. Wenn keine anderen Geräte am USB Hängen sollte das Kabel 500mA liefern können wobei meine module bei Messungen max 500µA brauchen und im an sein zu stand nur 0.14µA. Danke dir aber thomas.
Hi Tim, Ein USBGerät darf nur 100mA ohne weiteres ziehen. Die 500mA müssen sozusagen ausgehandelt werden. Wenn Du über das FTDI Kabel gehst, sind es aber nur diese 80mA (siehe Datenblatt). Falls Du noch ein zweites angeschlossen hast, dann erst mal nur 100mA. Gruß
Marvin schrieb: > Was ließt Du von I2C ? Wie schickst Du die Daten weiter ? Hier ein auszug aus meinem code wie ich die i2c module lese Beispiel nur an einem modul dem HTU21D(F) Sensor (Temp & feuchtigkeit) meine i2c.c // Konfiguration des ic2 und die programmierung für das senden emfangen.
1 | void initI2C(void){ |
2 | |
3 | asm("BANKSEL TRISC"); |
4 | asm("MOVLW 0x18"); // SCL (RC3) und SDA (RC4) Auf inputstellen |
5 | asm("MOVWF TRISC"); |
6 | |
7 | asm("BANKSEL SSPCON1"); |
8 | asm("MOVLW 0x28"); // Master Mode Clock einstellung (Master mode clock = FOSC/(4 * (SSPADD + 1))) |
9 | asm("MOVWF SSPCON1"); //& SCL &SDA als serialport bestimmen |
10 | |
11 | asm("BANKSEL SSPSTAT"); //Slew mode dissable |
12 | asm("BSF SSPSTAT,7"); |
13 | |
14 | //Baudrate von I2C einstellen auf 100khz
|
15 | asm ("MOVLW 0x27"); // (FOSC/(4*xKhz))-1 = (4Mhz/(4*100Khz))-1 = 9 (8mhz = 19) (16mhz= 0x27) |
16 | asm ("BANKSEL SSPADD"); |
17 | asm ("MOVWF SSPADD"); |
18 | |
19 | asm("BANKSEL SSPCON2");// ack in master mode |
20 | asm("bcf SSPCON2,5"); |
21 | |
22 | }
|
23 | |
24 | //start sequenze
|
25 | void startI2C(void){ |
26 | idleI2C(); |
27 | asm("BSF SSPCON2,0"); //SEN Bit setzten für Startsequenz des I2C |
28 | asm("l_START:"); |
29 | asm("BTFSC SSPCON2,0"); // WIrd automatisch gelöscht von Hardware SSPIF im Pir Software mäßig löschen |
30 | asm("GOTO l_START"); |
31 | |
32 | }
|
33 | |
34 | //restart sequenz
|
35 | void restartI2C(void){ |
36 | idleI2C(); |
37 | asm("BSF SSPCON2,1"); //RSEN Bit setzten für Restartsequenz des I2C |
38 | asm("l_RESTART:"); |
39 | asm("BTFSC SSPCON2,1"); // WIrd automatisch gelöscht von Hardware SSPIF im Pir Software mäßig löschen |
40 | asm("GOTO l_RESTART"); |
41 | |
42 | }
|
43 | //stop i2c
|
44 | void stopI2C(void){ |
45 | idleI2C(); |
46 | asm("BSF SSPCON2,2"); //PEN Bit setzten für Stopsequenz des I2C |
47 | asm("l_STOP:"); |
48 | asm("BTFSC SSPCON2,2"); // WIrd automatisch gelöscht von Hardware SSPIF im Pir Software mäßig löschen |
49 | asm("GOTO l_STOP"); |
50 | |
51 | }
|
52 | //idle i2c (untätig/frei) Läuft eine übertragung ist irgendwas anderes aktiv? (Ist der Bus FREI?)
|
53 | void idleI2C(void){ |
54 | asm("BANKSEL SSPCON2"); |
55 | asm("l_ACKEN:"); |
56 | asm("BTFSC SSPCON2, 4"); //Test is Bit NOT Set? Skipp next (ACKEN) |
57 | asm("GOTO l_ACKEN"); |
58 | asm("l_RCEN:"); |
59 | asm("BTFSC SSPCON2, 3");//Test is Bit NOT Set? Skipp next(RCEN) |
60 | asm("GOTO l_RCEN"); |
61 | asm("l_PEN:"); |
62 | asm("BTFSC SSPCON2, 2");//Test is Bit NOT Set? Skipp next (PEN) |
63 | asm("GOTO l_PEN"); |
64 | asm("l_RSEN:"); |
65 | asm("BTFSC SSPCON2, 1");//Test is Bit NOT Set? Skipp next (RSEN) |
66 | asm("GOTO l_RSEN"); |
67 | asm("l_SEN:"); |
68 | asm("BTFSC SSPCON2, 0");//Test is Bit NOT Set? Skipp next (SEN) |
69 | asm("GOTO l_SEN"); |
70 | }
|
71 | //Send
|
72 | uint8_t sendI2C(uint8_t byte){ // eine 8 bit (1byte) int |
73 | idleI2C(); // Bus Verfügbar |
74 | PIR1bits.SSPIF = 0; // löschend es SPPIF bits |
75 | SSPBUF = byte; //zu sendene Daten in den sende buffer schieben |
76 | waitI2C(); |
77 | return SSPCON2bits.ACKSTAT; //ACK zurückgeben |
78 | }
|
79 | //Receive
|
80 | uint8_t reciveI2C_nack(void){ |
81 | uint8_t incom = 0; |
82 | |
83 | idleI2C(); |
84 | PIR1bits.SSPIF = 0; |
85 | SSPCON2bits.RCEN = 1; //Empfangs flag setzten (wird nach erfolg automatisch gelöscht) |
86 | waitI2C(); // abfrage ob das pif bit gelöscht ist für spätere Bestätigung des erfolgreichen empfangens |
87 | SSPCON2bits.ACKDT = 1; //Mit NACK quitieren (Nicht weiter einlesen) |
88 | SSPCON2bits.ACKEN = 1; //NACK Senden |
89 | |
90 | while(SSPCON2bits.ACKEN); // NACK abgeshclossen |
91 | incom = SSPBUF; //Empfangenebytes in den puffer |
92 | |
93 | return incom; // Rückgabe der empfangenen Daten. |
94 | }
|
95 | uint8_t reciveI2C_ack(void){ |
96 | uint8_t incom = 0; |
97 | |
98 | idleI2C(); |
99 | PIR1bits.SSPIF = 0; |
100 | SSPCON2bits.RCEN = 1; //Empfangs flag setzten (wird nach erfolg automatisch gelöscht) |
101 | waitI2C(); // abfrage ob das pif bit gelöscht ist für spätere Bestätigung des erfolgreichen empfangens |
102 | SSPCON2bits.ACKDT = 0; //Mit ACK quitieren (Nicht weiter einlesen) |
103 | SSPCON2bits.ACKEN = 1; //ACK Senden |
104 | |
105 | while(SSPCON2bits.ACKEN); // ACK abgeshclossen |
106 | incom = SSPBUF; //Empfangenebytes in den puffer |
107 | |
108 | return incom; // Rückgabe der empfangenen Daten. |
109 | }
|
110 | //Wait Hilfs funktion zum testen das die übertragung beginnen kann oder abgeschlosen wurde
|
111 | void waitI2C(void){ |
112 | asm("BANKSEL PIR1"); |
113 | asm("l_WAIT:"); |
114 | asm("BTFSS PIR1,3"); //Is sspif set? Überspringen der nächsten zeile |
115 | asm("GOTO l_WAIT"); |
116 | asm("BCF PIR1,3"); //Löschen des sspif bits |
117 | }
|
meine sendermodule.c
1 | #include <xc.h> |
2 | #include <pic18f45k20.h> |
3 | #include <stdint.h> |
4 | #include "i2c_routine.h" |
5 | #include "sens_modul_i2c.h" |
6 | |
7 | #define _XTAL_FREQ 16000000 // frequenz bestimmen für delayms function
|
8 | /*=========================================================
|
9 | * GLOBAL VARIABLES
|
10 | *=========================================================*/
|
11 | uint8_t slave_I2C[5] = {0,0,0,0,0}; // salve_i2c[0]= addresse + read/write, slave_i2c[1] = was soll abgefragt werden |
12 | uint16_t empfang; // var für den empfang |
13 | extern float summe=0; |
14 | /*=========================================================
|
15 | * FUNCTIONS
|
16 | *=========================================================*/
|
17 | uint16_t humidity(void){ |
18 | initI2C(); |
19 | idleI2C(); // Controll if the bus free? |
20 | startI2C(); |
21 | __delay_ms(20); // time to wake up the Temp sensor |
22 | sendI2C(0x80); // write on i2c device |
23 | sendI2C(0xE5); // was (Humidity) |
24 | restartI2C(); |
25 | sendI2C(0x81); // lese i2c |
26 | slave_I2C[0] = reciveI2C_ack(); |
27 | slave_I2C[1] = reciveI2C_nack(); |
28 | stopI2C(); |
29 | empfang = slave_I2C[0]; |
30 | empfang <<= 8; // um 8 bit nach linksschieben (temp 14bit, Hum 12bit = 4) |
31 | empfang |= slave_I2C[1]; |
32 | return empfang; |
33 | |
34 | // //Berrechnung der Feuchtigkeit. Formel aus Datasheet. für dezimalZahl
|
35 | // summe = empfang;
|
36 | // summe /= 65536;
|
37 | // summe *= 125;
|
38 | // summe += -6;
|
39 | // return summe;
|
40 | |
41 | }
|
Main.c für weiter sednung
1 | /*=========================================================
|
2 | * GLOBAL VARIABLES
|
3 | *=========================================================*/
|
4 | uint8_t uartConfig = 0, baud = 0; |
5 | uint8_t count = 0; // Zähler |
6 | uint16_t feucht = 0; |
7 | /*=========================================================
|
8 | * MAIN
|
9 | *=========================================================*/
|
10 | void main(void) { |
11 | setupClock(); |
12 | feucht = humidity(); |
13 | OpenUSART(uartConfig,baud); |
14 | putsUSART(feucht); |
15 | CloseUSART(); |
16 | |
17 | __delay_ms(100); |
18 | }// end main |
19 | /*=========================================================
|
20 | * FUNCTIONS
|
21 | *=========================================================*/
|
22 | void setupClock(void){ |
23 | //8Mhz = 0x60 4Mhz = 0x50 16Mhz= 0x70
|
24 | asm("BANKSEL OSCCON"); |
25 | asm("MOVLW 0x70"); |
26 | asm("MOVWF OSCCON"); |
27 | }
|
28 | void setupUart(void){ |
29 | //pins auf input setzten, Pic Configuriert sich die pins nach bedarf für USART
|
30 | TRISCbits.RC7 = 1; |
31 | TRISCbits.RC6 = 1; |
32 | |
33 | uartConfig = USART_RX_INT_OFF & USART_TX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_HIGH; |
34 | baud = 103; // Baudrate 9600 = 51 (8Mhz), 103(16mhz)= 9615 |
35 | }
|
Hi Tim, Du vertust Dich aber nicht mit Binär und ASCII ??? Ich weiss gerade nicht, ob putty einen binären Modus hat ?!? Wenn Du vom Feuchtesensor sagen wir mal den Wert 100 ließt, hast Du in Feucht hexadezimal 00 64 Jetzt benutzt Du puts, diese Routine sendet wahrscheinölich einen C-String. Da jetzt mit einem uint16_t anzukommen geht nicht. Mach mal so was: char buffer[8] ; // Länge des buffer anpassen !!! sprintf(buffer,"%d", feucht); putsUSART(buffer); Gruß
Marvin schrieb: > Mach mal so was: > > char buffer[8] ; // Länge des buffer anpassen !!! > > sprintf(buffer,"%d", feucht); > putsUSART(buffer); Hallo Marvin, habe es ausprobiert bekomme dann acuh werte gesendet aber es sind die falschen die umwandlung von dem uint_16 in den buffer scheint wirklich ein problem zu sein. werde die funktion mal umschreiben auf eine uint_8. mir ist aber ein weiters problem dabei aufgefallen. Das wenn ich das FTDI kabel mit dem Board verbinde er mal sendet und beim nächsten test lauf dann nicht mehr. Habe das FTDI kabel wie folgt angeschlossen. Rx -> tx, tx->rx, GND -> GND damit sie ein gemeinsames potenzial habe. habe meine Hardwaredie ich zusammen gebaut habe auch nochmal mit dem dioden test durchgepiept da sind keine brücken enthalten. Imoment weis ich selbst nicht mehr woran es liegen kann. Werde mir auch mal eigene USART lib schreiben und schauen ob es dann anständig funktioniert. danke dir gruß
Tim Halbach schrieb: > geht ein PIC kaputt wenn ich wärend der Programmierung den internen > Quartz umstelle? Welchen PIC hast du, ich kenne keinen mit internem Quarz. Ist der neu?
Hi Tim, Zum ersten: Wenn die PIC Architektur eine andere Byte Order hat als der PC musst Du das Word (2 Bytes) vor dem Konvertieren noch umsortieren... z.B. : uint8_t feucht_h, feucht_l; feucht_l = feucht & 0x00ff; feucht_h = (feucht >> 8) & 0x00ff; // Das & ... kann weggelassen werden feucht = (feucht_l << 8) + feucht_h; char buffer[8] ; // Länge des buffer anpassen !!! sprintf(buffer,"%d", feucht); putsUSART(buffer); Zum zweiten Problem: Die Fehlerbeschreibung ist etwas dürftig. Kommt auf PC Seite gar nix an oder nur Unsinn ? Steckst Du das FTDI Kabel auch aus dem USB Port des PCs raus und rein ? Passiert das immer ? Was heißt "nächster Test" ? Kabel bleibt stecken und du führst einen Reset aus ? Nur so als Beispiel: Wenn Du das Terminalprogramm auf läßt, das FTDI Kabel aber absteckst und wieder einsteckst (USB-Seite), dann musst Du das Terminalprogramm auch schließen und neu öffnen. Kommt aber nur "Unsinn", dann hat sich RX auf dem PC verschluckt. Auch dan müßte Schließen und Öffnen des Terminals helfen. Gruß
Erwin schrieb: > Welchen PIC hast du, ich kenne keinen mit internem Quarz. Ist der neu? Hi Erwin, Pic18F45K20 ich nutze den internen Quarzoszillator, keinen externen Quarz. Ich bin nciht so fingiert mit zusammen bauen von teilen bin eher der theoretiker. Ein Quarz kann ja alleine nicht schwingen er brauch ja elektronik die beiden Kondensatoren, da ich nicht weis wie man das genau anschliest nehme ich den internen Osci und sonst verwende ich fertige Quartzoscilatoren die an OSC angeschlossen werden. Gruß Tim
Tim Halbach schrieb: > Erwin schrieb: >> Welchen PIC hast du, ich kenne keinen mit internem Quarz. Ist der neu? > > Hi Erwin, > > Pic18F45K20 > > ich nutze den internen Quarzoszillator Der "internen Quarzoszillator" ist aber nur ein RC-Oszillator. Gut, dann hab ich nichts verpasst.
Wenn es dich interesiert Erwin kann ich dir sagen das dass mit den interrupt vectoren wie es bei den größeren pic ist (pic32 ds pic) auch bald für die kleineren pics gibt und mann dann nciht nur den high und low interrupt hat sondern wircklich mehrer vektroen wo mand ei prioritäten einzelnt festlegen kann. Gruß tim
Marvin schrieb: > Die Fehlerbeschreibung ist etwas dürftig. Hi Marvin, ich werde mal versuchen ein Video mit Fraps zu machen und dabei versuchen zu kommentieren, es anschliesend hochladen mit einem link damit du es dir anschauen kannst glaube das ist am sinnvollsten. Danke dir aber vielmals Marivin für deine Zeit. Gruß Tim
Thema geschlossen. Der fehler lag an einem kondesator der an dem LD1117 angeschlossen war. Marvin schrieb: > char buffer[8] ; // Länge des buffer anpassen !!! > > sprintf(buffer,"%d", feucht); > putsUSART(buffer); hat geholfen. danke Marvin Gruß Tim
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.