Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > AVR studio проблемма с задержкой


Автор: СерегаГоляков 11.12.2010, 13:11
Здравствуйте, написал прогу. Неработает, портится после выхода из любого  _delay_ms(10); Написал для Atmel8515
А в отладке, стрелочка пропадаает, после ДЕЛЕЯ через несколько шагов, вновь где-нибудь появляется оО
При этом вылетает:
AVR Simulator: Unsupported instruction 'call' at address 0x00071d
AVR Simulator: Unsupported instruction 'jmp' at address 0x00073a
AVR Simulator: Unsupported instruction 'call' at address 0x00015e
AVR Simulator: Unsupported instruction 'jmp' at address 0x000558


Программа выводит алфавит, а при нажатии комбинации 10111111 выводит анимации алфавита побуквенную.
 smile 
Это 2я моя прога, первая выводила кол-во нажатий, в той ниче подобного не было.

Сделал аналог на С++(может это и СИ получился), в Микрософт Вижуал Студии -> другие языки->Visual C++ ->консольное приложение.
Всё робит, выводит в консоль.

Вот прога:

Код

#include <avr/io.h>;
#include <avr/delay.h>;
 
void switch1(unsigned char inII){
            y=inII;    
            void clear1(){    //очистка матрицы
                    _delay_ms(p);
                    PORTD=0xFF;    
                    PORTB=0;
                    }
            switch(y){
                case  0x80:// А                            
                    PORTB=0b10000000;
                    PORTD=0b11100011;
                    _delay_ms(p);
                    PORTD=0x0;
                    PORTB=0xFF;
                    PORTB=0x0;
                    PORTB=0b00001000;
                    PORTD=0b11100111;
                    _delay_ms(p);
                    PORTD=0x0;
                    PORTB=0xFF;
                    PORTB=0x0;
                  PORTB=0b01111111;
                    PORTD=0b11011011;
                    _delay_ms(p);
                    PORTD=0x0;
                    PORTB=0xFF;
                    PORTB=0x0;
                    break;
                case 0x81:// Б
                    PORTB=0b10000000;
                    PORTD=0b11000011;
                    clear1();
                    PORTB=0b01100000;
                    PORTD=0b11011111;
                    clear1();
                    PORTB=0b00010001;
                    PORTD=0b11000111;
                    clear1();
                    PORTB=0b00001110;
                    PORTD=0b11011011;
                    clear1();
                    break;
                case 0x0082:// В
                    PORTB=0b10010001;
                    PORTD=0b11000111;
                    clear1();
                    PORTB=0b01101110;
                    PORTD=0b11011011;
                                 break;
                                case 0x83:// Г
                    PORTB=0b10000000;
                    PORTD=0b11000011;
                        clear1();
                    PORTB=0b01111111;
                    PORTD=0b11011111;
                    clear1();
                    break;
                default:
                    PORTB=0b10000001;
                    PORTD=0b00000000;            
                    clear1();
                    PORTB=0b01000010;
                    PORTD=0b10111101;            
                    clear1();
                    PORTB=0b00100100;
                    PORTD=0b11011011;            
                    clear1();
                    PORTB=0b00011000;
                    PORTD=0b11100111;
                    clear1();
                    PORTB=0b01111110;
                    PORTD=0b01111110;
                    clear1();
                    break;
                    }
}
unsigned char in;
unsigned char MMM=10111111;
unsigned char ASCII[42]={ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
 0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,
 0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,
 0x9E,0x9F, 
 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
int j=0; //итератор
unsigned char inII; 
unsigned char y;
int p=10;

void main () {     /*Буквы 32, без "ё": */

    DDRB = 0xFF; // port b - output
    PORTB = 0x00;
    PORTA=0xFF; //pull up resistors ON
    DDRD = 0xFF; // port d - output
    in=PINA;//входная комбинация
    
//    in=0b10111111;//для отладки заменим на это, чтобы в цикл FOR войти
    in=0b10000000;
    
//    in=~in;
    
    if((in/*~in*/) == (MMM)){//if((~in)&(0b10111111))==0){
        for(j=0;j<20;j ++){
            inII=ASCII[j];
            switch1(inII);
            _delay_ms(500);
            }
    }else{    
        inII=in;
        switch1(inII);//передадим и выведем одну букву.
    }    
}



Автор: Mazzi 12.12.2010, 12:31
У тебя в функции main нет бесконечного цикла. Попробуй добавить.

Автор: СерегаГоляков 12.12.2010, 12:45
да это для фора ваще пофиг)
мож у мя с ОС рамс

Автор: UniBomb 13.12.2010, 10:49
У меня предложенная программа даже не компилируется. Ошибок много:

