Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 23.08.2018, 08:26   #101
reg33
Member
 
Регистрация: 11.11.2012
Возраст: 36
Сообщений: 69
Вес репутации: 85/0
reg33 will become famous soon enough
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от Greg Посмотреть сообщение
надо (не постесняться) и привести весть текст своей программы. а (исходное) сообщение размазать по нужным местам в качестве комментариев.
тогда можно пытаться рассчитывать на какой-то адекватный ответ.
собственно исходник

#include <htc.h>
#include <stdio.h>
#include "usart.h"
#include "i2c.h"
#include "rtc.h"
#include <string.h>


#define _XTAL_FREQ 4000000

#define STATE TRISC5
#define PIN RC5


__CONFIG(WDTDIS & UNPROTECT & LVPDIS & HS);




char temperature;
unsigned char temp_drob;
unsigned signloc;
unsigned char b;
unsigned char temp1;
unsigned char temp2;
unsigned char temp_drob = 0;
unsigned char sign;
unsigned char hours;
unsigned char minutes;
unsigned int RTC;
unsigned char ALG;
unsigned char ButtonPress; // переменная для кнопки MODE
unsigned char ButtonPress_1; // переменная для кнопки SET
unsigned char ButtPress;//переменная дребезг инкремент
unsigned char higt; // переменная инткремента
unsigned char MASK=0b00000111;// перенная маски для выделение пинов PORTE
unsigned char PRESS; //переменная для загрузки состояния порта
unsigned char SWI; // переменная для переключения в switch
unsigned char INCR; // тест
unsigned char temperature_des; // переменная для хранения десятков
unsigned char temperature_ed; // переменная для хранения едениц
unsigned char pause_opros; //переменная для отработки паузы при работе датчика
unsigned char PW=0; // переменная для ШИМ
unsigned char begunock; // переменная для бегунка
// unsigned char anode2;



char maymass[10][2]; // массив для ШИМ

// массив для лампы
// 0 1 2 3 4 5 6 7 8 9 R o b C v / 17(A) 18(Б) 19(В) 20(Г) 21(Д) 22(Е) 23(Ж) 24(З)
//25(З) 26(И) 27(К) 28(Л) 29(М) 30(Н) 31(О) 32(П) 33(Р) 34(Т) 35(У) 36(Ф) 37(Х) 38(Ц)
// 39(Ч) 40(Ш) 41(Щ) 42(Ы) 43(ь) 44(Э) 45(Ю) 46(Я)
char Sibol_PORTD[47]= {0xC0,0x97,0b11000110,0b11010011,0b11111010,0b1101 0011,0b11010001,
0b10010111,0b11010000,0b11010010,0xFF,0b01111100,0 b11010001,0b11010001,0b11010101,0b11101101,
0b11101111,0b11101010,0b01010101,0b01010101,0b1111 1101,0b11000010,0b11010101,0b00101111,
0b01010111,0b11101000,0b01111101,0b11101010,0b1111 1000,0b11111000,0b11010000,0b11111000,
0b11111100,0b11010101,0b10111111,0b11101111,0b1011 1110,0b01101111,0b11010000,0b11111010,
0b10010000,0b10010000,0b10110000,0b10110101,0b1101 0010,0b10011000,0b11101010};

char Sibol_PORTB[47] = {0x17,0xDE,0b10001111,0b10000111,0b01101011,0b0000 1011,
0b00001011,0b10010111,0b00001011,0b00001011,0xFF,0 b00001011,0b11101011,0b01101011,
0b00011111,0b11111111,0b11110111,0b11100111,0b0001 1011,0b00010011,0b00011111,0b10111110,
0b00011011,0b11111000,0b10010011,0b01110111,0b0111 0011,0b11110111,0b01110101,0b01101011,
0b00011111,0b00011111,0b00001011,0b00011111,0b1001 1110,0b11110110,0b00001010,0b11110110,
0b01111111,0b11101110,0b01111110,0b01111110,0b0111 1011,0b01111011,0b10001111,0b00111010,0b00001011};


