Помогите найти неполадку,устройство на основе ATmega 128.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
KoTbI4
Родился
Сообщения: 7
Зарегистрирован: Чт окт 21, 2010 21:54:06
Откуда: Минск
Контактная информация:

Помогите найти неполадку,устройство на основе ATmega 128.

Сообщение KoTbI4 »

Добрый день. Я хотел бы обратится к вам с небольшой просьбой помочь найти ошибку (неполадку) . Устройство "Преобразователь кодов" во общем в чем его суть должен он переводить из двоичного кода в десятичный (семисегментник) и обратно все числа задаются клавиатурой. Заложена Atmega 128 .После сборки и его прошивки горят все диоды и индикаторы хотя они не должны также нет реакции на клавиатуру она 4х4.


Ниже приведена прошивка и все остальное . Пожалуйста помогите бедному студенту.

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

#include <mega128.h>
#include <delay.h>

// Declare your global variables here
#define A   1
#define B   2
#define C   4
#define D   8 
#define E  16
#define F  32
#define G  64

static flash unsigned char digits[] = {
   (A+B+C+D+E+F),   // 0
   (B+C),           // 1
   (A+B+D+E+G),     // 2
   (A+B+C+D+G),     // 3
   (B+C+F+G),       // 4
   (A+C+D+F+G),     // 5
   (A+C+D+E+F+G),   // 6
   (A+B+C),         // 7
   (A+B+C+D+E+F+G), // 8
   (A+B+C+D+F+G),   // 9
   (A+B+C+E+F+G),   // A - 10
   (C+D+E+F+G),     // b - 11
   (A+D+E+F),       // C - 12
   (B+C+D+E+G),     // d - 13
   (A+D+E+F+G),     // E - 14
   (A+E+F+G)        // F - 15
};

#define BIN2DEC 0
#define DEC2BIN 1

unsigned char digit_out[8], // буфер экрана
                   cur_dig, // тек.высвечиваемый символ (позиция)
                     rejim;

unsigned long int chislo;

unsigned char key_code[4][4] = { { 1, 2, 3, 99},
                                 { 4, 5, 6, 99},
                                 { 7, 8, 9, 99},
                                 {11,10,12, 99} }; 


//----------
// Timer 0 overflow interrupt service routine
// 125.000 Гц / 255 =  490,2 Гц
// 490,2 Гц / 8 = 61 Гц
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
    PORTE = 0xFF;  // потушить все (индикатор ОК)
   
    PORTD = digits[digit_out[cur_dig]];    // символ на экран

    PORTE = ~(1<<cur_dig);  // засветить нужный разряд
   
   cur_dig++;
    if (cur_dig > 7) cur_dig = 0;
}
//----------


//----------
unsigned char read_key(void) {
    unsigned char col, row, tmp;

    // столбцы на выход с лог ур."0", строки на вход с подтягивающ.рез.
    DDRF=0x0F;
    PORTF=0xF0;
   
    // считывавем строки
    tmp = (~PINF >> 4);
    if (tmp == 1)  row = 0;
    else if (tmp == 2)  row = 1;
         else if (tmp == 4) row = 2;
              else if (tmp == 8)  row = 3;
                   else {
                         // все на вход с подтягивающ.рез.
                         PORTF=0xFF;
                         DDRF=0x00;
                       
                         return 0; // если нажаты одновременно две кнопки или не было нажатий
                        }
 
    // строки на выход с лог ур."0", столбцы на вход с подтягивающ.рез.
    DDRF=0xF0;
    PORTF=0x0F;

    // считываем столбцы
    tmp = (~PINF & 0x0F);
    if (tmp == 1) col = 0;
    else if (tmp == 2) col = 1;
         else if (tmp == 4)  col = 2;
              else if (tmp == 8) col = 3;
                   else {
                         // все на вход с подтягивающ.рез.
                         PORTF=0xFF;
                         DDRF=0x00;
                       
                         return 0; // если нажаты одновременно две кнопки или не было нажатий
                        }

    // все на вход с подтягивающ.рез.
    DDRF=0x00;
    PORTF=0xFF;
       
    return key_code[row][col];   
}
//----------


