Jag har ändrat om ett lib för OLED (SDD1303 SPI) skrivet i MPLAB X för PIC18F2550 till mikroC PRO och PIC 18F4550 för I2C i stället för SPI. Det var inga problem, funkade direkt.
Nu ville jag byta till en PIC18F46K22 och där är det tvärstopp. Jag har kopplat SDA1 till RC4 och SCL1 RC3 på IC18F46K22. Jag har även testat med SDA2 på RD1 och SCL2 på RD0.
Jag har testat att sätta
OSCCON = 0b01100010 ;
OSCTUNE.PLLEN=0;
för att köra på samma klockfrekvens som PIC18F4550 men icke. Vad har jag missat som skiljer de båda PIC:arna åt mer än interna klockan 8 resp 16 MHz och pinnarna för SDA/SCL
Jag har gjort ett kort testprogram som ser ut så här:
Kod: Markera allt
#include "font.h"
#include "SSD1306.h"
#define led_On LATD5_bit = 1 ;
#define led_Off LATD5_bit = 0 ;
void main() {
ADCON1 = 0b00001111 ; // Configure AN pins as digital I/O
TRISA = 0b00100000 ;
TRISB = 0b00000000 ;
TRISC = 0b00000000 ;
TRISD = 0b00000000 ;
TRISE = 0b00000000 ;
LATE = 0b00000000 ;
LATB = 0b00000000 ;
LATC = 0b00000000 ;
LATD = 0b00000000 ;
ANSELC = 0b00000000 ;
OSCCON = 0b01110010 ; // Alternativt OSCCON = 0b01100010 ;(8MHz)
OSCTUNE.PLLEN=0;
while (OSCCON.HFIOFS==0); // wait stable oscillator
I2C1_Init(100000);
Oled_Init(); //***** SSD1306.h *****
Oled_FillScreen(0x00);
Oled_SetFont(Terminal12x16, 12, 16, 32,127);
Oled_FillScreen(0x00);// Clear display
Oled_ConstText("*TROTTLE* ", 0,0) ;
do {
led_On;
delay_ms(500) ;
led_Off;
delay_ms(500) ;
}while(1);
}
Kod: Markera allt
#ifndef SSD1306_H
#define SSD1306_H
//12C_ADDRESS 0x78
//Declaration of global variables.
//------------------------------------------------------------------------------
typedef char schar;
typedef unsigned char uchar;
typedef const char cschar;
typedef const unsigned char cuchar;
typedef int sint;
typedef unsigned int uint;
cuchar *font, *font2;
uchar width, height, minimum, maximum;
// Function Prototypes.
//------------------------------------------------------------------------------
void Oled_Init(void);
void Oled_Command(uchar cmd);
void Oled_WriteRam(uchar dat);
void Oled_SetPointer(uchar seg, uchar pag);
void Oled_SetFont(cuchar *_font, uchar _width, uchar _height, uchar _min, uchar _max);
void Oled_WriteChar(uchar c, uchar seg, uchar pag);
void Oled_ConstText(cschar *buffer, uchar seg, uchar pag);
void Oled_Text(schar *buffer, uchar seg, uchar pag);
void Oled_FillScreen(uchar pattern);
void Oled_Image(cuchar *buffer);
void Right_HorizontalScroll(uchar start_page, uchar end_page, uchar set_time);
void Left_HorizontalScroll(uchar start_page, uchar end_page, uchar set_time);
void VerticalRight_HorizontalScroll(uchar start_page, uchar end_page, uchar set_time);
void VerticalLeft_HorizontalScroll(uchar start_page, uchar end_page, uchar set_time);
void Deactivate_Scroll(void);
void Activate_Scroll(void);
//------------------------------------------------------------------------------
// Initializes the OLED module.
//------------------------------------------------------------------------------
void Oled_Init(void){
Delay_ms(500);
Oled_Command(0xAE); // Set Display OFF
Oled_Command(0x81); Oled_Command(0xCF); // Set Contrast Control
Oled_Command(0xA4); // Entire Display ON
Oled_Command(0xA6); // Set Normal
Oled_Command(0x20); Oled_Command(0x02); // Set Memory Addressing Mode
Oled_Command(0x00); // Set Lower Column
Oled_Command(0x10); // Set Higher Column
Oled_Command(0xB0); // Set Page Start
Oled_Command(0x40); // Set Display Start Line
Oled_Command(0xA1); // Set Segment Re-map
Oled_Command(0xA8); Oled_Command(0x3F); // Set Multiplex Ratio
Oled_Command(0xC8); // Set COM Output
Oled_Command(0xD3); Oled_Command(0x00); // Set Display Offset
Oled_Command(0xDA); Oled_Command(0x12); // Set COM Pins Hardware Configuration
Oled_Command(0xD5); Oled_Command(0x80); // Set Display Clock
Oled_Command(0xD9); Oled_Command(0xF1); // Set Pre-charge Period
Oled_Command(0xDB); Oled_Command(0x40); // Set VCOMH Deselect Level
Oled_Command(0x8D); Oled_Command(0x14); // Charge Pump Setting
Oled_Command(0xAF); // Set Display ON
Oled_FillScreen(0x00); // Clear screen
}
// Write command.
//------------------------------------------------------------------------------
void Oled_Command(uchar cmd){
I2C1_Start();
I2C1_Wr(0x78); // ******************Här hänger det sig ******************
I2C1_Wr(0x00); // Co = 0, D/C = 0
I2C1_Wr(cmd);
I2C1_Stop();
}
//------------------------------------------------------------------------------
// Headerfilen fortsätter här men jag klippte här eftersom man inte kommer längre än hit.