Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.65/79: Рейтинг темы: голосов - 79, средняя оценка - 4.65
oromir
0 / 0 / 0
Регистрация: 17.04.2014
Сообщений: 11
1

Начинающий, прошу помощи микроСИ

20.04.2014, 15:05. Просмотров 14298. Ответов 28
Метки нет (Все метки)

здравствуйте! помогите с кодом пожалуйста. есть контролер easypic5 pic16f877a. на языку микроСИ реализовать: На 32-ти «светодиодах» порта в/в PORTA, PORTB, PORTC, PORTD реализовать вывод в каждый порт 10 –ти значений из своего массива каждые 0,5 сек. Благодарю.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2014, 15:05
Ответы с готовыми решениями:

Прошу помощи с UART на AtMega32
Код в кратце следующий #define F_CPU 8000000UL #define BAUD 38400 #define MYUBRR...

Таинственный оверсемплинг?! Прошу помощи..
Привет всем! Я пытаюсь смоделировать оверсемплинг. Начитался AVR121, так красиво все написано: "-...

Прошу помощи начинающему с ultasonic HC-sr04
Всем привет. См. сообщение ниже Собираю на Atmega-16 8Мгц (Pinboard rev 2) Буду благодарен...

Прошу помощи RFID Мультиплексор на MSP430F2370
Добрый день.Уважаемые форумчане нужна ваша помощь.Я новичок и хотелось бы разобраться.Нашел мануал...

Прошу помощи по таймерам ATmega8 (ASM)
Здравствуйте! Я с AVR работаю недавно и когда получил очередное задание по работе столкнулся с...

28
pprom5
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 85
20.04.2014, 18:01 2
Цитата Сообщение от oromir
здравствуйте! помогите с кодом пожалуйста. есть контролер easypic5 pic16f877a. на языку микроСИ реализовать: На 32-ти «светодиодах» порта в/в PORTA, PORTB, PORTC, PORTD реализовать вывод в каждый порт 10 –ти значений из своего массива каждые 0,5 сек. Благодарю.
Правильно ли я понимаю, что у вас 4 массива по 10 значений в каждом?
0
oromir
0 / 0 / 0
Регистрация: 17.04.2014
Сообщений: 11
20.04.2014, 18:32 3
Цитата Сообщение от pprom5
Цитата Сообщение от oromir
здравствуйте! помогите с кодом пожалуйста. есть контролер easypic5 pic16f877a. на языку микроСИ реализовать: На 32-ти «светодиодах» порта в/в PORTA, PORTB, PORTC, PORTD реализовать вывод в каждый порт 10 –ти значений из своего массива каждые 0,5 сек. Благодарю.
Правильно ли я понимаю, что у вас 4 массива по 10 значений в каждом?

так точно, всего 40 чисел
0
HitysoptirX
0 / 0 / 0
Регистрация: 29.10.2012
Сообщений: 245
20.04.2014, 19:02 4
инициализируйте 4 массива и кидайте их в порт
Код
  unsykned short mas1[10]=(0,1,2,3,4,5,6,7,8,9);
unsykned short mas2[10]=(0,1,2,3,4,5,6,7,8,9);
unsykned short mas3[10]=(0,1,2,3,4,5,6,7,8,9);
unsykned short mas4[10]=(0,1,2,3,4,5,6,7,8,9);
unsykned short i;
void main() {
while (1) {

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

PORTA= mas1[i];
PORTB= mas2[i];
PORTC= mas3[i];
PORTD= mas4[i];

Delay_ms(500);
}
}
}
инициализация конкретного чипа, в сэмплах микроси есть, как и пример для ледов
0
oromir
0 / 0 / 0
Регистрация: 17.04.2014
Сообщений: 11
20.04.2014, 19:06 5
Цитата Сообщение от HitysoptirX
инициализируйте 4 массива и кидайте их в порт
Код:
unsykned short mas1[10]=(0,1,2,3,4,5,6,7,8,9);
unsykned short mas2[10]=(0,1,2,3,4,5,6,7,8,9);
unsykned short mas3[10]=(0,1,2,3,4,5,6,7,8,9);
unsykned short mas4[10]=(0,1,2,3,4,5,6,7,8,9);
unsykned short i;
void main() {
while (1) {

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

PORTA= mas1[i];
PORTB= mas2[i];
PORTC= mas3[i];
PORTD= mas4[i];

Delay_ms(500);
}
}
}

