Нещо не е наред с PIC18F4620?

I

insaniac

Guest
Аз съм мигриращите ми PIC18F452 код на PIC18F4620 и аз съм остана с кода по I2C.Какво е движение глоба от 452 сега не е в 4620.
Има ли някой, срещнати по този вид проблеми.

Prety Това е много важно за мен да се направи това нещо работата си така, всякакъв вид помощ ще бъдат оценени.

Благодаря на всички ви.

 
Имах същия проблем, когато аз предвещавам един роб I2C кода от 18F452 да 18F6520.

PM ме кода си и аз ще погледна, ако искаш.

с най-добри пожелания

 
Функциите на i2c ми код са тези, целият код е малко по-сложна, но има само функции, призовава тези функции, показани по-горе.
Аз със сигурност не знам какво може да бъде погрешно, всяка покана за изпращане и получаване на функциите чака автобус да бъде празен, аз съм проверка на правото бита навсякъде, и нарастващите и попадащи пъти ми часовник се в информационния лист's ценности.

нищожен Init_i2c (Void)
(
Чар Х;

TRIS_SDA = Input;
TRIS_SCL = Input;

SSPSTAT = 0b10000000;
SSPCON1 = 0b00111000;
SSPCON2 = 0b00000000;
SSPADD = 0x63; / / ниска CLK Freq -> 25 [KHz]

х = SSPBUF / / манекен четат проясни BF

SSPIE = 0;
SSPIP = 0;
SSPIF = 0;
PEIE = 1;
)нищожен I2CIdle (Void)
(
докато ((SSPCON2 & 0x1F) | (RW))
(
IF (SSPIF)
SSPIF = 0;
продължи;
)
)

нищожен Send_i2c (Чар datoX)
(
Чар ackflag = 0;

правя
(
докато ((SSPCON2 & 0X1F) | RW) / / == i2c_idle ();
продължи;
Data_Buf = datoX;
докато (BF);
SSPIF = 0;
IF (ACKDT)
(
ackflag = 1;
)
) докато (ackflag);
)

Чар Receive_i2c (Чар Назад)
(
Чар г;
I2CIdle (); / / Уверете се, че автобусът е празен
RCEN = 1; / / Давам възможност на Рецепция
докато (RCEN & & BF); / / Изчакайте BF флаг да бъде определен.
IF (ACKSTAT == 0)
I2CAck ();
в противен случай
I2CNack ();
връщане (SSPBUF); / / връщане на стойността.
)

нищожен Start_i2c (Void)
(
I2CIdle (); / / Уверете се, че автобусът е празен
СОП = 1; / / Изпращане малко на проекта
докато (СОП); / / чакай го, за да изчистите
)

нищожен Restart_i2c (Void)
(
I2CIdle (); / / Уверете се, че автобусът е празен
RSEN = 1; / / Изпращане рестартирате малко
докато (RSEN); / / чакай го, за да изчистите
)

нищожен Stop_i2c (Void)
(
I2CIdle (); / / Уверете се, че автобусът е празен
ACKDT = 1; / / в стаята за Nack
ACKEN = 1; / / изпрати Nack
PEN = 1; / / изпрати спрете малко
докато (PEN) / / чакай го, за да изчистите
IF (SSPIF)
SSPIF = 0; / / Изчистване на прекъсване флаг
)

нищожен I2CAck (Void)
(
IF (SSPIF)
SSPIF = 0;
ACKDT = 0; / / в стаята за Ack
ACKEN = 1; / / Изпращане Ack
)

нищожен I2CNack (Void)
(
IF (SSPIF)
SSPIF = 0;
ACKDT = 1; / / в стаята за Nack
ACKEN = 1; / / изпрати Nack
)