char begunok_PORTB [4]= {0b11111110,0b11110111,0b11101011,0b11111101}; // массив для бегунка порта B

char begunok_PORTD [4]= {0b10111111,0b11101111,0xff,0b01111111}; // массив для бегунка порта D

void print_uart(const char *msg, int val) { // загружаем константу для текста и перемнную для чиселки
GIE = 0;
printf("\r%s %d", msg, val);
__delay_ms (50);
//GIE = 1;
}

char *byte2strAsBin(int val, char *str) //функция перевода в двоичный код функция вернет указатель /// char *str это указатель по сути на нулевую ячейку массива
{
int i;
for (i = 0; i < 8; i++) {
str[7-i] = (val & (1<<i)) ? '1' : '0'; // закидываем в массив результаты сравнения
}
str[8] = 0; // зависывем в последнюю ячейку 0 чтоб printf нашла конец массива (строки)
return str; // по сути указатель и начало массива одно и тоже поэтому пишем

}

void printByteAsBinary_uart(int val) // функция вывода строки с включением и выключением прерывания
{
static char str[9]; // добавляем массив

GIE = 0;

byte2strAsBin( val, str); // функция перевода из десятичного в двоиный

printf("\rBits: %s", str); // выводим в бинарном виде

__delay_ms(50);

// GIE = 1;
}

char mask_start[6]= // засветка цифры с низу вверх [0]
{ 0b00101111,/* засвечиваем А4,А6,А7*/
0b00000111,/* засвечиваем А3,А4,А5,А6,А7*/
0b00000000, /* засвечиваем ALL*/

0b01101011,/*засвечиваем В2,В4,В7*/
0b00001011,/* засвечиваем В2,В4,В5,В6,В7*/
0b00000000,/* засвечиваем ALL*/
};
char mask_stop[6]= // гашение цифры сверху вниз [1]
{ 0b01100000, /* гасим В5,В6,*/
0b11110100, /* гасим В2,B3,В4,В5,В6,В7*/
0b11111111, /* гасим ALL*/

0b00000111, /* гасим A0,А1,А2*/
0b00101111, /* гасим A0, А1,А2,А3,А5*/
0b11111111, /* гасим ALL*/
};

char anode_mask [5]= {2,4,8,16,32}; // массив для анодов индикатора

void segment (unsigned char seg, unsigned anode) // штатная засветка
{
PORTA=0b00000000;
unsigned char t;
switch(anode)
{
case 0 :{t=2;}break;
case 1 :{t=4;}break;
case 2 :{t=8;}break;
case 3 :{t=16;}break;
case 4 :{t=32;}break;
}
PORTB=Sibol_PORTB[seg];
PORTD=Sibol_PORTD[seg];
PORTA=t;
}

void stop( int seg, int anode, int DEC) // функция гашения цыфры
{
PORTA=0x00; // гасим порт a

if ( DEC<=2)
{

PORTB=Sibol_PORTB[seg]| mask_stop[DEC]; // первый шаг гасим верх
// print_uart("I detected Sibol PORTB", Sibol_PORTB[seg]);
// print_uart("I detected DEC_1", DEC);
// printByteAsBinary_uart( Sibol_PORTB[seg]);
// printByteAsBinary_uart( mask_stop[DEC]);
// printByteAsBinary_uart( PORTB);


PORTD=Sibol_PORTD[seg]; // низ цифры горит всегда
PORTA=anode_mask[anode];


}
else
if (DEC<=5)
{
PORTD=Sibol_PORTD[seg]| mask_stop[DEC]; // первый шаг гасим низ
// print_uart("I detected DEC_1", DEC);
// printf("\rPORT MASK DEC LO\n"); // просто выводим строку
// printByteAsBinary_uart( Sibol_PORTD[seg]);
// printByteAsBinary_uart( mask_stop[DEC]);
// printByteAsBinary_uart( PORTD);

PORTB=0xFF;// верх цифры не горит
PORTA=anode_mask[anode];
}
__delay_ms (2);
}

void start( int seg, int anode, int INC) // функция засветки цыфры
{
PORTA=0x00; // гасим порт a

if ( INC<=2)
{

PORTD=Sibol_PORTD[seg]| mask_start[INC]; // первый шаг зажигаем низ
// print_uart("I detected INC_1", INC);
// printf("\rPORT MASK INC LO\n"); // просто выводим строку
// printByteAsBinary_uart( Sibol_PORTD[seg]);
// printByteAsBinary_uart( mask_start[INC]);
// printByteAsBinary_uart( PORTD);
PORTB=0xFF; // верх цифры не горит
PORTA=anode_mask[anode];

}
else
if (INC<=5)
{
PORTB=Sibol_PORTB[seg]| mask_start[INC]; // первый шаг зажигаем верх
// print_uart("I detected INC_1", INC);
// printf("\rPORT MASK INC HI\n"); // просто выводим строку
// printByteAsBinary_uart( Sibol_PORTB[seg]);
// printByteAsBinary_uart( mask_start[INC]);
// printByteAsBinary_uart( PORTD);
PORTD=Sibol_PORTD[seg]; // низ цифры горит
PORTA=anode_mask[anode];
}
__delay_ms (2);
}

void PWM_modulator (unsigned char PWM_M) // управление яркостью CCP1
{unsigned char i ;
i= PWM_M%10;
CCPR1L = maymass[i][0];
CCP1CON = maymass[i][1];
}





unsigned char INIT(void)//static bit INIT (void) //static bit INIT (void) //функция инициализации темп датчик
{//unsigned char b;//static bit b;
GIE=0;// запрещаем прерывания
RC5=0; // обнуляем приемный порт
STATE=1;
STATE=0; // проваливаем линию
__delay_us (500);
STATE=1; //переключаемся на вход
__delay_us (65);
b=PIN; //смотрм чего там на линии
__delay_us (450); //выжидаем интервал
GIE=1; // разрешаем прерывания
return b; // возврашаю ноль или один
}

void TX (unsigned char cmd)//передача данных темп датчик
{ GIE=0;// запрещаем прерывания
unsigned char temp = 0;
unsigned char i=0;
temp=cmd;
for (i=0;i<8;i++) //цыкл на передачу байти
{ if (temp&0x01)
{STATE=0;
__delay_us(5); //передаем 1
STATE=1;
__delay_us(70);
} else
{STATE=0;
__delay_us (70); //передаем 0
STATE=1;
__delay_us(5);
}
temp>>=1;
}
GIE=1; // разрешаем прерывания
}

unsigned char RX ()// фунуция приема темп датчик
{ GIE=0;// запрещаем прерывания
unsigned char d=0;
unsigned char i=0;
for (i=0;i<8;i++)
{STATE=0;
__delay_us(6);
STATE=1;
d>>=1;
if(PIN==1)
d|=0x080;
__delay_us (70);
}
GIE=1; // разрешаем прерывания
return d;
}

configpic()
{ ADCON0=0b11000001;// модуль АЦП включен
ADCON1=0b10001110; //
OPTION_REG=0b11000001; //коэфф деления 1:4 таймер срабатывает через 1024мс (PS0-PS2)/ PS7-поддягивающие рез.включены /PS6-прерывание по переднему фронту
INTCON=0b10100000; // GIE=1 >> PS7-прерывания разрешены
//
// T0IF=1 >> PS5-прерывания от таймера TMR 0
// RBIE=1 >> PS3-перрывания от портов RB4, RB5, RB6 и RB7
TRISA=0b00000001;
TRISB=0b00000000;
TRISC=0b00000000;
TRISD=0b00000000;
TRISE=0b00000111; // порт работает на выход есои
}


