1 | #include <htc.h>
|
2 | #include <pic12f1840.h>
|
3 | #include "delay.h"
|
4 | #include "I2C_Treiber_PIC12F1840.h"
|
5 |
|
6 | /* Variablen fuer die I2C Kommunikation */
|
7 | /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
8 | unsigned char I2C_Adresse = 0x70; // I2C_Adresse
|
9 | unsigned char Befehl = 0; // Ankommende Kommandos
|
10 | unsigned char I2C_Daten[2] = {0x53, 0xAA}; // Feld für die I2C Übertrageung und wird mit Werten gefühlt
|
11 | unsigned char Write; // Variable Write für 2x Senden der Tachowerte(2 x Byte).
|
12 | bit I2C_Status = 0, Read = 0; // Statusvariable für den Eingang an Daten. Read für Schreibender parameter (I2C_Level)
|
13 | bit I2C_level_Bit = 0; // Statusbit zum löschen von I2C_level
|
14 | unsigned char i, loop = 10; // Schleifenvariablen
|
15 |
|
16 | unsigned char Wert_MA = 0;
|
17 |
|
18 |
|
19 | /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
20 |
|
21 |
|
22 |
|
23 | /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
24 | void interrupt my_isr(void)
|
25 | {
|
26 | if(SSP1IE && SSP1IF) // Interrupt wird ausgelöst wenn der Interrupt Enable gesetzt ist und das Interrupt Flag gesetzt ist
|
27 | {
|
28 | /*------Schreiben----------------------------------------------------------------*/
|
29 | if(R_nW) // Antwort von Slave
|
30 | {
|
31 | I2C_Daten[0] = 0x53; // Beschreibe die Stelle 1 des Felds I2C_Daten
|
32 | I2C_Daten[1] = 0xAA; // Beschreibe die Stelle 2 des Felds I2C_Daten
|
33 |
|
34 | SSP1BUF = I2C_Daten[Write]; // Schreibe die Daten in den SSP1BUF der die Daten über I2C überträgt
|
35 | CKP = 1; // Setze das Bit CKP
|
36 | SSP1IF = 0; // Lösche das Interrupt Flag
|
37 | I2C_Daten[Write] = 0; // Lösche die Daten die gerade übertragen wurden
|
38 | for(i = 0; i < loop; i++) // Warten bis die übertragung vollständig ist
|
39 | {
|
40 | if(!BF) break; // Warten bis die übertragung vollständig ist
|
41 | }
|
42 | if (I2C_ReadAck()) // Zweiter Byte wird angefragt
|
43 | {
|
44 | Write++; // Index wird erhöht
|
45 | if(Write > 1) Write = 0; // Maximal 2 Byte sind möglch
|
46 | }
|
47 | else Write = 0; // wenn nicht lösche die Variable Write
|
48 | // Read = 0;
|
49 | }
|
50 |
|
51 |
|
52 | /*------Lesen----------------------------------------------------------------*/
|
53 | if(!R_nW) // Befehle vom Master
|
54 | {
|
55 | if (SSP1BUF == I2C_Adresse) SSP1BUF = 0; // Adresse im Register? Dann SSPBUF löschen
|
56 | else
|
57 | {
|
58 | Befehl = SSP1BUF; // Befehl wird gespeichert
|
59 | I2C_Status = 1; // Nach dem Eingang der Daten wird Status Bit gesetezt
|
60 | }
|
61 | SSP1IF = 0; // Lösche das Interrupt Flag
|
62 | }
|
63 |
|
64 | if (SSPOV) SSPOV = 0; // Überlauf Bit wird gelöscht
|
65 |
|
66 | }
|
67 | }
|
68 |
|
69 | //------------------------------------------------------------------------------
|
70 | void main()
|
71 | {
|
72 | ANSELA = 0xFF; // Konfiguriere den PORTA als Digital
|
73 | TRISA = 0x00; // Setze das TRISA Register auf 0 => Ausgang
|
74 | PORTA = 0x00; // Lösche den PORTA
|
75 | I2C_Init_Slave(); // Initialisieren den Controller als Slave
|
76 | ei(); // Enable Interrupt
|
77 |
|
78 | while(1)
|
79 | {
|
80 | if(Befehl == 1) // Wenn die Variable Befehl den Wert 1 hat
|
81 | {
|
82 | RA0 = 1; // dann setze RA0 auf 1 => LED
|
83 | }
|
84 |
|
85 | if(Befehl == 2) // Wenn die Variable Befehl den Wert 2 hat
|
86 | {
|
87 | RA2 = 1; // dann setze RA2 auf 1 => LED
|
88 | }
|
89 |
|
90 | if(Befehl == 3) // Wenn die Variable Befehl den Wert 3 hat
|
91 | {
|
92 | RA4 = 1; // dann setze RA4 auf 1 => LED
|
93 | }
|
94 | }
|
95 |
|
96 | }
|