Благодаря за помощта!Аз наистина се нуждаете от ръка в тозиAdded след 1 час 17 минути:За съжаление, кодът е показал пред няколко грешки, това е началото на едно много бъгове версия на кода.
Коригираният версия на i2c функции са тези.За съжаление за ненавремененнищожен Init_i2c (Void)
(
Чар Х;
TRIS_SDA = Input;
TRIS_SCL = Input;

SSPSTAT = 0b10000000;
SSPCON1 = 0b00111000;
SSPCON2 = 0b00000000;
SSPADD = 0x63;
х = SSPBUF / / манекен четат проясни BF

SSPIE = 0;
SSPIP = 0;
SSPIF = 0;
PEIE = 1;
)

нищожен I2CIdle (Void)
(
докато ((SSPCON2 & 0x1F) | (RW))
(
IF (SSPIF)
SSPIF = 0;
)
)

нищожен Send_i2c (Чар datoX)
(
Чар ackflag = 0;

правя
(
докато ((SSPCON2 & 0X1F) | RW) / / == i2c_idle ();
(
IF (SSPIF)
SSPIF = 0;
)
Data_Buf = datoX;
докато (BF);
интегрирани = 0;
IF (ACK_recep)
(
ackflag = 1;
)
) докато (ackflag);
)

Чар Receive_i2c (Чар Назад)
(
Чар г;
I2CIdle (); / / Уверете се, че автобусът е празен
RCEN = 1; / / Разрешаване Получаване
докато (RCEN); / / Изчакайте rcen флаг, да се изчиства.
SSPIF = 0;
IF (АСК == 0)
(
ACKDT = 0;
ACKEN = 1;
)
в противен случай
(
ACKDT = 1;
ACKEN = 1;
)
D = SSPBUF;
връщане (г); / / връщане на стойността.
)

нищожен Start_i2c (Void)
(
I2CIdle (); / / Уверете се, че автобусът е празен
СОП = 1; / / Изпращане малко на проекта
докато (СОП); / / чакай го, за да изчистите
)

нищожен Restart_i2c (Void)
(
I2CIdle (); / / Уверете се, че автобусът е празен
RSEN = 1; / / Изпращане рестартирате малко
докато (RSEN); / / чакай го, за да изчистите
)

нищожен Stop_i2c (Void)
(
I2CIdle (); / / Уверете се, че автобусът е празен
PEN = 1; / / изпрати спрете малко
докато (PEN) / / чакай го, за да изчистите
)

Благодаря отново!

 
Взех един бърз поглед към вашия съчетания.

Вашият send_i2c рутинни получава, когато остана ackflag получава в стаята.

Обърнете внимание на тези практики тук:
http://www.microchipc.com/sourcecode/PIC_Hi-Tech_C_I2C_for_EEPROM_24LC01B.zip

с най-добри пожелания

 
/************************************************* ********************
* Име: * lcddemo.c
* Дата: 10/19/2002 *
* Редактиране от Ямато "Виж, Goldenchip Електронни Ко ООД*
* *
* Телефон: * 86-0591-3375855-721
* *
************************************************** *******************/
# включват <p18f458.h>
/ / # включват <stdio.h>原来有此头文件,估计是用УСВ或HiTech-C调试的
# включват "lcd.h"
# включват "i2c.h"
# включват "stdlib.h"
# включват "usart.h"

# определят uchar грозен Чар
# определят UINT грозен Intекстернант невалидни Init_Lcd (Void);
екстернант невалидни Line_1 (Void);
екстернант невалидни Line_2 (Void);
екстернант невалидни Write_Lcd_Data (грозен Чар);
екстернант невалидни Write_Lcd_Cmd (грозен Чар);

статични летливи грозен remdata Чар;
нищожен InterruptHandlerHigh (Void);# ргадта код InterruptVectorHigh = 0x08
нищожен InterruptVectorHigh (Void)
(
_asm
Отидох в InterruptHandlerHigh
_endasm
)
# ргадта код
# ргадта прекъсват InterruptHandlerHigh
нищожен InterruptHandlerHigh ()
(
докато (PIR1bits.RCIF == 1)
(
remdata = RCREG;
)
)

