Moin! Ich versuche mich hier grade mit dem PIC18F2550 an einer I²C-Bus Schaltung. Ich habe mir bei sprut alles angelesen und auch versucht, sein Beispielprogramm für den PIC16F87x für meinen PIC abzuändern. Leider ohne Erfolg. Auf der SCL Leitung kommt nichts an und auf der SDA konnte ich mit dem Oszilloskop auch keine Signale erkennen. Vielleicht könnt ihr mir ja ein paar Tipps geben, wo mein Fehler liegt. Oder wenn ihr mehr Informationen braucht, fragt bitte. ;) Danke schonmal im Vorraus! Lg der Azu
Kannst Du den Sourcecode posten, am besten reduziert auf das Wesentliche?
Das ist es.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
Gast
#693319
Moin nochmal! Weiß jetzt schon einer mehr. Wäre echt nett. ;)
Für PIC Assembler ist das hier die falsche Ecke, sprut oder fernando-heitor sind da wohl besser geeignet.
Gast
#693348
Ist zwar kein Assembler, aber vieleicht reicht es als Tip ;)
//############################################################
void I2C_STOP(void)
{
SSPCON2bits.PEN=1; //Sende Stopcondition
while(SSPCON2bits.PEN); //warten bis Stopcondition beendet ist
}
//############################################################
void I2C_START(void)
{
SSPCON2bits.SEN=1; //Sende Startcondition
while(SSPCON2bits.SEN); //warten bis Startcondition beendet ist
}
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
Dieses Programm haben wir jetzt, aber wir können es nicht compilieren. Der Compiler meckert mit dem Error [1224] wegen dem "OSC" herum. Weiß einer Rat?
Versuchs mal mit #pragma config OSC = XT_XT //CPU=4 MHz Eventuell musst Du das Setting im Manual "PIC18 CONFIGURATION SETTINGS ADDENDUM" (Dokument 51537D) prüfen. Es gibt ein Dutzend Möglichkeiten, aber keine die nur XT heisst.
Ah tatsächlich. Danke! Im Addendum haben wir was gefunden. Es muss FOSC heißen. Jetzt sind zwar noch andere Fehler aufgetreten, aber wir versuchen es erstmal zu Fuß. Ich melde mich, wenn ich wieder Hilfe brauche. :P
So ... das Compilieren klappt nun, aber wenn wir den PIC in die fertige Schaltung einsetzen, haben wir nichtmal einen Takt auf dem CLK des I²C Bus.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
Gast
#693447
Pullups eingebaut ?
Ja die sind dran. 1,8k
Achtung! Es hat zwar keinen Einfluss auf das Fehlen des Takts, aber #pragma config FOSC = XT_XT //CPU=4 MHz .. .. SSPADD = 24; //Bus Takt 100Khz @ 10Mhz crystal 4 != 10
Ja stimmt. Bei SSPADD muss eine 9 rein. Danke! Aber das löst wie du bereits sagtest das Problem mit dem fehlenden Takt noch nicht.^^
Gast
#693512
Kein Takt kann auch bedeuten das das Programm sich
einfach aufhängt. Jetzt musst du mal feststellen wo !
Und nimm mal diese Routine.
unsigned char I2CEmpfang(unsigned char Adresse)
{
IdleI2C();
StartI2C();
while ( SSPCON2bits.SEN ); // wait until start condition is over
IdleI2C();
WriteI2C(Adresse | 0x01); // Wieso putcI2C(Adresse); ?
IdleI2C();
if ( SSPCON2bits.ACKSTAT )
{
StopI2C();
while ( SSPCON2bits.PEN ); // wait until stop condition is over
return 0; //Return 0 Not ACK
}
steps1 = ReadI2C();
IdleI2C();
AckI2C();
IdleI2C();
steps2 = ReadI2C();
IdleI2C();
AckI2C();
StopI2C();
while ( SSPCON2bits.PEN ); // wait until stop condition is over
}
Wenn ich das im Simulator teste, geht er immer zu den Abfragen und wartet auf das PIR1 bit im SSPCON Register. Das ist ja die Antwort vom Slave. Wenn ich dieses Bit manuell setze springt er weiter und wartet in der nächsten Routine auf das PIR1. So geht das immer weiter, bis der Simulator die Simulation mit Hardware Stack Underflow beendet.
Gast
#693715
Als erstes noch mal zu deinem ASM-Code >;**Schreibe Wert 5 auf Speicher-Adresse 3 in >PCF8574AP**************************** > > call i2c_on ; Bus aktiv > movlw B'01110000' ; 0 111 '000' 0 > call i2c_tx ; PCF8574AP zum Schreiben adressieren > > movlw B'00000000' ; high Teil der Adresse (Page) > call i2c_tx > movlw B'01110000' ; low Teil der Adresse > call i2c_tx > > movlw B'10101010' ; Wert der auf Adresse 3 soll > call i2c_tx > > call i2c_off ; Bus freigeben Das ist eine Sequenz für ein I2C EEPROM. Für PCF8574A nicht geeignet ! Warum nicht ? Der PCF8574 hat nur ein Register. Speicher Adressen kennt der nicht. Dann zum C-Code >#define AdresseHandrad (0xA1) Die Adresse des PCF8574A ist 0x70. Der C-Code lässt sich sicher nur mit einigen warnings compilieren. >#define AdresseHandrad (0xA1) #define mitten in der main.c unsigned char I2CEmpfang(unsigned char Adresse) gibt keinen return Wert zurück. >Wenn ich das im Simulator teste Der Simulator gibt dir sicher kein ACK. Das kann nur der Slave. Und der ist im Simulator nicht drin. >wartet auf das PIR1 bit im SSPCON Register PIR1 ist ein Register. SSPCON ist ein Register. PIR1 kann kein Bit in SSPCON sein. Beim PIC18F2550 gibt es auch nur SSPCON1 und SSPCON2. SSPCON kennt der nicht.
Gast
#694170
Danke für die ausführliche Antwort! Also ds Beste wäre für uns, wenn wir den ASM Code ans Laufen kriegen würden. Vielleicht hilft uns dein Tipp da ja schon. Mal schauen. Ja, dass der Simulator mir kein ACK geben kann, weiß ich. Daher meinte ich ja das mit dem SSPCON und dem PIR1. Hab mich da etwas vertan. Ich meinte das SSPIF Bit im PIR1 Register. Darauf wartet das Programm im Simulator ständig und wenn ich ihm das manuell gebe, springt er in die nächste Schleife und wartet wieder auf das SSPIF, bis er irgendwann mit Hardware Stack Underflow endet.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.