void interrupt isr(void)// прерывание по нажатию кнопки примерно 1024 мкС
{
if(T0IF){ // Обрабатываем прерывания по таймеру понял что прерывания по таймеру
T0IF=0; // сбрасываю флаг прерывания
RTC++;
PRESS=~PORTE;//инверсия порта
PRESS=PRESS&MASK; // чего там на порту?

if (PRESS) //кнопка нажата
{
ButtonPress++; //инкремент антидребезга
SWI=PRESS; //запоминаем предпоследнне состояние перед отжатием кнопки для переключения в switch
} else
if (ButtonPress >= 30&&(!PRESS)) // прошло 30 мс? кнопка отпускается? фиксируем нажатие
{
ButtonPress = 0;

switch(SWI)
{
case 0x01: { ALG++;
if (ALG==3)// если кнопка нажата 3 раза то обнуляемся
{ALG=0;}};break;//переключаем режимы часы/напруга/термометр
case 0x02: {ALG=4; higt++;};break;
case 0x04: {INCR+=1;};break; // тест увиличиваем на 1
case 0x08: {PWM_modulator (PW++);} break; // управляем ШИМ

}
} // конец обработки прерываний по прерыванию таймеру



if ((RTC%1000)==0){
++begunock; // инкремент бегунка каждую секунду
RC0=RC0^1;
RC1=!RC0;
if (begunock==4) // крутим бегунок каждую секунду
begunock=0;
}
}
}



void posl(unsigned char R)// функция последовательного сдвига байта и затем вывод на посл регистр
{

unsigned char mask = 1;
unsigned char b,res;

//RC2=0;
for( b=1;b<=7;b++)
{
res=R&mask; // сравниваю биты с маской RC0 = (R & mask)?1:0;// сравниваю биты переменной
if(res!=0) // если результат не ноль то выводим в RC0 1 если ноль то ноль
{RB1=1;
RB0=1;
RB0=0;
}
else
{RB1=0;
RB0=1;
RB0=0;
}

mask<<=1;
} // функция сдвига
RD4=0;
RD5=0;// гасим индикатор сотен s1
RD6=0; // гасим индикатор десятков s2
RD7=0; // гасим индикатор едениц s3
RB2=1;// выводим на паралельный порт записанное последовательно число
__delay_ms (2);
RB2=0;// числа загружены защелка опять закрыта
}

void seg (int a, int b)
{
int t,F;
//RA1=0;// гасим индикатор сотен s1
//RA2=0; // гасим индикатор десятков s2
//RA5=0; // гасим индикатор едениц s3
t=0;
F=0;

switch(b)
{
case 1 :{t=16;}break;
case 2 :{t=32;}break;
case 3 :{t=64;}break;
case 4 :{t=128;}break;

}

switch(a%10)

{ case 0 : {F=0b0000001;posl (F); PORTD=t;}break;
case 1 : {F=0b1001111;posl (F); PORTD=t;}break;
case 2 : {F=0b0010010;posl (F); PORTD=t;}break;
case 3 : {F=0b0000110;posl (F); PORTD=t;}break;
case 4 : {F=0b1001100;posl (F); PORTD=t;}break;
case 5 : {F=0b0100100;posl (F); PORTD=t;}break;
case 6 : {F=0b0100000;posl (F); PORTD=t;}break;
case 7 : {F=0b0001111;posl (F); PORTD=t;}break;
case 8 : {F=0b0000000;posl (F); PORTD=t;}break;
case 9 : {F=0b0000100;posl (F); PORTD=t;}break;

}

}
void seg_point (int a, int b) // ??????? ???????? ??????????? ? ??????
{
int t;
t=0;
PORTD=0b00000000;


switch(b)
{
case 1 :{t=16;}break;
case 2 :{t=32;}break;
case 3 :{t=64;}break;
case 4 :{t=128;}break;

}

switch(a%10)

{ case 0 : {PORTB= 0b01000000; PORTD=t;}break;
case 1 : {PORTB= 0b01111001; PORTD=t;}break;
case 2 : {PORTB= 0b00100100; PORTD=t;}break;
case 3 : {PORTB= 0b00110000; PORTD=t;}break;
case 4 : {PORTB= 0b00011001; PORTD=t;}break;
case 5 : {PORTB= 0b00010010; PORTD=t;}break;
case 6 : {PORTB= 0b00000010; PORTD=t;}break;
case 7 : {PORTB= 0b01111000; PORTD=t;}break;
case 8 : {PORTB= 0b00000000; PORTD=t;}break;
case 9 : {PORTB= 0b00010000; PORTD=t;}break;

}

}