нищожен Initialize_I2C_Master (Void);
нищожен EE_Page_Write (грозен Чар, грозен Чар, грозен Чар, грозен Чар *);
нищожен EE_SEQU_Read (грозен Чар, грозен Чар, грозен Чар, грозен Чар *);
нищожен EEPROM_Write (грозен Чар, грозен Чар, грозен Чар);
нищожен EEPROM_ACK (грозен Чар);
грозен Чар EEPROM_Read (Чар грозен, грозен Чар);
нищожен I2C_Done (Void);
нищожен Initialize_Timer2 (Void);
нищожен isr_high_direct (Void);
нищожен isr_high (Void);

//***********************串口初始化******************** ****
нищожен първоначален (Void)
(
SPBRG = 0x19;
TXSTA = 0x04;
RCSTA = 0x80;
/ / TRISC = 0x80;
TXSTAbits.TXEN = 1;
RCSTAbits.CREN = 1;
PIE1bits.RCIE = 1;
INTCON = 0xc0;
)

//***********************************************
/ / * Напиши байт за EEPROM *
/ / * - Ctrl: Контрол байт на EEPROM *
/ / * - Аййг: Местоположение на EEPROM *
/ / * - Данните: Данните байт на EEPROM *
//***********************************************
нищожен EEPROM_Write (Ctrl грозен Чар, грозен Чар адр, грозен Чар данни)
(
IdleI2C (); / / гарантира модул е празен
StartI2C (); / / състояние Старт
I2C_Done (); / / Изчакайте Старт завършени състояние и ясно флаг SSPIF

WriteI2C (Ctrl); / / Write Control Пишете EEPROM & Проверете BF флаг
докато (SSPCON2bits.ACKSTAT); / / изчакайте, докато получи Запознат съм от EEPROM
I2C_Done (); / / Ясно SSPIF флаг

WriteI2C (аййг); / / Напиши Адрес, на EEPROM
докато (SSPCON2bits.ACKSTAT); / / изчакайте, докато получи Запознат съм от EEPROM
I2C_Done ();

WriteI2C (данни); / / запис на данните за EEPROM
докато (SSPCON2bits.ACKSTAT); / / изчакайте, докато получи Запознат съм от EEPROM
I2C_Done ();

StopI2C (); / / състояние Спри
I2C_Done (); / / Изчакайте състоянието Спри Завършен
)

//***********************************************
/ / * Pae Пишете EEPROM
/ / *
/ / * - Ctrl: Контрол байт на EEPROM
/ / * - Аййг: Къде е EEPROM
/ / * - Дължина: Напиши брояч
/ / * - * ВРТК: RAM точка -> EEPROM
/ / *
//***********************************************
нищожен EE_Page_Write (Ctrl грозен Чар, грозен Чар адр, грозен Чар дължина, грозен Чар * ВРТК)
(
IdleI2C (); / / гарантира модул е празен
StartI2C (); / / състояние Старт
I2C_Done (); / / Изчакайте Старт състояние Завършен

WriteI2C (Ctrl); / / Write Control Пишете EEPROM & Проверете BF флаг
докато (SSPCON2bits.ACKSTAT); / / изчакайте, докато получи Запознат съм от EEPROM
I2C_Done (); / / Ясно SSPIF флаг

WriteI2C (аййг); / / Напиши Адрес, на EEPROM
докато (SSPCON2bits.ACKSTAT); / / изчакайте, докато получи Запознат съм от EEPROM
I2C_Done ();

докато (дължина! = 0) / / Проверка напишете осъществени?
(
WriteI2C (* ВРТК); / / Напиши данни на EEPROM
докато (SSPCON2bits.ACKSTAT); / / изчакайте, докато получи Запознат съм от EEPROM
I2C_Done ();
ВРТК / / Точка на следващата байт
дължина -;
)

StopI2C (); / / състояние Спри
I2C_Done (); / / Изчакайте състоянието Спри Завършен
)

