Hallo zusammen, seit längerem bin ich hier im forum passiv unterwegs und auf viele informative Beiträge gestoßen die mir bei meinem autodidaktischen Einstieg in die Welt der Mikrocontroller geholfen haben. Dafür einmal an alle Beteiligten :-) Nun zu meinem Problem. Ich habe auf einem Breadboard mal eine recht simple Schaltung aufgebaut mit der ich versuche mit einem pic18f4550-I/P (Datenblatt: http://ww1.microchip.com/downloads/en/DeviceDoc/39632e.pdf) über den I2C Bus mit einem LED Controller vom typ SAA1064 (Datenblatt: http://atc.ugr.es/~afdiaz/fich/saa1064.pdf) zu kommunizieren. Der Mikrocontroller bekommt seinen Strom aus einem In-circuit Programmer (ICD2 Kompatibel) welcher seinen Strom wiederum aus dem USB Bus meines Rechners bezieht (ggf. ist das später nochmal wichtig bei meiner Fragestellung aufgrund der Stromstärkenbeschränkung des USB buses, auch wenn ich das nicht glaube bei den Paar komponenten). Den I2C Bus habe ich an den PINs RB0 (=SDA) und RB1 (=SCL) des PIC angeschlossen. Die Pullups der beiden Leitungen habe ich mittels 10K (0,6W) Widerstand gegen +5V realisiert. Die Kabel zwischen PIC (I2C Master) und SAA1064 (I2C slave) sind ca 5 cm lang, ist ja alles auf dem selben Breadboard. Den PIC betreibe ich mit einem externen Quarz auf 20 Mhz. Der PIC arbeitet an sich korrekt (hab ein paar freie Ausgänge mit LEDs verschaltet die ich blinken lasse und eine LED die ich mit PWM in der Helligkeit variiere) nur bekomme ich aus dem LED controller partout kein Lebenszeichen. Für das Senden der I2C Kommandos nutze ich die I2C Library von MPALBs C18 (Datenblatt: http://www.electro-tech-online.com/custompdfs/2009/02/C18_libraries-7.pdf Seite 25 für den I2C Krempel) Compiler (ach ja, damit sollte auch klar sein dass ich in C programmiere :-)). Da ich vorerst nur ein 7-Segment LED (Typ "Kingbright SA56-11YWA, mit gemeinsamer Anode, Datenblatt: http://datasheet.octopart.com/SA56-11YWA-Kingbright-datasheet-43767.pdf) mit dem SAA1064 ansteuern möchte, will ich den Controller im "static" Modus betreiben (also ohne Multiplexing), dazu habe ich Ihn wie im Datenblatt (link siehe oben) auf Seite 13 beschrieben verdrahtet (wobei in dem Daten blatt nichts zu dem zu verwenden Widerstand zwischen PIN12 und PIN13 zu finden war, daher hab ich einfach mal 470nf genommen...hoffe das war jetzt nicht ein kapitaler Fehler). den SAA1064 habe ich die Slave Write Adresse 0x70 gegeben indem ich den PIN1 auf Ground gelegt habe. Mein C Programm sieht im wesentlichen so aus (wobei der Code nach dem senden der I2C Daten eigentlich uninteresant ist, da hier nur noch die LEDs zum blinken gebracht werden):
1 | #include <p18f4550.h> |
2 | #include <delays.h> |
3 | #include <i2c.h> |
4 | |
5 | #pragma config FOSC = HS
|
6 | #pragma config WDT = OFF //Disable watchdog timer
|
7 | |
8 | #define LEDPin0 LATDbits.LATD0 //Define LEDPin as PORT D Pin 0
|
9 | #define LEDTris0 TRISDbits.TRISD0 //Define LEDTris as TRISD Pin 0
|
10 | #define LEDPin1 LATDbits.LATD1 //Define LEDPin as PORT D Pin 1
|
11 | #define LEDTris1 TRISDbits.TRISD1 //Define LEDTris as TRISD Pin 1
|
12 | #define LEDPin2 LATDbits.LATD2 //Define LEDPin as PORT D Pin 2
|
13 | #define LEDTris2 TRISDbits.TRISD2 //Define LEDTris as TRISD Pin 2
|
14 | #define LEDPin3 LATDbits.LATD3 //Define LEDPin as PORT D Pin 2
|
15 | #define LEDTris3 TRISDbits.TRISD3 //Define LEDTris as TRISD Pin 2
|
16 | |
17 | void fadeInOut(void); /* Prototype */ |
18 | |
19 | void main() |
20 | {
|
21 | //I2C Kommunikation mit SAA1064
|
22 | OpenI2C(MASTER, SLEW_OFF);// Initialize I2C module |
23 | SSPADD = 39; //400kHz Baud clock(9) @16MHz |
24 | //100kHz Baud clock(39) @16MHz (scheint bei 20MHz auch zu 100kHz zu führen)
|
25 | |
26 | StartI2C(); |
27 | WriteI2C(0x70); |
28 | WriteI2C(0x00); |
29 | WriteI2C(0B11001110); |
30 | StopI2C(); |
31 | |
32 | //PWM für LED dimmer
|
33 | TRISCbits.TRISC2 = 0 ; // setzt den P |
34 | LATCbits.LATC2 = 0 ; // clear PORT |
35 | PR2 = 62; // 62 aus berechnung |
36 | T2CON = 0b00000110 ; /// Vorteiler 1:16 |
37 | CCP1CON = 0b00001100 ; // Schaltet PWM ein bit 3 & 4 |
38 | |
39 | //Port Konfiguration für LEDs
|
40 | LEDTris0 = 0;//Set LED Pin data direction to OUTPUT |
41 | LEDTris1 = 0;//Set LED Pin data direction to OUTPUT |
42 | LEDTris2 = 0;//Set LED Pin data direction to OUTPUT |
43 | LEDTris3 = 0;//Set LED Pin data direction to OUTPUT |
44 | LEDPin0 = 1;//Set LED Pin |
45 | LEDPin1 = 0;//Set LED Pin |
46 | LEDPin2 = 0;//Set LED Pin |
47 | LEDPin3 = 0; |
48 | |
49 | while(1){ |
50 | fadeInOut(); //trigger PWM Magic on Port C PIN 2 |
51 | if(LEDPin0 == 1){ |
52 | LEDPin0 = 0;//Toggle LED Pin |
53 | LEDPin1 = 1;//Toggle LED Pin |
54 | LEDPin2 = 0;//Toggle LED Pin |
55 | LEDPin3 = 0;//Toggle LED Pin |
56 | } else if(LEDPin1 == 1){ |
57 | LEDPin0 = 0;//Toggle LED Pin |
58 | LEDPin1 = 0;//Toggle LED Pin |
59 | LEDPin2 = 1;//Toggle LED Pin |
60 | LEDPin3 = 0;//Toggle LED Pin |
61 | } else if(LEDPin2 == 1){ |
62 | LEDPin0 = 0;//Toggle LED Pin |
63 | LEDPin1 = 0;//Toggle LED Pin |
64 | LEDPin2 = 0;//Toggle LED Pin |
65 | LEDPin3 = 1;//Toggle LED Pin |
66 | } else if(LEDPin3 == 1){ |
67 | LEDPin0 = 1;//Toggle LED Pin |
68 | LEDPin1 = 0;//Toggle LED Pin |
69 | LEDPin2 = 0;//Toggle LED Pin |
70 | LEDPin3 = 0;//Toggle LED Pin |
71 | }
|
72 | Delay10KTCYx(20); |
73 | }
|
74 | }
|
75 | |
76 | void fadeInOut(){ |
77 | unsigned char dc ; |
78 | for(dc = 0 ; dc < PR2 ; dc++){ |
79 | CCPR1L = dc ; |
80 | Delay10KTCYx(5); |
81 | }
|
82 | for(dc = PR2 ; dc > 0 ; dc--){ |
83 | CCPR1L = dc ; |
84 | Delay10KTCYx(5); |
85 | }
|
86 | }
|
Leider habe ich kein Oszilloskop um zu sehen ob der PIC überhaupt sendet, daher stehe ich nun etwas auf dem Schlauch wie ich den Fehler in meiner Logik finden kann....möchte auch nicht ausschließen dass ich den SAA1064 bei meinen Versuchen fritiert habe. Wo fange ich am besten mit der Suche an? Jeder Hinweis ist gerne gesehen. Danke & Gruß Paul