void get_temp()
{ static bit init;
unsigned char temp1;
unsigned char temp2;


init=INIT();
if(!init)
{TX(0xCC);
TX(0x44);
//for (pause_opros=0;pause_opros<=73; pause_opros++) //делаем паузу в пока опрашивается датчик и выводим инфу цыфры в это время 750??
// {
// segment(temperature_des,2); // ???????? ???????
// __delay_ms(5);
// segment(temperature_ed,3); // ???????? ? ??????
// __delay_ms (5);
// segment(temp_drob,4);// ???????? ?????
// __delay_ms(5);

// }

}
init=INIT();
if(!init)
{TX(0xCC);
TX(0xBE);
temp1=RX(); // L0 байт получаю
temp2=RX(); //HI байт получаю
}
pause_opros=0; //обнуляем перемееную задержки
temp_drob=temp1 &0b00001111; //записываем дробную часть в переменную
//temp_drob=((temp_drob*6)+2)/10; //переводим в нужное дробное число
temp1>>=4;
signloc=temp2&0x80; //определяем знак температуры
temp2<<=4;
temp2&=0b01110000;
temp2|=temp1; //перемещае все в одну переменную
if(signloc)
{ if(temp_drob>0)

{temperature=(127-temp2);
temp_drob=((temp_drob*6)+4)/10;
temp_drob=10-temp_drob;
//temp_drob=(10-temp_drob)|0x80;
}
else
{temperature=128-temp2;
//temp_drob|=0x80;
}
}
else
{temperature=temp2;
temp_drob= ((temp_drob*6)+2)/10;
}
}

void display (unsigned char* var_segm, unsigned char* DEC, unsigned char* INC, unsigned char anode, unsigned char* p_segm) {
if (*DEC!=6){
stop ( *p_segm, anode, *DEC ); // гашение сегмента
(*DEC)++; // инкремент гашения сегмента
}
else
if (*INC!=6) {//сегмент погас
start ( *var_segm, anode, *INC ); // зажигаем сегмент
(*INC)++;

}
if (*DEC==6 & *INC==6){ // стоп / старт прошли?
*p_segm=*var_segm; // перезаписываем значение переменной
*DEC=0; // обнуляем
*INC=0; // обнуляем
}
}
void begunok (unsigned char anode ){
PORTA=0x00; // гасим индикаторы
PORTB=begunok_PORTB[begunock]; // загружаем позицию бегунка
PORTD=begunok_PORTD[begunock]; // загружаем позицию бегунка
PORTA=anode_mask[anode];
}

