1

Тема: Помилка в програмі

Вітаю. Потрібна допомога у виправленні коду програми. Викладач написав, що є помилки і потрібно їх виправити. В телефоні складно мені помітити, а ноутбука в даній ситуації не має.
Ось код:

1.#include <io.h>
2.#include <delay.h>
3.// LCD functions
4.#include <alcd.h>
5.#include <stdio.h>
6.
7.char lcd_buffer[16];
8.
9.//коди цифр 0--9
10.const char NUM_code[] = {0x3F,0x06,0x5B,0x4F,0x66,
11.                         0x6D,0x7D,0x07,0x7F,0x6F};
12.                        
13.char tik,col=1;  // крок і номер знакомісця
14.char ind_msg[4]; // масив кодів символів для видачі на індикатор
15.
16.// Налаштування і ініціалізація таймера-лічильника ТС2
17.void init_TC2(void)
18.{
19.// Clock source: System Clock
20.// Clock value: 16 MHz / 256
21.// Mode: Normal top=0xFF
22.// OC2 output: Disconnected
23.// Timer Period: 4 ms
24.
25.TCCR2= (1<<CS22) | (0<<CS21) | (0<<CS20); // поділка fo/256
26.TCNT2=0x00; OCR2=0x00;
27.TIMSK=1<<TOIE2;   // режим переривання при переповнені ТС2
28.}
29.
30.// обробка переривання при переповнені лічільника ТС2
31.// виконання операції виводу одного байта на одне знакомісцє
32.interrupt [TIM2_OVF] void timer2_ovf_isr(void)
33.{
34. tik++;    // рахуємо кроки (такти видачі)
35. if (tik>5)// мах 5 кроків (тактів)
37.  { tik=0; // обнуляємо лічільник тактів
37.    col=1; // повертаємось на першу позицію індикації 
38.  }  
39. PORTD=ind_msg[tik];  // керування  сегментами
40. PORTB=col;            // підсвічуємо знакомісце
41. col<<=1;              // переходимо на нову позицію
42.}
43.
44.// функція перевода 4-х розрядного числа в коди для індикації
45.void decode_4(int x) 
46.{
47. inf_msg[3]=0;  // стирання незначущих нулів
48. ind_msg[2]=0;    // стирання незначущих нулів
49. ind_msg[1]=0;  // стирання незначущих нулів
50. ind_msg[0]=NUM_code[x%10]; // визначення коду цифри в одиниціх
51. x/=10;            // перенос значень до розряду одиниць
52. if(!x)return;  // вихід як що х < 10
53. ind_msg[1]=NUM_code[x%10]; // визначення коду цифри в десятках
54. x/=10;            // перенос значень до розряду одиниць
55. if(!x)return;  // вихід як що х < 100
56. ind_msg[2]=NUM_code[x%10]; // визначення коду цифри в сотнях
57. x/=10;
58. if(!x)return; //вихід якщо х < 1000
59. ind_msg[3]=NUM_code[x%10]; // визначення коду цифри в тисячних
60.}
61.
62.void main(void)
63.{  int X=0;
64.//  запис фіксуючих символів для тестового відображення
65.   ind_msg[0]=0x1;     // сегмент а
66.   ind_msg[1]=0x2;     // сегмент в
67.   ind_msg[2]=0x4;     // сегмент с
68.   ind_msg[3]=0x8;     // сегмент d
69.
70.// налаштування портів на видачу 
71.   DDRA=0xFF;     // порт LCD (РКІ)                              
72.   DDRD=0xFF;     // сегменти ---> X8
73.   DDRB=0xFF;     // знакомісця ---> X10
74.   init_TC2();    // налаштування лічильника ТС2
75.   lcd_init(8);   // налаштування РКІ - 8 символів в строчці
76.   lcd_puts("  Test"); // тестове повідомлення
77.   #asm("sei")   // асемблерна команда дозволу 78.переривань-початок індикації 
79.   delay_ms(5000);     // дивитись 5 секунд
80.
81.while (1) // вивід на екрани LCD і LED значення змінної Х
82.      {
83.      decode_4(X);      // перевід значення X у коди символів   
84.      lcd_gotoxy(0,1);  // первід курсора на другу строку
85.      sprintf(lcd_buffer,"  %4d",X); //підготовка буфера 86.індикації для LCD 
87.      lcd_puts(lcd_buffer); // вивід буфера екрана LCD 
88.      delay_ms(500);        // часова затримка в циклі
89.      X++; if(X>9999) {X=0;} // максимальне значення Х - 9999
90.         }
91.}

2

Re: Помилка в програмі

Є ось така від нього підказка, та куди її записати не розумію:

void test_indik_4(void) // тест індикації 4-х розрядного індикатора 
{ 
// підсвічуємо (включаємо) всі сегменти 
ind_msg[0]=0xFF; ind_msg[1]=0xFF; ind_msg[2]=0xFF; ind_msg[3]=0xFF;  
delay_ms(1000); // часова затримка 1 секунда 
// далі два варіанта: перший «тупо у лоб» 
ind_msg[0]=0x3F; ind_msg[1]=0x06; ind_msg[2]=0x5B; ind_msg[3]=0x4F; // 0123 
delay_ms(1000); // часова затримка 1 секунда 
// і далі 1234, 2345, 3456,…. 6789 
// або напишете вивід цих значень у циклі - 2-й варіант 
}

Не забудьте  включити виклик цієї функції в головної (main) програмі !

3

Re: Помилка в програмі

Це що має бути бігучий рядок на 4 сегментному індикаторі? І що у вас не виходить? Помилки якого типу (Компілятор вам, щось говорить, -я  так розумію це AVR STUDIO чи щось подібне)? У вас це все зібрано на макетній платі чи ви працюєте в симуляторі?

4

Re: Помилка в програмі

Схоже на те, що викладач вам у коментарях написав, що робити...

// і далі 1234, 2345, 3456,…. 6789
// або напишете вивід цих значень у циклі - 2-й варіант

5

Re: Помилка в програмі

Я це є роблю в текстовому редакторі в телефоні. Так це 4 розрядний семисегментний індикатор. Динамічна індикація на LED і статична на LCD

6

Re: Помилка в програмі

Так в чому проблема? що ти хочеш, щоб за тебе хтось зробив лабораторне завдання, а ти просто здав? Переходь у розділ "пропоную роботу" там тобі допоможуть за винагороду.

7

Re: Помилка в програмі

Я написав цей код сам, проте є помилка. Де вона я не можу зрозуміти, так як не маю технічного забезпечення. Єдине що в мене є це телефон, в ньому не має IDE для вирішення цієї проблеми.