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

Вопросы програмирования LPC2294

Я тут поглядел как устроен порты ввода вывода в lpc2294 и ужаснулся ктоже такое придумал это копец я хочу спросить про то как можно вывести какое то число в порт как я понял устанавливаются они записью 1 в IO0SET а сбрасываются записью 1 в IO0CLR а что касается чтение данных это вообще производится из регистра IOPIN так вот исходя из этого извращения вопрос как кто реализовывал запись и чтение данных в/из порта :help:

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


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

Я тут поглядел как устроен порты ввода вывода в lpc2294 и ужаснулся ктоже такое придумал это копец я хочу спросить про то как можно вывести какое то число в порт как я понял устанавливаются они записью 1 в IO0SET а сбрасываются записью 1 в IO0CLR а что касается чтение данных это вообще производится из регистра IOPIN так вот исходя из этого извращения вопрос как кто реализовывал запись и чтение данных в/из порта :help:

 

// Запись в порт

IO0DIR = 0xFFFFFFFF; //Все GPIO на вывод.

IO0SET = (1<<n), где n-номер бита, который требуется установить.

IO0CLR = (1<<n), где n-номер бита, который требуется сбросить.

 

//Чтение из порта

IO0DIR = 0x0; // Все GPIO на вход

Value = IO0PIN; // Читаем состояние портов

 

Очень даже удобно с SET и CLR сделано, по ходу программирования поймёшь. Просто надо изменить подход к программированию портов с 51го :biggrin:

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


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

Да побитно еще ничего ну я если нужно вывести например 8 битное число то ???

 

// Запись в порт

IO0DIR = 0xFFFFFFFF; //Все GPIO на вывод.

IO0CLR = 0xFFFFFFFF; //Сбрасываем все биты

IO0SET = 0x55; // Выводим в порт 0x55

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


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

Да а может можно как то записать в IAR например в 3 байт порта одно байтное число не двигая его в сторону старшего разряда много много раз

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


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

Да а может можно как то записать в IAR например в 3 байт порта одно байтное число не двигая его в сторону старшего разряда много много раз

 

Ну так напишите IO0SET = (0x55 << 0x18), и ничего больше двигать не надо :)

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


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

Да а может можно как то записать в IAR например в 3 байт порта одно байтное число не двигая его в сторону старшего разряда много много раз

 

Ну так напишите IO0SET = (0x55 << 0x18), и ничего больше двигать не надо :)

 

 

Запись на asm::::

LDR R0, =0xE0028000

MOV R1, 0x55

MVN R2, 0x00

STR R2, [R0, #8]

STR R2, [R0, #0xC]

STR R1, [R0, #4]

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


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

Да а может можно как то записать в IAR например в 3 байт порта одно байтное число не двигая его в сторону старшего разряда много много раз

 

Я когда ознакомился с яром для авр и вообще с авр сначала не понял удобства конструкции типа PORT = (0x3 << 2) - PORT = 00001100, но потом очень понравилось. Компилятор вычисляет константы - в данном случае 00001100 и подставляет в качестве операнда. В яре и хедеры на это заточены. В карме мне очень не хватает таких хедеров, где все биты сфр таким образом прописаны. Народ если у кого есть такой хедер может поделитесь?

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


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

Да а может можно как то записать в IAR например в 3 байт порта одно байтное число не двигая его в сторону старшего разряда много много раз

 

Я когда ознакомился с яром для авр и вообще с авр сначала не понял удобства конструкции типа PORT = (0x3 << 2) - PORT = 00001100, но потом очень понравилось. Компилятор вычисляет константы - в данном случае 00001100 и подставляет в качестве операнда. В яре и хедеры на это заточены. В карме мне очень не хватает таких хедеров, где все биты сфр таким образом прописаны. Народ если у кого есть такой хедер может поделитесь?

 

 

ИМХО. Проще на ассемблере изваять, темболее проще и удобнее ассемблера для процессоров я не встречал.

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


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

Да, действительно, ассемблер у армов замечательный и не сложный (как мне показалось). Но не хочется разбираться с тонкостями архитектуры, досконально вникать в режимы адресации или банально запоминать мнемонику. Хочеться сконцетрироваться на алгоритме цельного устройства.

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


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

В карме мне очень не хватает таких хедеров, где все биты сфр таким образом прописаны. Народ если у кого есть такой хедер может поделитесь?

Так возьмите красивые *.h из IAR. Какие проблемы. Ну разве убрать местами всунутую проверку на IARовский компилятор.

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


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

Приветствую всех пользователей LPC2000

У меня первый опыт с этими МК в корпусе QFP-144. Изначально нужен был ШИМ. Написал программу в KEIL, всё скомпилировалось, залил во FLASH LPC через Philips Flash Utilit. Верификация проходит нормально, но после переключения Р0.14 из 0 в 1 и сброса ничего не происходит, на выводе Р0.7 ШИМа нет.

Решил проверить работу порта, написал мигалку светодиодом на Р1.16 скомпилировал, залил... Сбрасываю - тишина. Что за ерунда то!

Вот код:

               
#include <LPC22xx.H>                       /* LPC21xx definitions */

void delay (unsigned int val) /* Delay function */
	{                        
  unsigned int cnt;
  for (cnt = 0; cnt < val; cnt++); /* Delay */
  }


int main (void) 
{
	SCS |= 0; //GPIO port 0; 1 is accessed via APB addresses in a fashion
            //compatible with previous LCP2000 devices.
  IODIR1 |= (1<<16); // P1.16-output

  while (1)
   {
      IOSET1 |= 1<<16;    /* Turn on LED */
		 //IOPIN1 |= 1<<16;
      delay(5000);        /* Delay */
      IOCLR1 |= (1<<16);   /* Turn off LEDs */
     //IOPIN1 &= ~(1<<16);		 
      delay(5000);     
    }
  }

файл .hex прикладываю.

Буду очень благодарен за любые советы.

led.hex

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


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

10 minutes ago, skripach said:

Выражение

SCS |= 0;

не имеет смысла. А так KEIL вроде умеет симулировать.. :pioneer_smoke:

 

Да, согласен. Имелось в виду:

SCS = 0;

А в остальном то как?

У меня не оценочная плата, а голая м/сх в контактирующем устройстве (кроватке).

Я по подключению хотел спросить - надо ли задействовать выводы BOOT[1:0] и CS0?

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


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

3 часа назад, MPetrovich сказал:

Вот код:

void delay (unsigned int val) /* Delay function */
	{                        
  unsigned int cnt;
  for (cnt = 0; cnt < val; cnt++); /* Delay */
  }

 

не имеет смысла.

13 минут назад, MPetrovich сказал:

надо ли задействовать выводы BOOT[1:0]

Естественно.

Почему не просили: "Надо ли подавать питание?"  :biggrin:

3 часа назад, MPetrovich сказал:

Буду очень благодарен за любые советы.

Советую: прежде чем начинать программировать какой-то МК, прочитать на него мануал. Чего вы (как видно по "коду") не сделали.

3 часа назад, MPetrovich сказал:
      IOSET1 |= 1<<16;    /* Turn on LED */
		 //IOPIN1 |= 1<<16;
      delay(5000);        /* Delay */
      IOCLR1 |= (1<<16);   /* Turn off LEDs */

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


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

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

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

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

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

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

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

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

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

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