void main()
{

maymass[0][0] = 0b00001100;
maymass[0][1] = 0b00011100; // 10%

maymass[1][0] = 0b00011000;
maymass[1][1] = 0b00111100; //20%

maymass[2][0] = 0b00100101;
maymass[2][1] = 0b00011100; //30%

maymass[3][0] = 0b00110001;
maymass[3][1] = 0b00111100; //40%

maymass[4][0] = 0b00111110;
maymass[4][1] = 0b00011100; //50%

maymass[5][0] = 0b01001010;
maymass[5][1] = 0b00111100; //60%

maymass[6][0] = 0b01010111;
maymass[6][1] = 0b00011100; //70%

maymass[7][0] = 0b01100011;
maymass[7][1] = 0b00111100; //80%

maymass[8][0] = 0b01110000;
maymass[8][1] = 0b00011100; //90%

maymass[9][0] = 0b01111100;
maymass[9][1] = 0b00111100; //100%




unsigned char temp;

//TRISB = 0x00;
configpic();
I2CInit();
init_comms();//инициализация UART
ALG=0;
TMR0=0;
higt=0;

pause_opros=0;


// запускаем ШИМ
PR2 = 0b01111100 ; //
T2CON = 0b00000101 ; // start timer 2 1:4
CCPR1L = 0b00111110 ; // ШИМ %50
CCP1CON = 0b00011100 ; //ШИМ %50


int i,X;
long int s; //переменная для ADC довольно большая потому как при коэфф больше 10 простых не зватает
unsigned char s1,s2,s3,X1,X2,X3,l,v;
unsigned char newhours_des; // пременная десятков часов
unsigned char newhours_ed; // переменная едениц часов
unsigned char newminutes_des; // переменная десятков минут
unsigned char newminutes_ed; // переменная едениц минут
unsigned char hours_des=7; // переменная temp десятков часов
unsigned char hours_ed=7; // переменная temp едениц часов
unsigned char minutes_des=7; // переменная temp десятков минут
unsigned char minutes_ed=7; // переменная temp едениц минут
unsigned char DEC_1, DEC_2, DEC_3, DEC_4, DEC_5, INC_1, INC_2, INC_3, INC_4, INC_5;
unsigned char anode0, anode1, anode2,anode3, anode4; // переменные для засветки анодов
anode0=0;
anode1=1;
anode2=2;
anode3=3;
anode4=4;
DEC_1=0; DEC_2=0; INC_1=0; INC_2=0; INC_3=0; INC_4=0; INC_5=0;
DEC_3=0; DEC_4=0;
begunock=0;

unsigned char d_change [10]; // обьявляем массив для хранения переменных start / stop
memset( d_change, 0, sizeof(unsigned char) * 10); // обнуляем массив

while (1)
{

if (ALG==0)

{ hours = ReadHour();
minutes=ReadMin();
newhours_ed=hours/10;
newhours_des=hours%10;
newminutes_des=minutes/10;
newminutes_ed=minutes%10;

for (i = 0; i < 100; i++){

if (newhours_ed != hours_ed) { // засветка десятков часов
// if (d_change[0]!=6) // скорее всего она не нужна
display (&newhours_ed, &d_change[0], &d_change[5], anode0, &hours_ed ); // делаем засвветку

}
else segment (hours_ed, anode0);
__delay_ms (5);

if (newhours_des != hours_des) { // засветка десятков часов

display (&newhours_des, &d_change[1], &d_change[6], anode1, &hours_des ); // делаем засвветку

}
else segment (hours_des, anode1);
__delay_ms (5);

begunok (anode2); // место под сегмент бегунок
__delay_ms (5);

if (minutes_des != newminutes_des) { // засветка десятков часов

display (&newminutes_des, &d_change[3], &d_change[8], anode3, &minutes_des ); // делаем засвветку

}
else segment (minutes_des, anode3);
__delay_ms (5);


if (minutes_ed != newminutes_ed) { // засветка десятков часов
// if (d_change[1]!=6) // скорее всего она не нужна
display (&newminutes_ed, &d_change[4], &d_change[9], anode4, &minutes_ed ); // делаем засвветку

}

else segment (minutes_ed, anode4);
__delay_ms (5);



// print_uart("I detected", 9999);
}
}
if (ALG==1){
get_temp(); // загружаем температуру
GIE=1;
temperature_des=temperature/10;
temperature_ed=temperature%10;

for(i=0;i<100;i++){
segment (temperature_des, anode2);
__delay_ms(5);
segment (temperature_ed, anode3);
__delay_ms(5);
segment (temp_drob, anode4);
__delay_ms(5);
}

}
if (ALG==2){
segment (2, anode0);
segment (2, anode1);
segment (2, anode2);
segment (2, anode3);
segment (2, anode4);
}

}

}