1. Слишком лихо объявлять функции внутри других функций. Это касается функции clear1;
2. Функция switch1 не знает переменную y;
3. Функция clear1 и switch1 не знают переменную p;
4. Не рекомендуется использовать переменные в качестве параметра _delay_ms, ибо код от этого возрастает на порядок, что может влиять на другие участки кода;
5. После директивы #include точка с запятой не ставится;


Пока представленная программа не будет компилироваться дальше разговаривать не о чем  smile 

Автор: СерегаГоляков 13.12.2010, 17:10
Цитата(UniBomb @ 13.12.2010,  10:49)
У меня предложенная программа даже не компилируется. Ошибок много:

1. Слишком лихо объявлять функции внутри других функций. Это касается функции clear1;
2. Функция switch1 не знает переменную y;
3. Функция clear1 и switch1 не знают переменную p;
4. Не рекомендуется использовать переменные в качестве параметра _delay_ms, ибо код от этого возрастает на порядок, что может влиять на другие участки кода;
5. После директивы #include точка с запятой не ставится;


Пока представленная программа не будет компилироваться дальше разговаривать не о чем  smile

странно у меня стоит 4.17 АВР, все компилируется, вот изменил текст, как вы и предложили, но она все равно скочит по КЕЙСАМ((
Добавил ту же частоту что и в ИСИС
 
Код

#define F_CPU 1000000L //


Код

#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 1000000L // êâàðö 1 MHz
 unsigned char ASCII[42]={ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
 0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,
 0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,
 0x9E,0x9F, //ÖÈÔÐÛ: 
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
int j=0; //èòåðàòîð
unsigned char inII; 
unsigned char y;
void clear1(){    //î÷èñòêà ìàòðèöû
                    _delay_ms(10);
                    PORTD=0xFF;    
                    PORTB=0;
                    }
void switch1(unsigned char inII){
            y=inII;
            switch(y){
                case  0x80:// À                            
                    PORTB=0b10000000;
                    PORTD=0b11100011;
                    clear1();
                    //delay_ms(10);
                    //PORTD=0xFF;    
                    //PORTB=0;
                    PORTB=0b00001000;
                    PORTD=0b11100111;
                    clear1();
                    PORTB=0b01111111;
                    PORTD=0b11011011;
                    clear1();
                    
                    goto end;
                case 0x81:// Á  
                    PORTB=0b10000000;
                    PORTD=0b11000011;
                    clear1();
                    PORTB=0b01100000;
                    PORTD=0b11011111;
                    clear1();
                    PORTB=0b00010001;
                    PORTD=0b11000111;
                    clear1();
                    PORTB=0b00001110;
                    PORTD=0b11011011;
                    clear1();
                    goto end;
                case 0x82:// Â
                    PORTB=0b10010001;
                    PORTD=0b11000111;
                    clear1();
                    PORTB=0b01101110;
                    PORTD=0b11011011;
                 goto end;
                case 0x83:// Ã
                    PORTB=0b10000000;
                    PORTD=0b11000011;
                    clear1();
                    PORTB=0b01111111;
                    PORTD=0b11011111;
                    clear1();
                    goto end;
                case 0x84:// Ä
                    PORTB=0b10000000;
                    PORTD=0b11110011;
                    clear1();
                    PORTB=0b01111100;
                    PORTD=0b11101011;
                    clear1();                                
                    PORTB=0b00000010;
                    PORTD=0b11000001;
                    clear1();                                
                    PORTB=0b00000001;
                    PORTD=0b11011101;
                    clear1();
                    goto end;
                
            /*    default:
                _delay_ms(1000);
                    PORTB=0b10000001;
                    PORTD=0b00000000;            
                    clear1();
                    PORTB=0b01000010;
                    PORTD=0b10111101;            
                    clear1();
                    PORTB=0b00100100;
                    PORTD=0b11011011;            
                    clear1();
                    PORTB=0b00011000;
                    PORTD=0b11100111;
                    clear1();
                    PORTB=0b01111110;
                    PORTD=0b01111110;
                    clear1();
                    goto end;*/
                    }
                    end:;
}
unsigned char in;
unsigned char MMM=0b10111111;
void main () {     /*Áóêâû 32, áåç "¸": */
    DDRB = 0xFF; // port b - output
    DDRC=0xFF;
    PORTB = 0x00;
    PORTA=0xFF; //pull up resistors ON
    DDRD = 0xFF; // port d - output
    while(1){
        in=PINA;//âõîäíàÿ êîìáèíàöèÿ
    //    in=0b10111111;//äëÿ îòëàäêè çàìåíèì íà ýòî 
    //    in=in^0xFF;
    //    in=0b10000001;
    //if((in/*~in*/) == ((int)MMM)){
    if(in==0b10111111){
//    if ((in & 0b0100000)==0) {
        //    for(j=0;j<42;j ++){
        
        while(j<42){
                inII=ASCII[j];
                j++;
            //    PORTC=PORTD;
            switch1(inII);
                _delay_ms(500);
                }
        j=0;
    }else{    
            inII=in;
            switch1(inII);//ïåðåäàäèì è âûâåäåì îäíó áóêâó.
        }    
    }
}







комментарии в коде те же)
Приложил файлик с проектом в ИСИС

Автор: Mazzi 13.12.2010, 19:05
Из swich выход по goto это бред. Ставьте в конце каждого case оператор break.  И будет вам счастье.

Автор: СерегаГоляков 13.12.2010, 20:06
Цитата(Mazzi @ 13.12.2010,  19:05)
Из swich выход по goto это бред. Ставьте в конце каждого case оператор break.  И будет вам счастье.

я думал мож ГОТО поможет, но нет, знаю что бреаке надо. Истина то не в этом, прыгает то не из за этого по любым кейсам

Автор: UniBomb 14.12.2010, 09:10
Подправил немного форматирование и исправил пару мелких недочётов. СерегаГоляков, старайтесь придерживаться какого-нибудь стиля форматирования, ибо такие программы читать сложно, да и неохота 

Код

#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 1000000L
//---------------------------------------------------------------------------
unsigned char ASCII[42]={ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
                          0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,
                          0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,
                          0x9E,0x9F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
                          0x38,0x39 };
//---------------------------------------------------------------------------
void clear1()
{
    _delay_ms(10);
    PORTD=0xFF;    
    PORTB=0;
}
//---------------------------------------------------------------------------
void switch1(unsigned char inII)
{
    switch(inII)
    {
        case  0x80:// A                            
            PORTB=0b10000000;
            PORTD=0b11100011;
            clear1();
            //delay_ms(10);
            //PORTD=0xFF;    
            //PORTB=0;
            PORTB=0b00001000;
            PORTD=0b11100111;
            clear1();
            PORTB=0b01111111;
            PORTD=0b11011011;
            clear1();
        break;
        case 0x81:// A  
            PORTB=0b10000000;
            PORTD=0b11000011;
            clear1();
            PORTB=0b01100000;
            PORTD=0b11011111;
            clear1();
            PORTB=0b00010001;
            PORTD=0b11000111;
            clear1();
            PORTB=0b00001110;
            PORTD=0b11011011;
            clear1();
        break;
        case 0x82:// A
            PORTB=0b10010001;
            PORTD=0b11000111;
            clear1();
            PORTB=0b01101110;
            PORTD=0b11011011;
        break;
        case 0x83:// A
            PORTB=0b10000000;
            PORTD=0b11000011;
            clear1();
            PORTB=0b01111111;
            PORTD=0b11011111;
            clear1();
        break;
        case 0x84:// A
            PORTB=0b10000000;
            PORTD=0b11110011;
            clear1();
            PORTB=0b01111100;
            PORTD=0b11101011;
            clear1();                                
            PORTB=0b00000010;
            PORTD=0b11000001;
            clear1();                                
            PORTB=0b00000001;
            PORTD=0b11011101;
            clear1();
        break;
        /*default:
            _delay_ms(1000);
            PORTB=0b10000001;
            PORTD=0b00000000;            
            clear1();
            PORTB=0b01000010;
            PORTD=0b10111101;            
            clear1();
            PORTB=0b00100100;
            PORTD=0b11011011;            
            clear1();
            PORTB=0b00011000;
            PORTD=0b11100111;
            clear1();
            PORTB=0b01111110;
            PORTD=0b01111110;
            clear1();
        break;*/
    }
}
//---------------------------------------------------------------------------
void main ()
{
    uint8_t j;
    uint8_t in;
    DDRB = 0xFF; // port b - output
    DDRC=0xFF;
    PORTB = 0x00;
    PORTA=0xFF; //pull up resistors ON
    DDRD = 0xFF; // port d - output
    while(1)
    {
        in=PINA;
        if(in==0b10111111)
        {
            for(j = 0; j < 42; ++j)
            {
                switch1(ASCII[j]);
                _delay_ms(500);
            }
        }
        else
        {    
            switch1(in);
        }    
    }
}




Побегал я в дебагере и ничего в общем то странного не обнаружил. Программа выполняет то, что в ней написано, все ветки switch-case выполняются, ничто никуда не прыгает. Так в чём проблема то?

Автор: СерегаГоляков 16.12.2010, 14:34
Добрый вечер, заметил, что перескакивает она в те строки, где указаны те же значения для портов, например из строки PORTD=0b0000000, можежет перескакнуть ТОЛЬКО в строку если в ней написано именно тоже, т.е. скакнет в строку PORTD=0b0000000 но уже из другого кейса  
Кстати и в анимации скачет тоже, но почему-то выводит на матрицу.
Если в ИСИС 7 пошагово выполнять отладку, и выводить только букву А(где PINA=0b10000000) без анимации всего алфавита, то она даже не начинает рисовать ту часть буквы, которую могла бы нарисовать перед перескоком.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)