Forum: Mikrocontroller und Digitale Elektronik pic18f4550 und I2C (bzw. SAA1064)


von Paul K. (paul-cgn)


Lesenswert?

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

von Frank K. (fchk)


Lesenswert?

Herzlichen Glückwunsch! Du bist in die Analog-Falle getappt. Das 
passiert jedem PIC-Anfänger, aber den guten nur einmal.

Schau Dir die Pinbelegung an. SCL und SDA (RB0 und RB1) haben noch 
andere Funktionen, z.B. als analoge Eingänge. Nach einem Reset sind alle 
Pins mit Analogfunktionalität immer auf analog eingestellt. Du musst sie 
erst auf digital umstellen. Schau Dir die ADCON* Register an.

fchk

von Paul K. (paul-cgn)


Lesenswert?

Ha, super danke dir für den Tip :-)
Hatte zwar etwas zu kämpfen bis ich das richtige Kommando gefunden hatte 
aber
1
ADCON1 = 0x0f;
hat es dann getan und der controller zeigt nun wirklich etwas an! 
GROSSARTIG :-)

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.