при попытке активировать датчик меняется значение TRIS C а при попытке изменить состояние пина RC5 ничего не меняется присутствует высокий уровень при
RC5=0; // обнуляем приемный пин

unsigned char INIT(void)//static bit INIT (void) //static bit INIT (void) //функция инициализации темп датчик
{//unsigned char b;//static bit b;
GIE=0;// запрещаем прерывания
RC5=0; // обнуляем приемный пин
STATE=1;
STATE=0; // проваливаем линию
__delay_us (500);
STATE=1; //переключаемся на вход
__delay_us (65);
b=PIN; //смотрм чего там на линии
__delay_us (450); //выжидаем интервал
GIE=1; // разрешаем прерывания
return b; // возврашаю ноль или один
}

Симулирую в протеусе еще прилагаю скин с состояниями регистров.
Миниатюры
pic16f877a_2.png  
reg33 вне форума   Ответить с цитированием
Старый 23.08.2018, 08:50   #102
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,773
Вес репутации: 5285/162
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от reg33 Посмотреть сообщение
собственно исходник
configpic();
I2CInit();
init_comms();//инициализация UART
увы, это не вся программа, самого интересного-то нет...

аппаратный иис модуль в былые годы имел ограничение на параллельную работу с тризами порта. собственно об этом и было в исходном сообщении.
чтобы упростить алгоритмы можно посоветовать сделать i2c софтовым. там работы на пару часов. Это займет существенно меньше времени хотя бы на объяснения что там не работает.
Greg вне форума   Ответить с цитированием
Старый 23.08.2018, 10:43   #103
reg33
Member
 
Регистрация: 11.11.2012
Возраст: 36
Сообщений: 69
Вес репутации: 85/0
reg33 will become famous soon enough
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от Greg Посмотреть сообщение
увы, это не вся программа, самого интересного-то нет...

аппаратный иис модуль в былые годы имел ограничение на параллельную работу с тризами порта. собственно об этом и было в исходном сообщении.
чтобы упростить алгоритмы можно посоветовать сделать i2c софтовым. там работы на пару часов. Это займет существенно меньше времени хотя бы на объяснения что там не работает.

configpic()
{ ADCON0=0b11000001;// модуль АЦП включен
ADCON1=0b10001110; //
OPTION_REG=0b11000001; //коэфф деления 1:4 таймер срабатывает через 1024мс (PS0-PS2)/ PS7-поддягивающие рез.включены /PS6-прерывание по переднему фронту
INTCON=0b10100000; // GIE=1 >> PS7-прерывания разрешены
//
// T0IF=1 >> PS5-прерывания от таймера TMR 0
// RBIE=1 >> PS3-перрывания от портов RB4, RB5, RB6 и RB7
TRISA=0b00000001;
TRISB=0b00000000;
TRISC=0b00000000;
TRISD=0b00000000;
TRISE=0b00000111; // порт работает на выход есои
}


void I2CInit(void){
TRISC3 = 1; /* SDA and SCL as input pin */
TRISC4 = 1; /* these pins can be configured either i/p or o/p */
SSPSTAT |= 0x80; /* Slew rate disabled */
SSPCON = 0x28; /* SSPEN = 1, I2C Master mode, clock = FOSC/(4 * (SSPADD + 1)) */
SSPADD = 0x28; /* 100Khz @ 4Mhz Fosc */
}

ну и uart.

#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
#define HIGH_SPEED 1

#if NINE == 1
#define NINE_BITS 0x40
#else
#define NINE_BITS 0
#endif

#if HIGH_SPEED == 1
#define SPEED 0x4
#else
#define SPEED 0
#endif


#define RX_PIN TRISC7
#define TX_PIN TRISC6


