Перейти к содержанию
    

Кто-нибудь может помочь с прошивкой

Вообщем такая проблема:

 

Мне необходимо написать прошивку для LPC2148, чтобы работало в Keil, язык сишник.

 

Суть в том, что я заканчиваю третий курс и необходимо сделать лабораторную работу, чтобы получить допуск до экзамена, аудитории уже закрыты с учебными стендами, так что не имею возможности ничего сделать, поэтому вот обращаюсь к вам.

 

Может тут кто-нибудь помочь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нужна программа, которая передавала бы по нажатию P0.14 температуру с LM 75 по UART в гипертерминал в виде:

"содержание яч. с адресом - 0x00 = "

 

есть код реализующий просто снятие данных с LM75 и показывающий температуру на LCD, надо бы переделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может тут кто-нибудь помочь?

Модкратор:

Для начала правильно выбирайте раздел для своих постов. Перенес.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы хоть бы выложили текст который менять надо.... Задачка-т простая. Строк в 10...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот работающий код, реализующий передачу на LCD температуры и меняющий цвет лампочки в зависимости от этой температуры:

 

 

#include "lcd.h"
#include "leds.h"
#include <lpc21xx.h>
#include <stdio.h>


__irq void I2CISR (void);		
void I2CReceiveBytes(void); 	
void work2 (int temp);
volatile unsigned lock;
volatile int msg1=0, msg2=0;
volatile int I2CAddress;

volatile int bWrite = 1;
volatile unsigned int Counter = 0;
const unsigned char DEGREE = 3;

int main (void)
{
unsigned char result1 [30]; 
unsigned char result2 [30];	

lock = 0;

VICVectCntl1 = 0x00000029;  			//select a priority slot for a given interrupt
VICVectAddr1 = (unsigned int) I2CISR;	//pass the address of the IRQ into the VIC slot
VICIntEnable = 0x00000200;				//enable interrupt

PINSEL0 = 0x50; 						//Switch GPIO to I2C pins

I2SCLH = 0xFF;							
I2SCLL = 0xFF; 							

InitLCD ();
InitSPI();
SetBacklight (1);
//LCDTextOut ("      LM75      ", "Individual task ");
InitPWM();

while(1)
{
//	bWrite = 1;
	I2CReceiveBytes();					//Read the LM75

	//LCDTextOut ("                ", "                ");	//Clear LCD
	sprintf (result1, "Temp: +%2d%cC              ",  (int) msg1, DEGREE);
	LCDTextOut ("[LM75]:     ", result1);

	ShowVolume((int) msg1);
	//work2((int)msg1);
	//Sleep(1000);
}

return 0;
}

__irq void I2CISR (void)			//I2C interrupt routine
{
switch (I2STAT)			//Read result code and switch to next action
{
	case( 0x08 ):		//Start bit

		if(bWrite==1)
		{
			I2CONCLR = 0x20;		//Clear start bit
			I2DAT = (unsigned char)0x90; 	//Send address and write bit
			break;
		}
		else
		{			
			I2DAT = (unsigned char)0x91; 	//Send address and read bit
			I2CONSET = 0x04;		//Set AA bit
			I2CONCLR = 0x20;		//Clear start bit

		//	msg1=1;

			break;
		}

	case( 0x10 ):				//A repeated Start condition has been transmitted

		if(bWrite==1)
		{
			I2DAT = 0x90; 	//Send address and read bit
		 	I2CONSET = 0x04;		//Set AA bit
		 	I2CONCLR = 0x20;		//Clear start bit
		}
		else
		{

		 	I2DAT = 0x91; 	//Send address and read bit
		 	I2CONSET = 0x04;		//Set AA bit
		 	I2CONCLR = 0x20;		//Clear start bit
		}

	//	 msg1=2;

		 break;

	case( 0x18 ):
		I2DAT = (int) 0;
	//	msg1=I2STAT;
		break;

	case( 0x28 ):
		I2CONSET = 0x00000020; 		//Start condition
		bWrite = 0;
		break;


	case ( 0x40 ) :				//Slave Address +R, ACK

		I2CONSET = 0x04;		//Enable ACK for data byte

	//	msg1=3;

		break;

	case ( 0x48 ) :				//Slave Address +R, Not Ack

		I2CONSET = 0x20;		//Resend Start condition

	//	msg1=4;

		break;

	case (0x50) :				//Data Received, ACK 

		msg1 = I2DAT; 			//Read data byte
		Counter+=1;
		//msg2=I2STAT;
		I2CONCLR = 0x04;		//Disable ACK for data byte

	//	msg1=5;

		break;

   case (0x58):					//Data Received, Not Ack

		msg2 = I2DAT;			//Read data byte
		I2CONSET = 0x10;		//Stop condition
		lock = 0;               //Signal end of I2C activity

	//	msg1=6;

		break; 

	default :

//	msg1=I2STAT;

	break;
}

I2CONCLR 	= 0x08;			//Clear I2C interrupt flag
VICVectAddr = 0x00000000;	//Clear interrupt in 
}


