Probleme mit PIC16F876 als Slave

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From German to

Threaded View
Hallo NG,

seit einigen Tagen mache ich nichts anderes, als ein I2C-Slave in einen  
PIC16F876 zu implementieren, aber es will mir einfach nicht so recht  
gelingen. Ich habe schon bei uC.net gepostet, aber nicht geholfen bekommen,  
darum frage ich hier. Die Probleme habe ich schon dort geschildert:  
http://www.mikrocontroller.net/topic/362605#new
Es geht im Prinzip darum, eine vorhandene Hardware, in der der PIC vorher  
Master war, als Slave zu verwenden. Ich verwende noch 3 weitere Slaves,  
alles PCF8574, die funktionieren gut. Wenn es nicht geht, frickle ich dann  
einen PCF8574 in den PIC-Sockel.





ZU SENDENDEN Daten in die EMPFANGENEN. Leider hilft der Zwischenspeicher  
nicht dabei, wenn an und von ALLEN PCF kommuniziert wird.

Compiler ist microBASIC von MikroE. Habe nur Beispiele in C gefunden und  
adaptiert. unterdessen verstehe ich sogar, was passiert...

Aktueller Code:

dim rdummy, wdummy, I2CAdresse, schreiben, schrei, lesen, lies as byte
dim schrei1, lies1 as byte

sub procedure interrupt
  if SSPSTAT.R_W = 0 then   'Read/-Write = Read (Master -> Slave)
    if SSPSTAT.D_A = 0 then 'Data/-Address = Address
      rdummy = SSPBUF       'Dummy-Read
      SSPSTAT.BF = 0        'Flag Buffer-Full loeschen
      SSPCON.CKP = 1        'Clockstretching erlauben
      PIR1.SSPIF = 0        'SSP-Interrupt-Flag wieder loeschen
      'return
    else
      'Hier werden die empfangenen Daten ausgelesen:
      lesen = SSPBUF        'Datenbyte von SSPBUF lesen und in Variable  
einlesen
      SSPCON.CKP = 1        'Clockstretching erlauben
      PIR1.SSPIF = 0        'SSP-Interrupt-Flag wieder loeschen
      'return
    end if
  else                      'Read/-Write = Write (Slave -> Master)
    if SSPSTAT.D_A = 0 then 'Data/-Address = Address
      'Hier werden die zu sendenden Daten ins SSPBUF geschrieben:
      SSPBUF = schreiben    'Datenbyte von Variablen lesen und in SSPBUF  
schreiben
      SSPCON.CKP = 1        'Clockstretching erlauben
      PIR1.SSPIF = 0        'SSP-Interrupt-Flag wieder loeschen
      'return
    else
      SSPBUF = wdummy       'Dummy-Write, mit anderer Variable
      SSPCON.CKP = 1        'Clockstretching erlauben
      PIR1.SSPIF = 0        'SSP-Interrupt-Flag wieder loeschen
      'return
    end if
  end if
end sub

main:
  OPTION_REG =   %10000000       'Bit7: 1 = PORTB pull-ups are disabled
  TMR0       =   0
  INTCON     =   %00000000       'Disable alle Interrupts
  TRISC      =   %01111111       '1 = Input, 0 = Output
                                 'Bit0:
                                 'Bit1:
                                 'Bit2:
                                 'Bit3: SCL
                                 'Bit4: SDA
                                 'Bit5:
                                 'Bit6: TX
                                 'Bit7: (RX) Servo
  'PORTC      =   %00000000

  TRISA      =   %00111111       'Bit0:
                                 'Bit1:
                                 'Bit2:
                                 'Bit3:
                                 'Bit4:
                                 'Bit5:
                                 'Bit6,7: nicht vorhanden
  PORTA      =   0
  TRISB      =   %11011001       'Bit0:
                                 'Bit1: Pumpe ein
                                 'Bit2: EV ein

                                 'Bit4:
                                 'Bit5: Kontroll-LED
                                 'Bit6,7: Programmierstecker
  PORTB      =   0

  schreiben  = 0
  schrei     = 0
  schrei1    = 0
  lesen      = 0
  lies       = 0
  lies1      = 0

  'I2C-Hardware-Modul als Slave konfigurieren
  SSPCON  = %00110110            'Sync Serial Port Control Register 1
  SSPCON2 = %00110110            'Sync Serial Port Control Register 2
  SSPSTAT = %10000000

  'I2C Slave Adresse in SSPADD schreiben
  'Hier 0 A5 A4 A3 A2 A1 A0 R/-W
  I2CAdresse = %01000110                'hier steht die Slave Adresse
  SSPADD = I2CAdresse

  'Interrupt freigeben
  PIE1   = %00001000             'Peripheral Interrupt Enable Register 1  
