реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Кто-нибудь может помочь с прошивкой
kussani
сообщение Jun 27 2009, 10:41
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 27-06-09
Пользователь №: 50 684



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

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

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

Может тут кто-нибудь помочь?
Go to the top of the page
 
+Quote Post
kussani
сообщение Jun 27 2009, 12:37
Сообщение #2





Группа: Новичок
Сообщений: 9
Регистрация: 27-06-09
Пользователь №: 50 684



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

есть код реализующий просто снятие данных с LM75 и показывающий температуру на LCD, надо бы переделать.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 27 2009, 15:20
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(kussani @ Jun 27 2009, 13:41) *
Может тут кто-нибудь помочь?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jun 28 2009, 05:02
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



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


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
kussani
сообщение Jun 28 2009, 09:12
Сообщение #5





Группа: Новичок
Сообщений: 9
Регистрация: 27-06-09
Пользователь №: 50 684



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


CODE
#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 - Jun 28 2009, 09:57
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jun 28 2009, 15:19
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Ну и в чем тогда проблема?
----------------
Находите как инициализировать UART.
Вставляете строку инициализации.

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

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

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

Итого.

Инициализация I2C
Инициализация UART
Инициализация порта на ввод
Цикл вывода в UART 20 ячеек памяти.

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

Далее ваш I2C receive.

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

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

-----

Вывод в хексе делается прост.
Анализируете старшую часть байта.
Сдвигаете его вправо на 4 и сравниваете с 9.
Если меньше или ==, то прибавляете 0x30, если больше, то прибавляете 0x37.
Получившеесе выдаете в UART.
Тоже самое с младшей частью байта, но без сдвига.

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


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
kussani
сообщение Jun 28 2009, 16:10
Сообщение #7





Группа: Новичок
Сообщений: 9
Регистрация: 27-06-09
Пользователь №: 50 684



код моего примера писал не я, осталось жутко мало времени, чтобы разобраться во всем этом, тем более нет стенда, чтобы проверить что-то опытным путём.
если кто понимает, напишите хотя бы частично основные моменты этого алгоритма, буду очень признателен.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jun 28 2009, 21:35
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



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


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jun 29 2009, 00:42
Сообщение #9


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(kussani @ Jun 28 2009, 18:12) *
по нажатию P0.14 происходит t -> EEPROM в виде 0x00

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
kussani
сообщение Jun 29 2009, 04:34
Сообщение #10





Группа: Новичок
Сообщений: 9
Регистрация: 27-06-09
Пользователь №: 50 684



Цитата(haker_fox @ Jun 29 2009, 04:42) *
В этом ARM'е нет EEPROM. Или у Вас внешняя?


учебная плата внешняя с лампочками, вентилятором и т.д.
Go to the top of the page
 
+Quote Post
kussani
сообщение Jun 29 2009, 11:46
Сообщение #11





Группа: Новичок
Сообщений: 9
Регистрация: 27-06-09
Пользователь №: 50 684



очень надеюсь на помощь и понимание
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01451 секунд с 7
ELECTRONIX ©2004-2016