Problem med PIC18F46K22 "LÖST"

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
SeniorLemuren
Inlägg: 8397
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Problem med PIC18F46K22 "LÖST"

Inlägg av SeniorLemuren »

Nu har jag kört i diket.
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);
}
led har jag satt med för att se om det snurrar och det gör det så länge jag inte försöker göra write. Se slutet på den medskickade header-filen. Den hänger sig vid första writen:

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.
Senast redigerad av SeniorLemuren 21 juli 2015, 11:27:13, redigerad totalt 2 gånger.
Användarvisningsbild
SeniorLemuren
Inlägg: 8397
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med PIC18F4622

Inlägg av SeniorLemuren »

Bump! Ingen som har något tips. Jag har läst datablad så ögonen blöder men har säkert missat något viktigt. :doh:

Jag använder ju mikroC PRO I2C lib för detta och för "void I2C1_Init(const unsigned long clock);" kan man läsa
Note : Calculation of the I²C clock value is carried out by the compiler, as it would produce a relatively large code if performed on the library level. Therefore, compiler needs to know the value of the parameter in the compile time. That is why this parameter needs to be a constant, and not a variable.
När jag använder PIC18F2545 så skriver jag "I2C1_Init(100000);" och det funkar ju för den modellen. Det borde väl vara det samma för PIC18F46K22" men av någon anledning så har jag fått för mig att problemet är att härleda till felaktig klocka, men vet inte hur?

Kan ju även vara något annat register som felar. Eftersom uträkningen av rätt klockvärde görs i kompilatorn så kan det ju även vara bugg där. Jag har beskrivit problemet i mikroC forum men det är segt att få hjälp där på helgen. Supporten håller till på forumet på vardagarna.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med PIC18F46K22

Inlägg av sodjan »

Det är också viktigt att man faktiskt kör på den hstighet som
man har sagt till kompilatorn att man kommer att köra med.
Användarvisningsbild
SeniorLemuren
Inlägg: 8397
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med PIC18F46K22

Inlägg av SeniorLemuren »

Ja, så långt (tror jag) att jag är med. Här är hur jag testat i config avseende oscillatorn:
// CONFIG1H
#pragma config FOSC = INTIO67 // Oscillator Selection bits (Internal oscillator block)
#pragma config PLLCFG = OFF // 4X PLL Enable (Oscillator used directly)
#pragma config PRICLKEN = ON // Primary clock enable bit (Primary clock is always enabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
// Till kompilatorn har jag angivit 16 MHz (den interna osc)

// I programmet har jag testat med
OSCCON = 0b01110010 ; // 16 MHz direkt från osc
OSCTUNE.PLLEN=0;

// Alternativt har jag angivit 8 MHz till kompilatorn och i programmet
OSCCON = 0b01100010 ; //Alternativt 0b01100000,
OSCTUNE.PLLEN=0;

//Med PIC18F4550 som fungerar som det skall, så har jag angivit 8 MHz (den interna osc)
OSCCON = 0b011100000 ;

När jag kollat i databladet kom jag att hitta något jag inte förstod. Där finns ju ett register som heter SSPxCON1 där x är endera av de 2 SPI-modulerna.
Skriver man t.ex : SSP1CON1 = 0b00100000 (Enables the serial port) så är det godkänt.
om man däremot försöker sätta bara bit 5 "SSP1EN_bit = 1 ;" så får man rött streck under. Däremot går det att skriva: SSPEN_bit = 1 ; Som ju är för tex PIC18F2545 som bara har en SPI-modul?

Edit: Ja nu skall jag ju inte använda mig av SSP1EN_bit eftersom det där skall skötas av libraryfunktionen. Men det var en fundering. Men en dag kanske man vill skriva egna funktioner till SPI-modulen.
janno
Inlägg: 430
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: Problem med PIC18F46K22

Inlägg av janno »

Har du bytt ut processorn rakt av på samma kort, eller har du en ny uppkoppling?

Det var ett tag sen jag använde I2C, var nog på en PIC18F4550 det med. Jag har kört mycket med PIC18F46K22 på sistone men inte prövat I2C på den, jag har hållit mig till SPI.
Det jag kan komma ihåg var att jag några gånger glömde pull-up motstånden för bussen och slet mitt hår nån dag innan jag kom på att det var felet.
Du har inget oscilloskop eller logikanalysator du kan koppla in och kolla på SCL och SDA trådarna?
Användarvisningsbild
SeniorLemuren
Inlägg: 8397
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med PIC18F46K22