//***********************************************
/ / * EEPROM Запознат Polling *
/ / * - Рутинните ще избирателните на АСК *
/ / * Отговор от EEPROM *
/ / * - АСК = 0 връщане *
/ / * - АСК = 1 & изпрати Рестартирайте линия проверка *
//***********************************************
нищожен EEPROM_ACK (Ctrl грозен Чар)
(
грозен Чар I;

IdleI2C (); / / гарантира модул е празен
StartI2C (); / / състояние Старт
I2C_Done (); / / Изчакайте Старт състояние Завършен

WriteI2C (Ctrl); / / Напиши контрол да EEPROM (пиша)
I2C_Done (); / / Ясно SSPIF флаг

докато (SSPCON2bits.ACKSTAT) / / тест за Запознат съм от EEPROM
(
за (I = 100; I> 0; I -); / / Закъснение за следващото Repet-Старт

RestartI2C (); / / започне Repet-Старт състояние
I2C_Done (); / / Repet стоим Старт състояние Завършен

WriteI2C (Ctrl); / / Напиши контрол да EEPROM (пиша)
I2C_Done (); / / Ясно SSPIF флаг
)
StopI2C (); / / изпрати СТОП състояние
I2C_Done (); / / изчакайте, докато спре условие е над
)

//***********************************************
/ / * Разни Прочети един байт от EEPROM *
/ / * - Ctrl: Контрол байт на EEPROM (пиша) *
/ / * (Ctrl 1): Прочетете командване *
/ / * - Аййг: Адрес байт на EEPROM *
/ / * - Обратно: прочете данни от EEPROM *
//***********************************************
грозен Чар EEPROM_Read (Ctrl грозен Чар, грозен Чар аййг)
(
Чар е грозен;

IdleI2C (); / / гарантира модул е празен
StartI2C (); / / състояние Старт
I2C_Done (); / / Изчакайте Старт състояние Завършен

WriteI2C (Ctrl); / / Напиши контрол да EEPROM
докато (SSPCON2bits.ACKSTAT); / / тест за състоянието АСК, ако са получени
I2C_Done (); / / Ясно SSPIF флаг

WriteI2C (аййг); / / Напиши Адрес, на EEPROM
докато (SSPCON2bits.ACKSTAT); / / тест за състоянието АСК, ако са получени
I2C_Done (); / / Ясно SSPIF флаг

RestartI2C (); / / започне Рестартирайте състояние
I2C_Done ();

WriteI2C (Ctrl 1); / / Напиши контрол да EEPROM
докато (SSPCON2bits.ACKSTAT); / / тест за състоянието АСК, ако са получени
I2C_Done (); / / Ясно SSPIF флаг

F = ReadI2C (); / / Давам възможност на I2C приемник & чакам BF = 1 до получените данни
I2C_Done (); / / Ясно SSPIF флаг

NotAckI2C (); / / Genarate Non_Acknowledge да EEPROM
I2C_Done ();

StopI2C (); / / изпрати СТОП състояние
I2C_Done (); / / изчакайте, докато спре условие е над

връщане (F); / / Данни Завръщане от EEPROM
)

//***********************************************
/ / * Sequential Read от EEPROM
/ / *
/ / * - Ctrl: Контрол байт на EEPROM
/ / * - Аййг: Къде е EEPROM
/ / * - Дължина: Прочетете брояч
/ / * - * ВРТК: Да се съхранява EEPROM данни за RAM
/ / *
//***********************************************
нищожен EE_SEQU_Read (Ctrl грозен Чар, грозен Чар адр, грозен Чар дължина, грозен Чар * ВРТК)
(
IdleI2C (); / / гарантира модул е празен
StartI2C (); / / състояние Старт
I2C_Done (); / / Изчакайте Старт състояние Завършен

WriteI2C (Ctrl); / / Напиши контрол да EEPROM
докато (SSPCON2bits.ACKSTAT); / / тест за състоянието АСК, ако са получени
I2C_Done (); / / Ясно SSPIF флаг

WriteI2C (аййг); / / Напиши Адрес, на EEPROM
докато (SSPCON2bits.ACKSTAT); / / тест за състоянието АСК, ако са получени
I2C_Done (); / / Ясно SSPIF флаг

RestartI2C (); / / започне Рестартирайте състояние
I2C_Done ();

WriteI2C (Ctrl 1); / / Напиши контрол да EEPROM
докато (SSPCON2bits.ACKSTAT); / / Тест за състоянието АСК, ако са получени
I2C_Done (); / / Ясно SSPIF флаг

докато (дължина! = 0)
(
* ВРТК = ReadI2C (); / / Давам възможност на I2C EEPROM приемник & съхранява данни на точка буфер
I2C_Done ();
ВРТК ;
дължина -;

ако (дължина == 0) NotAckI2C ();
иначе AckI2C (); / / Продължаване чете следващите данни, изпратете потвърждава EEPROM

I2C_Done ();
)

StopI2C (); / / изпрати СТОП състояние
I2C_Done (); / / изчакайте, докато спре условие е над
)