инициализация конкретного чипа, в сэмплах микроси есть, как и пример для ледов
спасибо огромное добрый человек!
0
HitysoptirX
0 / 0 / 0
Регистрация: 29.10.2012
Сообщений: 245
20.04.2014, 19:10 6
не за что
числа в массиве я, для примера написал, а так рисуйте свои-любые (до 255 )
0
oromir
0 / 0 / 0
Регистрация: 17.04.2014
Сообщений: 11
20.04.2014, 19:20 7
Цитата Сообщение от HitysoptirX
не за что
числа в массиве я, для примера написал, а так рисуйте свои-любые (до 255 )
до 255 это потому что в ячейку больше не влезет\?
0
HitysoptirX
0 / 0 / 0
Регистрация: 29.10.2012
Сообщений: 245
20.04.2014, 20:56 8
Цитата Сообщение от oromir
Цитата Сообщение от HitysoptirX
не за что
числа в массиве я, для примера написал, а так рисуйте свои-любые (до 255 )
до 255 это потому что в ячейку больше не влезет\?

порт у вас восьмибитный 255 это 0хFF или 0b11111111, то есть на выходе все единички
для примера
Код
unsykned short mas1[10]=(1,2,4,8,16,32,64,128,255);
огонек побегает, в конце зажжется всеми пинами
внизу микроси есть калькулятор, там и смотрите