(Bank 1)
  INTCON = %11000000             'Interrupt-Control-Register (Bank 1)

  while TRUE
    'Lesen
    lies1 = lies

    if lies = lies1 then
      'PORTB.5 = lies.3             'Kontroll LED
      PORTB.1 = lies.4             'Pumpe ein
      PORTB.2 = lies.5             'EV ein
      PORTC.7 = lies.6             'Servo ein
    end if

    if PORTB.1 = 1 then
      PORTB.1 = 0
    else
      PORTB.1 = 1
    end if
    'Schreiben
    'Pegel
    schrei = 7                   'Fass voll, alle Geber (1-6) ein (Logisch  
0)
    If PORTC.0 = 0 then
      schrei = 5                 'Geber 1-5 ein
    end if
    If PORTA.5 = 0 then
      schrei = 4                 'Geber 1-4 ein
    end if
    If PORTA.3 = 0 then
      schrei = 3                 'Geber 1-3 ein
    end if
    If PORTA.2 = 0 then
      schrei = 2                 'Geber 1-2 ein
    end if
    If PORTA.1 = 0 then
      schrei = 1                 'Geber 1 ein
    end if
    If PORTA.0 = 0 then          'Fass leer
      schrei = 0                 'Geber 1 aus (logisch 1)
    end if




    Delay_ms(90)                 'Warten
  wend
end.


--  
Gruss Chregu

--

Michael Eggert in de.sci.electronics



Re: Probleme mit PIC16F876 als Slave

Quoted text here. Click to load it



beim Wechsel zwischen lesen und schreiben.  

MfG
hjs

Re: Probleme mit PIC16F876 als Slave
Hallo Christian,




D/A=0:



kann. Wenn bei Deinem Code D/A=0 und R/W=1 ist, wird SSPBUF nicht gelesen,  
was Probleme macht.
Wenn R/W=1, muss danach ausserdem das erste zu lesende Datenbyte an SSPBUF  
geschrieben werden.

D/A=1 und R/W=0:


ankommt, die Registeradresse, und weitere Werte sind die Daten

D/A=1 und R/W=1:
Weitere Datenbytes (nach dem ersten bei D/A=0 und R/W=1) sollen vom Master  





Tom


Re: Probleme mit PIC16F876 als Slave
Quoted text here. Click to load it


Quoted text here. Click to load it

Quoted text here. Click to load it


Quoted text here. Click to load it

Habe ich nun probiert.

Quoted text here. Click to load it

War so schon drinn.

Quoted text here. Click to load it



Quoted text here. Click to load it



Ich sende und empfange der Einfachheit halber jeweils nur ein Datenbyte, und  
ist somit kompatibel zu einm PCF8574.


Tipps!

Quoted text here. Click to load it

Gruss Chregu



Re: Probleme mit PIC16F876 als Slave
Hallo,

was mir noch aufgefallen ist:
SSPCON und SSPCON2 werden mit den gleichen Werten (%00110110) beschrieben.
Copy-Paste-Fehler? Weil die Bits vom SSPCON2 passen nicht mit der  

SSPCON2 eigentlich gar nicht schreiben, sondern kann die Default-Werte (0)  
belassen.


des Slaves.

Tom


Re: Probleme mit PIC16F876 als Slave
Quoted text here. Click to load it

Ja, ist mir auch aufgefallen, habe aber das schon kopiert, aber richtig. Ein  

Sonst zog mir der Slave den Clock dauernd runter. Das ergab die gleichen  
Werte wie in SSPCON2. Habe das kopiert von:
http://www.stefan-buchgeher.info/elektronik/i2c_pic_slave/i2c_slave_pic_kap5.html#Kap5_2


Quoted text here. Click to load it

Quoted text here. Click to load it

Quoted text here. Click to load it


damit funktionierts Tip-Top. Schade, habe doch viel Zeit investiert.

Quoted text here. Click to load it

Gruss Chregu



Site Timeline