//----------
void decode (void) {
    unsigned long int tmp;
   
    tmp = chislo;

    // двадцатибитное значение
    if (chislo <= 0xFFFFF) {     
        digit_out[7] = (unsigned char)(tmp % 10);  tmp = tmp / 10;
        digit_out[6] = (unsigned char)(tmp % 10);  tmp = tmp / 10;
        digit_out[5] = (unsigned char)(tmp % 10);  tmp = tmp / 10;
        digit_out[4] = (unsigned char)(tmp % 10);  tmp = tmp / 10;
        digit_out[3] = (unsigned char)(tmp % 10);  tmp = tmp / 10;
        digit_out[2] = (unsigned char)(tmp % 10);  tmp = tmp / 10;
        digit_out[1] = (unsigned char)(tmp % 10);  tmp = tmp / 10;
        digit_out[0] = (unsigned char)(tmp % 10);

   
        PORTC &= 0xF0; // обнулить первые четыре бита
   
        PORTA =  (unsigned char)(chislo & 0x000000FF);
        PORTB =  (unsigned char)((chislo >> 8)  & 0x000000FF);
        PORTC |= (unsigned char)((chislo >> 16) & 0x000000FF);
    }
    else  PORTC.6 = 1; // зажечь светодиод "переполнение"
}
//----------


// ==== MAIN ========
void main(void) {

unsigned char key;


// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTA=0x00;
DDRA=0xFF;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;

// Port E initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTE=0xFF;
DDRE=0xFF;

// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTF=0xFF;
DDRF=0x00;

// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=P State3=P State2=P State1=P State0=P
PORTG=0x1F;
DDRG=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x02;
TCNT0=0x00;
OCR0=0x00;

// External Interrupt(s) initialization
// INT0 - INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

ETIMSK=0x00;

// USART0 initialization
// USART0 disabled
UCSR0B=0x00;

// USART1 initialization
// USART1 disabled
UCSR1B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")

   rejim = DEC2BIN;
   PORTC.4 = 0; PORTC.5 = 1;

   while (1) {
        key = read_key();

        if (rejim == BIN2DEC) {
            // кнопка "1"
            if (key == 1)  chislo = (chislo << 1) + 1;
           
            // кнопка "0"
            if (key == 10)  chislo = chislo << 1;
        }

        if (rejim == DEC2BIN) {
            // кнопки от "1" до "9"
            if ((key >= 1) && (key <=9))  chislo = (chislo * 10) + key;
           
            // кнопка "0"
            if (key == 10)  chislo = chislo * 10;
        }

        if ((key >= 1) && (key <=10)) decode(); // конвертировать и заполнить экран
   
        if (key == 11) {
            chislo = 0; // очистка переменной
            PORTC.6 = 0; // погасить светодиод "переполнение"
       
            if (rejim == BIN2DEC) { rejim = DEC2BIN; PORTC.4 = 0; PORTC.5 = 1; }
            else                  { rejim = BIN2DEC; PORTC.4 = 1; PORTC.5 = 0; }
           
            decode(); // конвертировать и заполнить экран     
        }
 
        if (key == 12) {
            chislo = 0; // очистка переменной
            PORTC.6 = 0; // погасить светодиод "переполнение"
           
            decode(); // конвертировать и заполнить экран
        }
       
        delay_ms(200);
   }
Вложения
Схемы.rar
(227.59 КБ) 154 скачивания
Shplv
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пт июн 04, 2010 19:24:26

Re: Помогите найти неполадку,устройство на основе ATmega 128

Сообщение Shplv »

Типичная ошибка при программировании fuse ATmega128 - оставить запрограммированным M103C. В этих МК этот fuse программируют на заводе - необходимо убрать!
KoTbI4
Родился
Сообщения: 7
Зарегистрирован: Чт окт 21, 2010 21:54:06
Откуда: Минск
Контактная информация:

Re: Помогите найти неполадку,устройство на основе ATmega 128

Сообщение KoTbI4 »

Не помогло:(
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: Помогите найти неполадку,устройство на основе ATmega 128

Сообщение coredumped »

А отлаживать не пробовали? Добейтесь сначала, чтоб индикация заработала, чтоб таймер тикал и на индикаторах появились те символы, которые должны быть, затем переходите к остальным частям программы. Т.е. запустите хотя-бы что-то, потом по частям все и отладите. Я так понял, у Вас лабораторная работа. Я конечно могу ее сделать, но мне зачет не нужен :) Ничего сложного нет - нужно брать и делать. Если сами разберетесь - получите опыт и удовлетворение. :))
Все будет только лучше, в крайнем случае - хуже.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»