0
pprom5
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 85
21.04.2014, 11:03 9
Вот Вам немного подправленная версия:
Код
#define T1L 0;              // Значения для таймера
#define T1H 134;
unsykned short const m1[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m2[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m3[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m4[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short i=0;

void interrupt() {          // Обработчик прерываний
if (PIR1.TMR1IF) {        // Если предывание от таймера 1
TMR1L = T1L;
TMR1H = T1H;
PORTA=m1[i];            // Выводим данные из массива
PORTB=m2[i];
PORTC=m3[i];
PORTD=m4[i];
i++;                    // Управляем счетчиком
if (i>=10) {i=0;}
PIR1.TMR1IF = 0;        // Сброс флага прерывания
}
}

void main() {
ADCON1=0x06;             // Порты как цифровые
TRISA=0x00;              // и на выход
TRISB=0x00;
TRISC=0x00;
TRISD=0x00;
T1CON=0b00100000;        // Настраиваем тацймер 1
PIE1.TMR1IE=1;           // и его прерывания
PIR1.TMR1IF=0;
TMR1L=T1L;
TMR1H = T1H;
INTCON.PEIE=1;
INTCON.GIE=1;            // Разрешаем все прерывания
T1CON.TMR1ON=1;          // Включаем таймер
while(1)
{
// Здесь делаем что хотим,
// невависимо от вывода данных в порты
}
}
Отличия:
1. Вывод происходит каждые 0,5с по прерыванию таймера, что позволяет освободить основное время процессора.
2. Если массив в процессе использования не меняется, то его можно объявить как константу и сэкономить 10% ОЗУ, имеющегося в МК.

В архиве проект в mykroC и файл для Proteus.

[41.4 Кб]
0
oromir
0 / 0 / 0
Регистрация: 17.04.2014
Сообщений: 11
21.04.2014, 16:32 10
Цитата Сообщение от pprom5
Вот Вам немного подправленная версия:
Код:
#define T1L 0; // Значения для таймера
#define T1H 134;
unsykned short const m1[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m2[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m3[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m4[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short i=0;

void interrupt() { // Обработчик прерываний
if (PIR1.TMR1IF) { // Если предывание от таймера 1
TMR1L = T1L;
TMR1H = T1H;
PORTA=m1[i]; // Выводим данные из массива
PORTB=m2[i];
PORTC=m3[i];
PORTD=m4[i];
i++; // Управляем счетчиком
if (i>=10) {i=0;}
PIR1.TMR1IF = 0; // Сброс флага прерывания
}
}

void main() {
ADCON1=0x06; // Порты как цифровые
TRISA=0x00; // и на выход
TRISB=0x00;
TRISC=0x00;
TRISD=0x00;
T1CON=0b00100000; // Настраиваем тацймер 1
PIE1.TMR1IE=1; // и его прерывания
PIR1.TMR1IF=0;
TMR1L=T1L;
TMR1H = T1H;
INTCON.PEIE=1;
INTCON.GIE=1; // Разрешаем все прерывания
T1CON.TMR1ON=1; // Включаем таймер
while(1)
{
// Здесь делаем что хотим,
// невависимо от вывода данных в порты
}
}

Отличия:
1. Вывод происходит каждые 0,5с по прерыванию таймера, что позволяет освободить основное время процессора.
2. Если массив в процессе использования не меняется, то его можно объявить как константу и сэкономить 10% ОЗУ, имеющегося в МК.

В архиве проект в mykroC и файл для Proteus.
Спасибо за инфу
0
oromir
0 / 0 / 0
Регистрация: 17.04.2014
Сообщений: 11
27.04.2014, 14:38 11
Цитата Сообщение от pprom5
Вот Вам немного подправленная версия:
Код:
#define T1L 0; // Значения для таймера
#define T1H 134;
unsykned short const m1[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m2[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m3[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m4[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short i=0;

void interrupt() { // Обработчик прерываний
if (PIR1.TMR1IF) { // Если предывание от таймера 1
TMR1L = T1L;
TMR1H = T1H;
PORTA=m1[i]; // Выводим данные из массива
PORTB=m2[i];
PORTC=m3[i];
PORTD=m4[i];
i++; // Управляем счетчиком
if (i>=10) {i=0;}
PIR1.TMR1IF = 0; // Сброс флага прерывания
}
}

void main() {
ADCON1=0x06; // Порты как цифровые
TRISA=0x00; // и на выход
TRISB=0x00;
TRISC=0x00;
TRISD=0x00;
T1CON=0b00100000; // Настраиваем тацймер 1
PIE1.TMR1IE=1; // и его прерывания
PIR1.TMR1IF=0;
TMR1L=T1L;
TMR1H = T1H;
INTCON.PEIE=1;
INTCON.GIE=1; // Разрешаем все прерывания
T1CON.TMR1ON=1; // Включаем таймер
while(1)
{
// Здесь делаем что хотим,
// невависимо от вывода данных в порты
}
}

Отличия:
1. Вывод происходит каждые 0,5с по прерыванию таймера, что позволяет освободить основное время процессора.
2. Если массив в процессе использования не меняется, то его можно объявить как константу и сэкономить 10% ОЗУ, имеющегося в МК.

В архиве проект в mykroC и файл для Proteus.
попробовал сегодня вбить в PIC16F877A ничего не происходит. диоды не горят
0
pprom5
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 85
27.04.2014, 15:58 12
Цитата Сообщение от oromir
Цитата Сообщение от pprom5
Вот Вам немного подправленная версия:
Код:
#define T1L 0; // Значения для таймера
#define T1H 134;
unsykned short const m1[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m2[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m3[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m4[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short i=0;

void interrupt() { // Обработчик прерываний
if (PIR1.TMR1IF) { // Если предывание от таймера 1
TMR1L = T1L;
TMR1H = T1H;
PORTA=m1[i]; // Выводим данные из массива
PORTB=m2[i];
PORTC=m3[i];
PORTD=m4[i];
i++; // Управляем счетчиком
if (i>=10) {i=0;}
PIR1.TMR1IF = 0; // Сброс флага прерывания
}
}

void main() {
ADCON1=0x06; // Порты как цифровые
TRISA=0x00; // и на выход
TRISB=0x00;
TRISC=0x00;
TRISD=0x00;
T1CON=0b00100000; // Настраиваем тацймер 1
PIE1.TMR1IE=1; // и его прерывания
PIR1.TMR1IF=0;
TMR1L=T1L;
TMR1H = T1H;
INTCON.PEIE=1;
INTCON.GIE=1; // Разрешаем все прерывания
T1CON.TMR1ON=1; // Включаем таймер
while(1)
{
// Здесь делаем что хотим,
// невависимо от вывода данных в порты
}
}

Отличия:
1. Вывод происходит каждые 0,5с по прерыванию таймера, что позволяет освободить основное время процессора.
2. Если массив в процессе использования не меняется, то его можно объявить как константу и сэкономить 10% ОЗУ, имеющегося в МК.

В архиве проект в mykroC и файл для Proteus.
попробовал сегодня вбить в PIC16F877A ничего не происходит. диоды не горят

Проверьте настройки:
1 генератор - в проекте внешний кварц 1 мгц
2 есть ли подтяжка mclr к vpp
0
pprom5
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 85
27.04.2014, 16:08 13
http://www.mykroe.com/downtoods/get/5/e ... manual.pdf
стр 13 вывод MCLR должен быть подключен как сброс
посмотрите стр 14-15 по поводу генератора ( как вариант можно подправить настройки проекта в микроси под имеющийся генератор)

ну естественно светодиоды тоже должны быть подключёны
0
oromir
0 / 0 / 0
Регистрация: 17.04.2014
Сообщений: 11
27.04.2014, 16:10 14
Цитата Сообщение от pprom5
Цитата Сообщение от oromir
Цитата Сообщение от pprom5
Вот Вам немного подправленная версия:
Код:
#define T1L 0; // Значения для таймера
#define T1H 134;
unsykned short const m1[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m2[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m3[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short const m4[10]={0,1,2,3,4,5,6,7,8,9};
unsykned short i=0;

void interrupt() { // Обработчик прерываний
if (PIR1.TMR1IF) { // Если предывание от таймера 1
TMR1L = T1L;
TMR1H = T1H;
PORTA=m1[i]; // Выводим данные из массива
PORTB=m2[i];
PORTC=m3[i];
PORTD=m4[i];
i++; // Управляем счетчиком
if (i>=10) {i=0;}
PIR1.TMR1IF = 0; // Сброс флага прерывания
}
}

void main() {
ADCON1=0x06; // Порты как цифровые
TRISA=0x00; // и на выход
TRISB=0x00;
TRISC=0x00;
TRISD=0x00;
T1CON=0b00100000; // Настраиваем тацймер 1
PIE1.TMR1IE=1; // и его прерывания
PIR1.TMR1IF=0;
TMR1L=T1L;
TMR1H = T1H;
INTCON.PEIE=1;
INTCON.GIE=1; // Разрешаем все прерывания
T1CON.TMR1ON=1; // Включаем таймер
while(1)
{
// Здесь делаем что хотим,
// невависимо от вывода данных в порты
}
}
Отличия:
1. Вывод происходит каждые 0,5с по прерыванию таймера, что позволяет освободить основное время процессора.
2. Если массив в процессе использования не меняется, то его можно объявить как константу и сэкономить 10% ОЗУ, имеющегося в МК.

В архиве проект в mykroC и файл для Proteus.
попробовал сегодня вбить в PIC16F877A ничего не происходит. диоды не горят

Проверьте настройки:
1 генератор - в проекте внешний кварц 1 мгц
2 есть ли подтяжка mclr к vpp

перемычка к vvp есть
внешний кварц задаем при создании проекта? или я чего то не понимаю? я не профи, могу тупить)
0
pprom5
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 85
27.04.2014, 16:26 15
1. есть у PIC16F877A такой вывод MCLR/VPP/THV (вывод 1 мс) он должен быть подключен к vpp (напряжение питания) через резистор 10К и к земле через кондестатор,
эти цепи у тебя на плате есть, нужно установить как на картинке в описании на плату
2. у твоего мк не внутреннего генератора, поэтому нужен кварц, установи перемычки на плате как в мануале, а фактическую частоту кварца (на нем написано) укажи компилятору в меню "Project"->"Edit project" в окне "ossyttator frequercy", пере компилируй и перепрошей

ps
смотри картинки




<Изображение удалено>


<Изображение удалено>
0
pprom5
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 85
27.04.2014, 16:29 16
еще по поводу светодиодов проверь sw6
http://www.mykroe.com/downtoods/get/5/e ... manual.pdf стр17 - 18
0
oromir
0 / 0 / 0
Регистрация: 17.04.2014
Сообщений: 11
28.04.2014, 14:18 17
Цитата Сообщение от pprom5
еще по поводу светодиодов проверь sw6
http://www.mykroe.com/downtoods/get/5/e ... manual.pdf стр17 - 18
Сегодня пробовал забить ещё раз, горят только диоды порта D. Сделал все как вы сказали
0
pprom5
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 85
28.04.2014, 16:01 18
Цитата Сообщение от oromir
Цитата Сообщение от pprom5
еще по поводу светодиодов проверь sw6
http://www.mykroe.com/downtoods/get/5/e ... manual.pdf стр17 - 18
Сегодня пробовал забить ещё раз, горят только диоды порта D. Сделал все как вы сказали
Странно за программу я уверен,
все таки я думаю что то с настройками платы, к сожалению easypic5 у меня нет, проверить не смогу,
а пик точно pic16f877a ? случайно не pic16f887a?
0
oromir
0 / 0 / 0
Регистрация: 17.04.2014
Сообщений: 11
28.04.2014, 16:06 19
Цитата Сообщение от pprom5
Цитата Сообщение от oromir
Цитата Сообщение от pprom5
еще по поводу светодиодов проверь sw6
http://www.mykroe.com/downtoods/get/5/e ... manual.pdf стр17 - 18
Сегодня пробовал забить ещё раз, горят только диоды порта D. Сделал все как вы сказали
Странно за программу я уверен,
все таки я думаю что то с настройками платы, к сожалению easypic5 у меня нет, проверить не смогу,
а пик точно pic16f877a ? случайно не pic16f887a?
что 877А точно. а как просто реализовать хаотичный вывод на порты чисел (имеется в виду на светодиоды)?
дальше постараюсь сам разобраться
0
HitysoptirX
0 / 0 / 0
Регистрация: 29.10.2012
Сообщений: 245
28.04.2014, 22:00 20
Код
  unsykned short mas1[10]={0,1,2,4,8,16,32,64,128,255};
unsykned short mas2[10]={0,1,2,4,8,16,32,64,128,255};
unsykned short mas3[10]={0,1,2,4,8,16,32,64,128,255};
unsykned short mas4[10]={0,1,2,4,8,16,32,64,128,255};
unsykned short i;

void main() {

TRISA = 0x00;          // конфигурация порта как цифровой выход
TRISB = 0x00;          // конфигурация порта как цифровой выход
TRISC = 0x00;          // конфигурация порта как цифровой выход
TRISD = 0x00;          // конфигурация порта как цифровой выход
while (1) {

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

PORTA= mas1[i];
PORTB= mas2[i];
PORTC= mas3[i];
PORTD= mas4[i];

Delay_ms(500);
}
}
}
как я понял, вы не конфигурировали выходы порта

TRISA = 0x00; // конфигурация порта как цифровой выход
TRISB = 0x00; // конфигурация порта как цифровой выход
TRISC = 0x00; // конфигурация порта как цифровой выход
TRISD = 0x00; // конфигурация порта как цифровой выход

[2.58 Кб]
0
28.04.2014, 22:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2014, 22:00

Прошу помощи - тестовый стенд CashCode MVU
Есть такой купюроприемник - CashCode MVU, у него есть родственник - CashCode SM и MFL. Работаю в...

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

Прошу помощи в переделке/написании софта под ATtiny13
Всем доброго времени суток. К сожалению я абсолютный ноль в микроконтроллерах, поэтому набрался...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru