Програмирование pic на СИ.

Поклонники продукции Microchip Technology Inc тусуются тут.
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение misterkuk »

Не разберусь с кодом. Не получается представить как это работает. Как понять строки

Код: Выделить всё

 temp=(lcd&~(1<<RS))|(1<<E);   //RS=0 – это команда
PORTD=temp;   //Выводим на portD старшую тетраду команды, сигналы RS, E
asm("nop");   //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1<<E);   //Сигнал записи команды
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Програмирование pic на СИ.

Сообщение Vov123 »

Типа в переменной lcd сбросить бит RS и установить бит E и присвоить всё это добро в переменную temp.
В PORTD вывести содержимое переменной temp.
А через небольшую задержку,в 1 машинный такт,сбросить бит E.
misterkuk
Мучитель микросхем
Сообщения: 400
Зарегистрирован: Сб апр 17, 2010 10:30:13
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение misterkuk »

Vov123 писал(а):Типа в переменной lcd сбросить бит RS и установить бит E и присвоить всё это добро в переменную temp.


Переменная lcd скорей всего в шестнадцатеричной форме. То есть можно поменять в этом шестнадцатеричном коде отдельно какой нибуть байт? RS я так понимаю это нога и какой то бит в регистре мк. Пусть RA1 к примеу. Не пойму как он в 0х... коде изменит какой то бит.
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

Есть функция

Код: Выделить всё

    print_message(A);
выводящая информацию на дисплей через порты.
Где А - это тип char (ну или массив char, если быть правильным).
Есть некая переменная считаемая в программе i.
Вопрос: каким образом можно в A затолкать i, а так же еще несколько символов?
Когда то давно делал, но исходники погибли вместе с хардом. Ума не приложу как склеить i, несколко символов и поместить результат в А.
Если можно подкиньте примеров работы с char, двухчасовые попытки поискать в интернете ни к чему не привели. :(
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

каким образом можно в A затолкать i
Не ? :roll:
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

Ругаетцца... :(
Тьфу! У меня же массив!
А вот как склеить несколько char'ов?
Последний раз редактировалось Chettuser Вс мар 17, 2013 20:05:21, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Что значит "склеить несколько char'ов" ? Вопрос задайте нормально :)
Обычно правильная формулировка вопроса приводит к нахождению ответа самостоятельно.
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

Эээ... допёр - массивом придётся работать.

По предыдущему рано радовался - выводит чушь. Ладно, попробую сам разобраться еще разок.
Спасибо.
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

Короче, сдаюсь...
Вот код вывода на LCD дисплей. Пытаюсь оформить вывод нужной мне строки в main:
Спойлер

Код: Выделить всё

/*
      ВЫВОД ИНФОРМАЦИИ НА LCD-ДИСПЛЕЙ ОТ NOKIA 1100
*/
#include <p18f14k50.h>       /* Подключаем хидеры */
#include <delays.h> 
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "lcd1100.h"

//   Описываем конфигурацию

#pragma config WDTEN = OFF
#pragma config MCLRE = OFF
#pragma config DEBUG = OFF
#pragma config LVP = OFF
#pragma config IESO = OFF

//    биты защиты выключить
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTRB = OFF

typedef unsigned char BYTE;
//   Constant declarations
#define CLOCK 8      //   частота в МГц

char p[7];
unsigned int PIC_DATA;
unsigned char pic_data_char[4];

void main(void);
void InterruptHandlerHigh(void);
void init (void);
void long_to_string_lz (unsigned int input, char *str, char numdigits);
void long_to_string (unsigned int input, char *str, char numdigits);


void main (void){
   
   init();
   Lcd_Init();
while(1)
{
   Gotoxy(12,1);
   print_message("Frequency");
   Gotoxy(12,3);
   
   PIC_DATA++;
   itoa(PIC_DATA, pic_data_char);
//   sprintf(pic_data_char, %d, PIC_DATA);
   print_message(pic_data_char);
   Delay10KTCYx(100);
}
             }

void init (void){
/*
*         Инициализация системы
*/
      TRISC = 0b01111111;   // PORTC на вход, кроме RC7 - на выход
      
      TRISB = 0;          // PORTB на выход

      OSCCON = 0x72;      // Тактовая частота 8 Мгц

      ANSEL = 0;         // отключаем АЦП каналы
      ANSELH = 0;
      return;
         }

/*
**************************************************************************************
* long_to_string()
*
* Description : Convert a "long" to a null-terminated string
*               (base = decimal)
* Arguments   : input = number to be converted
*               str = pointer to string (i.e. display buffer)
*               numdigits = number of digits to display
* Returns     : none
**************************************************************************************
*/
void long_to_string (unsigned int input, char *str, char numdigits)
{
  char digit;
  int blank = 1;
  long_to_string_lz(input, str, numdigits);
  for (digit=0; digit < numdigits-1; digit++) {
    if (str[digit] == '0') {
      if (blank == 1) str[digit] = ' ';
    }
    else {
      blank = 0;
    }
  }
}

/*
**************************************************************************************
* long_to_string_lz()
*
* Description : Convert a "long" to a null-terminated string, with leading zeros
*               (base = decimal)
* Arguments   : input = number to be converted
*               str = pointer to string (i.e. display buffer)
*               numdigits = number of digits to display
* Returns     : none
**************************************************************************************
*/
void long_to_string_lz (unsigned int input, char *str, char numdigits)
{
  char digit;
  for (digit=numdigits; digit > 0; digit--) {
    str[digit-1] = (input % 10) + '0';
    input = input / 10;
  }
  str[numdigits] = 0;    // null-terminate the string
}

Какие в main могут быть ошибки касаемо функции itoa? Stdlib.h вроде как подключил. :evil:
На дисплей выводится собачий кал. Голова уже не думает, может кто опытным глазом глянет и увидит сразу где что не срастается?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

А чем sprintf не угодил ?
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

Слишком жирный и наглый - отхавал больше половины памяти, а чистить его лениво. Кстати, ничего хорошего он тоже не выдаёт :facepalm:
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Посмотрите что лежит в массиве после форматирования, может вывод не работает (что больше вероятно), а Вы мучаетесь...
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

Прошу ногами не пинать, а подскажите пожалуйста:
Чем отличается такая запись:

Код: Выделить всё

print_message("A");

от такой:

Код: Выделить всё

print_message('A');

где функция имеет такой формат входных данных:

Код: Выделить всё

void print_message(const rom char * message)


Задача простая - код:

Код: Выделить всё

   print_message("A");
работает как надо, а вот код:

Код: Выделить всё

   PIC_CHAR[0] = 'A';
   print_message(PIC_CHAR[0]);
увы, нет.
dertsb
Родился
Сообщения: 7
Зарегистрирован: Вт мар 05, 2013 00:33:51

Re: Програмирование pic на СИ.

Сообщение dertsb »

Подскажите пожалуйста надежный и проверенный алгоритм антидребезга контактов для pic на Си (HI-TECH).
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение urry »

Чем отличается такая запись:
Код:
print_message("A");

от такой:
Код:
print_message('A');

в первом случае ожидается нуль - терминированная строка, те равнозначно
{ 'A',0}
чтобы работало
PIC_CHAR[] = {'A',0};
print_message(PIC_CHAR);
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

Эхх.. не работает :( Синтаксическая ошибка.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Chettuser писал(а):Чем отличается такая запись:

Код: Выделить всё

print_message("A");

от такой:

Код: Выделить всё

print_message('A');
'A' - это 1 символ, имеющий свой код, т.б. char. А "A" - это уже строка и в функцию передаётся её указатель (char*).
Учитывая, что функция принимает, в качестве аргумента, указатель на строку в ROM, первый вариант верный, второй - нет.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение urry »

Эхх.. не работает :( Синтаксическая ошибка.

void print_message(const rom char * message)
ну и правильно что ошибка, в качестве аргумента ожидается указатель из const rom - памяти программ а не данных.
Phenom
Родился
Сообщения: 3
Зарегистрирован: Вс мар 24, 2013 16:35:36

Re: Програмирование pic на СИ.

Сообщение Phenom »

Добрый вечер. Решил на днях тут по-колдовать с пиками диодами и кнопками. Си на начальном уровне знаю, точнее Си++, но разница не велика. Единственное так и не понял как управлять портами и ножками. К примеру: есть диод на одном порту и на втором кнопка. Как сделать чтобы при нажатии кнопки диод горел, при втором нажатии тух и т.д. Понятно, что там где диод ножка работает на выход, там где кнопка на вход, но не получается всё это написать пробовал на 16F887. Нашел тут один вариант с мигалкой http://habrahabr.ru/post/75312/ , но не суждено он у меня тупо горит и всё никаких миганий. Объясните как управлять портами. Простые проги на си++ с использованием фора или свитча написать могу.
Chettuser

Re: Програмирование pic на СИ.

Сообщение Chettuser »

Я хоть код предоставил :))) А по Вашему только догадываться придётся.
Ответить

Вернуться в «PIC»