//***********************************************
/ / * Проверете I2C действия, които са завършени *
//***********************************************
нищожен I2C_Done (Void)
(
докато (! PIR1bits.SSPIF); / / Завършен на действие, когато е SSPIF Здравей.
PIR1bits.SSPIF = 0; / / Ясно SSPIF
)

//************************************************
/ / * Първоначално I2C магистър режим с 7 бита Адрес *
/ / * Clock Speed: 100kHz @ 4MHz *
//************************************************
нищожен Initialize_I2C_Master (Void)
(
OpenI2C (магистър, SLEW_ON);
SSPADD = 9;
)нищожен Putch (грозен данни Чар)
(
Write_Lcd_Data (данни);
)
нищожен Init_System (Void)
(
Init_Lcd ();
INTCONbits.GIE = 0;
)нищожен основни (Void)
(
поплавък FX;
поплавък ФГ;
поплавък FZ;
дълго ет.;
uchar fcount;
грозен Чар ЗВЦР [20];
uchar * бебешка количка;
грозен Чар read_data;

TRISC = 0xdb;

Init_System ();
начална ();

Initialize_I2C_Master ();

докато (1)
(
Switch (remdata) (
случай 0x50:
TXREG = 0x90;
направи (
;
) докато (BusyUSART ());
TXREG = 0x89;
направи (
;
) докато (BusyUSART ());
TXREG = 0x88;
направи (
;
) докато (BusyUSART ());
TXREG = 0x87;
прекъсване;
случай 0x60:
TXREG = 0x91;
прекъсване;
)
remdata = 0x00;

//=========================
/ *
EEPROM_Write (0XA0, 1,1);
EEPROM_ACK (0XA0);
EEPROM_Write (0XA0, 2,2);
EEPROM_ACK (0XA0);
EEPROM_Write (0XA0, 3,3);
EEPROM_ACK (0XA0);
read_data = 0;
read_data = EEPROM_Read (0XA0, 3);
* /

за (fcount = 0; fcount <20; fcount )
ЗВЦР [fcount] = 0x30;

FL = 123456789;
ltoa (ет., ЗВЦР);
EE_Page_Write (0XA0, 1,9, ЗВЦР);
EEPROM_ACK (0XA0);
EE_SEQU_Read (0XA0, 1,9, ЗВЦР);

Line_1 ();Putch (0x35); Putch (0x30); / /原为PRINTF语句,调试不通,改为Putch

Line_2 ();Putch (ЗВиг [0]);
Putch (ЗВиг [1]);
Putch (ЗВиг [2]);
Putch (ЗВиг [3]);
Putch (ЗВиг [4]);
Putch (ЗВиг [5]);
Putch (ЗВиг [6]);
Putch (ЗВиг [7]);
Putch (ЗВиг [8]);
)
)Аз съм китайски, английски, така ми е лошо.
Налице е известна представа за I2C в кода above.And, съставител е Microchip компилатор V2.20B.

Може да се погрижи и код за I2C, не ми пука за другите код (например, LCD).

с най-добри пожелания!

 

Welcome to EDABoard.com

Sponsor

Back
Top