void work2 (int temp){
int nR, nG, nB;
int gR, gG, gB;
switch(temp){
	case (25) :
		nR = 0, nG = 0, nB = 0xFFF;
		break;
	case (26) :
		nR = 0x1FF, nG = 0, nB = 0x9FF;
		break;
	case (27) :
		nR = 0x3FF, nG = 0, nB = 0x8FF; Beep();
		break;
	case (28) :
		nR = 0x7FF, nG = 0, nB = 0x7FF;
		break;
	case (29) :
		nR = 0x8FF, nG = 0, nB = 0x5FF;
		break;
	case (30) :
		nR = 0x9FF, nG = 0, nB = 0x3FF;
		break;
	case (31) :
		nR = 0xFFF, nG = 0, nB = 0;
		break;
	default :
		nR = 0, nG = 0xFFF, nB = 0;
		break;
}

while((gR!=nR) || (gG!=nG) || (gB!=nB))
{
	if(gR>nR)
	{
		gR = gR-1;	
	}else{
		if(gR<nR)
			gR = gR+1;
	}
	if(gG>nG){
		gG = gG-1;	
	}else{
		if(gG<nG)
			gG = gG+1;
	}
	if(gB>nB){
		gB = gB-1;	
	}else{
		if(gB<nB)
			gB = gB+1;
	}

//	SetRGB (gR, gG, gB);
	Sleep (2);

	if( (gR==nR) && (gG==nG) && (gB==nB)){
		return;
	}
}
}

void I2CReceiveBytes(void)
{
while(lock == 1)			//Wait for interrupt to signal end of I2C activity
{
;
}
lock = 1;                   //Set I2C bus as active

//	I2ADR = 0;			//Place address in Globals to be used by the interrupt

I2CONCLR = 0x000000FF;		//Clear all I2C settings
I2CONSET = 0x00000040; 		//Enable the I2C interface
I2CONSET = 0x00000020; 		//Start condition
}

 

 

 

 

 

Моя задача выглядит так:

 

по нажатию P0.14 происходит t -> EEPROM в виде 0x00

дальше выключается питание затем включается и происходит следующее:

по UART передать содержимое 0x00..0x20 в виде строк: "содержимое ячейки с адресом 0x00 = ...

0x01=..

0x02=..

и т.д. в гипертерминал.

Изменено пользователем kussani

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и в чем тогда проблема?

----------------

Находите как инициализировать UART.

Вставляете строку инициализации.

 

Находите как инициализировать нужнный порт на ввод - инициализируете.

 

Ищите как обозначаются переменные в епром.

Определяете там массив байт размером 20.

 

Находите как задается абсолютный адрес переменной в епром. Обычно каким-нибудь значком типа @ или #pragma... - это в хэлпе к кейлу.

Определяете массив из 20 байт по адресу 0.

----------------------------------------------

 

Итого.

 

Инициализация I2C

Инициализация UART

Инициализация порта на ввод

Цикл вывода в UART 20 ячеек памяти.

 

Далее анализируете порт (где кнопка) на ноль. Вечный цикл с выхдом когда порт==0.

 

Далее ваш I2C receive.

 

Далее запись в переменную eprom байта температуры.

 

Далее вечный цикл с слипом. (Пока не выключишь питание).

------------------------------------------------

 

-----

 

Вывод в хексе делается прост.

Анализируете старшую часть байта.

Сдвигаете его вправо на 4 и сравниваете с 9.

Если меньше или ==, то прибавляете 0x30, если больше, то прибавляете 0x37.

Получившеесе выдаете в UART.

Тоже самое с младшей частью байта, но без сдвига.

 

Так число в шестнадцатиричном виде появится на экране...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

код моего примера писал не я, осталось жутко мало времени, чтобы разобраться во всем этом, тем более нет стенда, чтобы проверить что-то опытным путём.

если кто понимает, напишите хотя бы частично основные моменты этого алгоритма, буду очень признателен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно, с утра придут люди у которых есть готовый код для вашего процессора. У меня- нет. И времени на это, к сожалению, тоже нет. Мне очень жаль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по нажатию P0.14 происходит t -> EEPROM в виде 0x00

В этом ARM'е нет EEPROM. Или у Вас внешняя?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В этом ARM'е нет EEPROM. Или у Вас внешняя?

 

учебная плата внешняя с лампочками, вентилятором и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...