www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC-Programmierung in C


Autor: Jochen Sch. (Firma: ---) (nechoj)
Datum:

Bewertung
0 lesenswert
nicht 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)
            // Jetzt Anweisungen im 'MASTER.c'-Programm.

                   void i2c_Start (void);
                   unsigned char i2c_SendAdress (unsigned char adress,
                   unsigned char rw); rw=1;       // adress siehe 2) oben!
                   signed char i2c_ReadAcknowledge(void); //Adr. bestätigt
                   if(ack!=1)   //???
                     {                                        //fortfahren
                       unsigned char i2c_SendByte(unsigned char byte);

                       // hier wird jetzt der im SLAVE.c-Progr. ermittel-
                       //  te 'byte-Wert auf die SDA-Leitung geschrieben.

                       signed char i2c_ReadAcknowledge(void); //bestätigt
                       // muss Abfrage nochmals vorgenommen werden?
                     } 
 // SLAVE-->MASTER:
                   void i2c_Start (void);
                   unsigned char i2c_SendAdress (unsigned char adress,
                   unsigned char rw); rw=0;       // adress siehe 2) oben!
                   signed char i2c_ReadAcknowledge(void);
                   if(ack!=1)   //???
                     {                                        //fortfahren
                       int ReadByte(void);
                     }
                    //der int return-Wert ist das übertragene byte, wel-
                    // dann in den Empängern (SLAVEs) verarbeitet wird.

                    void i2c_Stop(void);

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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze ist so nur schwer erfassbar.

Zunächst:  Wenn Du C-Code reinstellst, setze ihn bitte in Tags, also
[c]
 dann Dein Code, dann
[/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
                  void i2c_Start (void);
                   unsigned char i2c_SendAdress (unsigned char adress,
                   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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens Martin (jens-martin)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.