Inlägg av SeniorLemuren »

Jag har det på ett experimentkort och jag bara skiftar µC och SPI-portar. Jag har inga pullup på SDA/SCL varken på 4550 eller 4622 och använder inte heller WPU på 4550. Jag har inte sett att man kräver pullup på den OLED jag använder. men det kostar ju inget att testa.
janno
Inlägg: 430
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: Problem med PIC18F46K22

Inlägg av janno »

SPI behöver ingen pull-up, men I2C kräver det, då bussen ska vara +5V vilande och aktivt låg.
Kör du SPI eller I2C?
Användarvisningsbild
SeniorLemuren
Inlägg: 8397
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med PIC18F46K22

Inlägg av SeniorLemuren »

Aj, du. Jag kör I2C men jag har ingen pullup på PIC18F4550 och det fungerar klockrent utan varken yttre eller WPU, men jag skall genast leta upp ett par 10k Skall bara få i mig en kopp kaffe först. :)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46929
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Problem med PIC18F46K22

Inlägg av TomasL »

4k7är nog bättre som pullup, lägsta resistansen är (Vdd-0,4)/3 mA har jag för mig och högsta är beroende på hastigheten antingen 1000/Cbus eller 300/Cbus
Sidan 55 i denna pdf: http://www.nxp.com/documents/user_manual/UM10204.pdf
Användarvisningsbild
SeniorLemuren
Inlägg: 8397
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med PIC18F46K22

Inlägg av SeniorLemuren »

Synd att jag redan hade pillat dit 10k och ingen funktion med det. Det underliga är ju att PIC18F4550 funkar utan problem på samma kort. Ok jag byter ner till 4k och testar. Sedan är det risk för sjösättning av 1 st experimentkort med vidhängande PIC18F46K22. :wall:
Användarvisningsbild
SeniorLemuren
Inlägg: 8397
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med PIC18F46K22

Inlägg av SeniorLemuren »

Bytt till 3k2 hade inget 4k7 fortfarande stendött. :evil:

Edit: har lagt till lite bilder här som visar hur OLEd skall användas. som jag strular med här. Kommer i slutet av tråden. :)
janno
Inlägg: 430
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: Problem med PIC18F46K22

Inlägg av janno »

Hmm... Jag satte mig och titta på databladen och MSSP porten ligger på olika pinnar på de där kretsarna.
PIC18F4550 har:
PIN34 - RB1 - SCL
PIN33 - RB0 - SDA

PIC18F46K22 har:
PIN18 - RC3 - SCL1
PIN23 - RC4 - SDA1

PIN19 - RD0 - SCL2
PIN20 - RD1 - SDA2

Har du ändrat pinnar på experimentkortet där du kopplar in OLED skärmen?
Användarvisningsbild
SeniorLemuren
Inlägg: 8397
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med PIC18F46K22

Inlägg av SeniorLemuren »

Tack. I andra meningen på mitt första inlägg skev jag:
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 är ju naturligtvis tacksam för all hjölp som jag kan få. Men läser man inte tråden från början för att få med den information som ges, så blir det svårt att hjälpa. :)
janno
Inlägg: 430
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: Problem med PIC18F46K22

Inlägg av janno »

Ursäkta att jag missade det, ändå gick jag tillbaka och sökte den informationen, men missade den.
Jag försöker bara systematiskt utesluta fel som man enkelt kan göra.
En annan sak som jag funderade över men inte hittat i tråden tidigare, hur talar man om för MikroC Pro's bibliotek vilken PIC man använder.
Eftersom du skrev så här:
Skriver man t.ex : SSP1CON1 = 0b00100000 (Enables the serial port) så är det godkänt.
om man däremot försöker sätta bara bit 5 "SSP1EN_bit = 1 ;" så får man rött streck under. Däremot går det att skriva: SSPEN_bit = 1 ; Som ju är för tex PIC18F2545 som bara har en SPI-modul?
Så kanske omgivningen tror att du har en annan processor än den som sitter i labbkortet.
Användarvisningsbild
SeniorLemuren
Inlägg: 8397
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med PIC18F46K22

Inlägg av SeniorLemuren »

Man anger typ och config när man skapar ett projekt, mikroC ger då tillgång bara till de library-funktioner som fungerar just för den processorn. Så där finns ingen möjlighet till fel.
mikiroCEditProjekt.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar