Forum: Mikrocontroller und Digitale Elektronik PIC-Programmierung in C


von Jochen S. (Firma: ---) (nechoj)


Lesenswert?

Hallo,

als -fast- Neuling auf diesem Sektor brauche ich noch Unterstützung und
bitte ich um kurze Beantwortung.
Es werden 2 PIC's mittels I2C-Übertragung miteinander verbunden.

a) PIC 16F877 (MASTER) 16MHz. SSPADD für 100 KHz 39, Port C3 -SCL-,
   Port C4 -SDA-.
b) PIC 16F688 (SLAVE)  Quartz ??     Port C3 -SCL-, Port C4 -SDA-.

Ablauffolge:

b) Überträgt laufend eingehende Daten von insges. 8 Schaltern an a).
Nach Verarbeitung der eingegangenen Daten überträgt a) die neuen Werte,
wieder als 8 bit Datensatz (dieselbe Datenleitung), an b) und zusätzlich 
weitere SLAVEs.
Fragen:
 1) Benötigt SLAVE-PIC selbst auch ein Quartz für den Takt? (oder genügt
    interner Takt mit Widerstand (welcher Wert) an OSC1? -ER-Mode-)
 2) Wie adressiere ich das (die) SLAVE(s)? Muß ich die selbst gewählte
    Adresse vorher im internen EEPROM abspeichern und dort dann im 
Programm
    abfragen? Bei großen PICs gibt es ein SSPADD-Register für 7
    bit-Adresse, nicht aber im PIC 16F688. (kein MSSP-Modul vorhanden)
 3) Für beide PIC's muß ein separates 'Programm.c' geschrieben werden.
    Wie lauten die versch. Anweisungen für die beiden 'Programme.c' ?
    MASTER-->SLAVE:(Anweisungen aus 'I2C.c'-Funktionen PICCLite 
entnommen)
1
            // Jetzt Anweisungen im 'MASTER.c'-Programm.
2
3
                   void i2c_Start (void);
4
                   unsigned char i2c_SendAdress (unsigned char adress,
5
                   unsigned char rw); rw=1;       // adress siehe 2) oben!
6
                   signed char i2c_ReadAcknowledge(void); //Adr. bestätigt
7
                   if(ack!=1)   //???
8
                     {                                        //fortfahren
9
                       unsigned char i2c_SendByte(unsigned char byte);
10
11
                       // hier wird jetzt der im SLAVE.c-Progr. ermittel-
12
                       //  te 'byte-Wert auf die SDA-Leitung geschrieben.
13
14
                       signed char i2c_ReadAcknowledge(void); //bestätigt
15
                       // muss Abfrage nochmals vorgenommen werden?
16
                     } 
17
 // SLAVE-->MASTER:
18
                   void i2c_Start (void);
19
                   unsigned char i2c_SendAdress (unsigned char adress,
20
                   unsigned char rw); rw=0;       // adress siehe 2) oben!
21
                   signed char i2c_ReadAcknowledge(void);
22
                   if(ack!=1)   //???
23
                     {                                        //fortfahren
24
                       int ReadByte(void);
25
                     }
26
                    //der int return-Wert ist das übertragene byte, wel-
27
                    // dann in den Empängern (SLAVEs) verarbeitet wird.
28
29
                    void i2c_Stop(void);
30
31
                    //Ende Übertragung im Programm 'MASTER.c'.

Wie müssen die Anweisungen zu obigem Datenverkehr in Programm 'SLAVE.c'
lauten? Ist die Übertragungsprozedur nur im Programm 'MASTER.c' nötig?

Für weitere Info's stehe ich gerne zur Verfügung und danke vielmals
im voraus.

Jochen

von Hc Z. (mizch)


Lesenswert?

Das ganze ist so nur schwer erfassbar.

Zunächst:  Wenn Du C-Code reinstellst, setze ihn bitte in Tags, also
1
[c]
 dann Dein Code, dann
1
[/c]
Was rauskommt, wenn Du das nicht tust, siehst Du oben.

Dann hat Dein C-Code selbst ein Riesen-Problem:  Da ist fast kein 
ausführbarer Code drin, sondern nur Deklarationen.  Beispielsweise tut
1
                  void i2c_Start (void);
2
                   unsigned char i2c_SendAdress (unsigned char adress,
3
                   unsigned char rw);
nichts (erzeugt keinen ausführbaren Code), sondern deklariert nur zwei 
Funktionen, die aber nirgends verwendet werden - zumindest nicht in dem 
Teil, den Du gezeigt hast.

Also versuch erst mal, das in Ordnung zu bringen und einen Code auf die 
Beine zu stellen, dem man ansieht, was er tun soll.

von Karl H. (kbuchegg)


Lesenswert?

Hc Zimmerer schrieb:
> Das ganze ist so nur schwer erfassbar.
>
> Zunächst:  Wenn Du C-Code reinstellst, setze ihn bitte in Tags, also
>
1
[c]
 dann Dein Code, dann
1
[/c]
Was rauskommt, wenn
> Du das nicht tust, siehst Du oben.

Hab ich mitlerweile für ihn gemacht.
Das nächste mal aber selber.

von Hc Z. (mizch)


Lesenswert?

Karl heinz Buchegger schrieb:
> Hab ich mitlerweile für ihn gemacht.

Damit sieht der Code optisch nicht mehr so übel aus.  Aber man sieht 
schneller, dass das Ganze inhaltlich keinen Sinn ergibt.  Ich denke, da 
ist ein Grundproblem vorhanden, wie man in C eine Funktion aufruft.

von Jens M. (Gast)


Lesenswert?

Jochen Sch. schrieb:
> 1) Benötigt SLAVE-PIC selbst auch ein Quartz für den Takt? (oder genügt
>     interner Takt


Wieso auch? I2C ist Flankengetriggert. Die Taktrate holst du dur aus dem 
Clk signal.

Interner OSC reicht in der Regel, wenn du langsam taktest und der Slave 
in der Zeit nichts anderes machst.

> mit Widerstand

Der ist für externe RC Beschaltung

>  2) Wie adressiere ich das (die) SLAVE(s)? Muß ich die selbst gewählte
>     Adresse vorher im internen EEPROM abspeichern und dort dann im
> Programm

Der 16F688 hat kein I2C. Du musst folglich ein Soft I2C nehmen
Ergo kann deine Adresse auch fest im Programm stehen.



>     abfragen? Bei großen PICs gibt es ein SSPADD-Register für 7
>     bit-Adresse, nicht aber im PIC 16F688. (kein MSSP-Modul vorhanden)

Das macht deine Software

>  3) Für beide PIC's muß ein separates 'Programm.c' geschrieben werden.

Richtig, eins für die Hardware Version und eines für die Software 
Version.

I2C bracht übrigens Open Collector Signale. Das ist mit µCs zwar durch 
I/O Wechsel der Ports hinzubiegen, man sollte aber wissen wie man da was 
macht.

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.