/* Serial initialization */
#define init_comms()\
RX_PIN = 1; \
TX_PIN = 1; \
SPBRG = DIVIDER; \
RCSTA = (NINE_BITS|0x90); \
TXSTA = (SPEED|NINE_BITS|0x20)

void putch(unsigned char);
unsigned char getch(void);
unsigned char getche(void);

#endif

честно говоря это стандартные бибилотеки ......I2C и uart.
reg33 вне форума   Ответить с цитированием
Старый 28.08.2018, 11:02   #104
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 38
Сообщений: 867
Вес репутации: 1266/62
siargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud of
По умолчанию Re: Нужен опыт по началу программированию на С.

предлагаю начать с начала, и в пустой программе, в бесконечном цикле подергать ножкой.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы

Последний раз редактировалось siargy; 28.08.2018 в 11:08.
siargy вне форума   Ответить с цитированием
Старый 28.08.2018, 12:17   #105
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,773
Вес репутации: 5285/162
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от reg33 Посмотреть сообщение
честно говоря это стандартные бибилотеки ......I2C и uart.
в языке Си нет "стандартных" библиотек I2C и uart. Бывают какие-то примеры от производителя.
Greg вне форума   Ответить с цитированием
Старый 11.09.2018, 17:35   #106
reg33
Member
 
Регистрация: 11.11.2012
Возраст: 36
Сообщений: 69
Вес репутации: 85/0
reg33 will become famous soon enough
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от Greg Посмотреть сообщение
в языке Си нет "стандартных" библиотек I2C и uart. Бывают какие-то примеры от производителя.
Добрый день!
С горем пополам UART заработал. Ну стал философский вопрос как реализуется код чтоб к примеру контроллер выполнял задачу динамической индикации индикации и одновременно реагировал (слушал) на команды из вне по UART ? ???

За ранее благодарен !
reg33 вне форума   Ответить с цитированием
Старый 11.09.2018, 18:08   #107
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,847
Вес репутации: 3528/76
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Нужен опыт по началу программированию на С.

reg33
можно задачи в суперлупе, с обслуживанием uart в прерывании.
как пример.
besogon вне форума   Ответить с цитированием
Старый 24.09.2018, 18:03   #108
_WIL_
Senior Member
 
Регистрация: 26.11.2009
Адрес: Беларусь
Сообщений: 707
Вес репутации: 1181/51
_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of
По умолчанию Re: Нужен опыт по началу программированию на С.

Дабы не изобретать велосипед решил погуглить готовый код для управления ADF4351 и много где MOD вычисляется так.

long M_Mod = PFDFreq * (100000 / ChanStep) / 100000;

Все скопипастили индусский код, или в этом есть какой то непонятный мне смысл?
_WIL_ вне форума   Ответить с цитированием
Старый 24.09.2018, 18:49   #109
paul
Senior Member
 
Регистрация: 23.08.2007
Адрес: Lipetsk
Возраст: 42
Сообщений: 210
Вес репутации: 425/47
paul is just really nicepaul is just really nicepaul is just really nicepaul is just really nicepaul is just really nice
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от _WIL_ Посмотреть сообщение
Дабы не изобретать велосипед решил погуглить готовый код для управления ADF4351 и много где MOD вычисляется так.

long M_Mod = PFDFreq * (100000 / ChanStep) / 100000;

Все скопипастили индусский код, или в этом есть какой то непонятный мне смысл?
Можно предположить, что точность при делении пытаются повысить.
paul вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Электропривод NSS Источники питания и силовая электроника 32 29.01.2012 14:17
MAX232 и USART, отсутствует сигнал на выходе. EviL_LaugH Общетехнические вопросы 15 31.01.2011 00:40
Проблема с прерыванием PIC 16F877A . chiraevevgenii Вопросы начинающих 8 13.01.2011 20:13
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00


Часовой пояс GMT +3, время: 08:58.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot