Страница 14 из 103
Re: Програмирование pic на СИ.
Добавлено: Ср мар 06, 2013 12:15:27
misterkuk
Не разберусь с кодом. Не получается представить как это работает. Как понять строки
Код: Выделить всё
temp=(lcd&~(1<<RS))|(1<<E); //RS=0 – это команда
PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1<<E); //Сигнал записи команды
Re: Програмирование pic на СИ.
Добавлено: Ср мар 06, 2013 13:47:23
Vov123
Типа в переменной lcd сбросить бит RS и установить бит E и присвоить всё это добро в переменную temp.
В PORTD вывести содержимое переменной temp.
А через небольшую задержку,в 1 машинный такт,сбросить бит E.
Re: Програмирование pic на СИ.
Добавлено: Чт мар 07, 2013 14:44:01
misterkuk
Vov123 писал(а):Типа в переменной lcd сбросить бит RS и установить бит E и присвоить всё это добро в переменную temp.
Переменная lcd скорей всего в шестнадцатеричной форме. То есть можно поменять в этом шестнадцатеричном коде отдельно какой нибуть байт? RS я так понимаю это нога и какой то бит в регистре мк. Пусть RA1 к примеу. Не пойму как он в 0х... коде изменит какой то бит.
Re: Програмирование pic на СИ.
Добавлено: Вс мар 17, 2013 19:34:28
Chettuser
Есть функция
выводящая информацию на дисплей через порты.
Где А - это тип char (ну или массив char, если быть правильным).
Есть некая переменная считаемая в программе i.
Вопрос: каким образом можно в A затолкать i, а так же еще несколько символов?
Когда то давно делал, но исходники погибли вместе с хардом. Ума не приложу как склеить i, несколко символов и поместить результат в А.
Если можно подкиньте примеров работы с char, двухчасовые попытки поискать в интернете ни к чему не привели.

Re: Програмирование pic на СИ.
Добавлено: Вс мар 17, 2013 19:47:54
Аlex
каким образом можно в A затолкать i
Не ?

Re: Програмирование pic на СИ.
Добавлено: Вс мар 17, 2013 19:53:44
Chettuser
Ругаетцца... 
Тьфу! У меня же массив!
А вот как склеить несколько char'ов?
Re: Програмирование pic на СИ.
Добавлено: Вс мар 17, 2013 20:01:59
Аlex
Что значит "склеить несколько char'ов" ? Вопрос задайте нормально

Обычно правильная формулировка вопроса приводит к нахождению ответа самостоятельно.
Re: Програмирование pic на СИ.
Добавлено: Вс мар 17, 2013 20:04:54
Chettuser
Эээ... допёр - массивом придётся работать.
По предыдущему рано радовался - выводит чушь. Ладно, попробую сам разобраться еще разок.
Спасибо.
Re: Програмирование pic на СИ.
Добавлено: Ср мар 20, 2013 19:56:01
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 вроде как подключил.

На дисплей выводится собачий кал. Голова уже не думает, может кто опытным глазом глянет и увидит сразу где что не срастается?
Re: Програмирование pic на СИ.
Добавлено: Ср мар 20, 2013 21:34:01
Аlex
А чем sprintf не угодил ?
Re: Програмирование pic на СИ.
Добавлено: Чт мар 21, 2013 04:50:46
Chettuser
Слишком жирный и наглый - отхавал больше половины памяти, а чистить его лениво. Кстати, ничего хорошего он тоже не выдаёт

Re: Програмирование pic на СИ.
Добавлено: Чт мар 21, 2013 08:20:39
Аlex
Посмотрите что лежит в массиве после форматирования, может вывод не работает (что больше вероятно), а Вы мучаетесь...
Re: Програмирование pic на СИ.
Добавлено: Сб мар 23, 2013 16:22:31
Chettuser
Прошу ногами не пинать, а подскажите пожалуйста:
Чем отличается такая запись:
от такой:
где функция имеет такой формат входных данных:
Код: Выделить всё
void print_message(const rom char * message)
Задача простая - код:
работает как надо, а вот код:
Код: Выделить всё
PIC_CHAR[0] = 'A';
print_message(PIC_CHAR[0]);
увы, нет.
Re: Програмирование pic на СИ.
Добавлено: Сб мар 23, 2013 18:19:51
dertsb
Подскажите пожалуйста надежный и проверенный алгоритм антидребезга контактов для pic на Си (HI-TECH).
Re: Програмирование pic на СИ.
Добавлено: Сб мар 23, 2013 20:27:50
urry
Чем отличается такая запись:
Код:
print_message("A");
от такой:
Код:
print_message('A');
в первом случае ожидается нуль - терминированная строка, те равнозначно
{ 'A',0}
чтобы работало
PIC_CHAR[] = {'A',0};
print_message(PIC_CHAR);
Re: Програмирование pic на СИ.
Добавлено: Сб мар 23, 2013 20:50:37
Chettuser
Эхх.. не работает

Синтаксическая ошибка.
Re: Програмирование pic на СИ.
Добавлено: Сб мар 23, 2013 21:17:18
Аlex
Chettuser писал(а):Чем отличается такая запись:
от такой:
'A' - это 1 символ, имеющий свой код, т.б.
char. А
"A" - это уже строка и в функцию передаётся её указатель (
char*).
Учитывая, что функция принимает, в качестве аргумента, указатель на строку в ROM, первый вариант верный, второй - нет.
Re: Програмирование pic на СИ.
Добавлено: Сб мар 23, 2013 21:28:56
urry
Эхх.. не работает

Синтаксическая ошибка.
void print_message(const rom char * message)
ну и правильно что ошибка, в качестве аргумента ожидается указатель из const rom - памяти программ а не данных.
Re: Програмирование pic на СИ.
Добавлено: Вс мар 24, 2013 16:51:21
Phenom
Добрый вечер. Решил на днях тут по-колдовать с пиками диодами и кнопками. Си на начальном уровне знаю, точнее Си++, но разница не велика. Единственное так и не понял как управлять портами и ножками. К примеру: есть диод на одном порту и на втором кнопка. Как сделать чтобы при нажатии кнопки диод горел, при втором нажатии тух и т.д. Понятно, что там где диод ножка работает на выход, там где кнопка на вход, но не получается всё это написать пробовал на 16F887. Нашел тут один вариант с мигалкой
http://habrahabr.ru/post/75312/ , но не суждено он у меня тупо горит и всё никаких миганий. Объясните как управлять портами. Простые проги на си++ с использованием фора или свитча написать могу.
Re: Програмирование pic на СИ.
Добавлено: Вс мар 24, 2013 18:23:30
Chettuser
Я хоть код предоставил

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