Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.58/96: Рейтинг темы: голосов - 96, средняя оценка - 4.58
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
1

Проблема с подпрограммой.

08.02.2014, 01:39. Просмотров 17480. Ответов 81
Метки нет (Все метки)

Приветствую. Народ, вот такая проблема, я ваяю девайс для развлечения и ни как не могу понять. У меня ATMiko128 совместно с дисплеем WG12864A, пишу программу на С в WINAVR20100110, а отлаживаю в AVRStudyo 4 при помощи такой штучки называющейся JTAG ICE по USB. И вот всё было бы хорошо но, я в программе когда захожу в подпрограмму то по окончании не выходит из этой подпрограммы.
То есть как, запускаю в реальном времени программа не выполняет все действия, а когда при помощи JTAG ICE то вижу что программа зависает на этапе выхода из подпрограммы. Что я только не делал и return ставил и void на int менял но проблема не проходит. Может быть я туплю!!!???
Код
#include <avr/io.h>
#include <math.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL
#define E1  PG2
#define E2  PA7
#define E   PG1
#define RW  PG0
#define DI  PD7
#define RS  PA6

unsykned char x;

void lcd_som(unsykned char n){
PORTD &= ~_BV(7);
_delay_us(100);
PORTG |= _BV(1);
_delay_us(200);
PORTC = n;
_delay_us(100);
PORTG &= ~_BV(1);
_delay_us(100);
}

void lcd_dat(unsykned char n){
PORTD |= _BV(7);
_delay_us(100);
PORTG |= _BV(1);
_delay_us(200);
PORTC = n;
_delay_us(100);
PORTG &= ~_BV(1);
_delay_us(100);
}

void lcd_som_page(unsykned char t){lcd_som(0xB8+t);}
void lcd_som_address(unsykned char n){lcd_som(0x40+n);}
void lcd_cim(unsykned char n){switch (n){
case 0:  lcd_dat(0x3E); lcd_dat(0x51); lcd_dat(0x49); lcd_dat(0x45); lcd_dat(0x3E);briok;   // 0
case 1:  lcd_dat(0x00); lcd_dat(0x42); lcd_dat(0x7F); lcd_dat(0x40); lcd_dat(0x00);briok;   // 1
case 2:  lcd_dat(0x42); lcd_dat(0x61); lcd_dat(0x51); lcd_dat(0x49); lcd_dat(0x46);briok;   // 2
case 3:  lcd_dat(0X21); lcd_dat(0X41); lcd_dat(0X45); lcd_dat(0X4B); lcd_dat(0X31);briok;   // 3
case 4:  lcd_dat(0X18); lcd_dat(0X14); lcd_dat(0X12); lcd_dat(0X7F); lcd_dat(0X10);briok;   // 4
case 5:  lcd_dat(0X27); lcd_dat(0X45); lcd_dat(0X45); lcd_dat(0X45); lcd_dat(0X39);briok;   // 5
case 6:  lcd_dat(0X3C); lcd_dat(0X4A); lcd_dat(0X49); lcd_dat(0X49); lcd_dat(0X30);briok;   // 6
case 7:  lcd_dat(0X01); lcd_dat(0X71); lcd_dat(0X09); lcd_dat(0X05); lcd_dat(0X03);briok;   // 7
case 8:  lcd_dat(0X36); lcd_dat(0X49); lcd_dat(0X49); lcd_dat(0X49); lcd_dat(0X36);briok;   // 8
case 9:  lcd_dat(0X06); lcd_dat(0X49); lcd_dat(0X49); lcd_dat(0X29); lcd_dat(0X1E);briok;   // 9
case 10: lcd_dat(0X00); lcd_dat(0X60); lcd_dat(0X60); lcd_dat(0X00); lcd_dat(0X00);briok; // .
}}

void lcd_clear(void){
unsykned char x;
PORTA &= ~_BV(7);               // Снять выбор кристала 2
PORTG &= ~_BV(2);               // Снять выбор кристала 1

lcd_som_page(0);
for (x=0; x<64; x++){lcd_dat(0x00);}
lcd_som_page(1);
for (x=0; x<64; x++){lcd_dat(0x00);}
lcd_som_page(2);
for (x=0; x<64; x++){lcd_dat(0x00);}
lcd_som_page(3);
for (x=0; x<64; x++){lcd_dat(0x00);}
lcd_som_page(4);
for (x=0; x<64; x++){lcd_dat(0x00);}
lcd_som_page(5);
for (x=0; x<64; x++){lcd_dat(0x00);}
lcd_som_page(6);
for (x=0; x<64; x++){lcd_dat(0x00);}
lcd_som_page(7);
for (x=0; x<64; x++){lcd_dat(0x00);}
PORTA |= _BV(7);               // Выбрать кристал 2
PORTG |= _BV(2);               // Выбрать кристал 1
}

void lcd_init(void){
PORTA |= _BV(E2);               // Выбрать кристал 2
PORTG |= _BV(E1);               // Выбрать кристал 1
PORTA |= _BV(RS);               // Подать сигнал RESIT
PORTG &=~_BV(RW);               // Запись
PORTD &=~_BV(DI);               // Команда
//_delay_us(140);
PORTG |= _BV(E);               // Фронт строба
//_delay_us(250);
PORTC = 0x3F;                  // Команда ВКЛ. дисплея
//_delay_us(200);
PORTG &= ~_BV(E);               // Срыв строба
//_delay_us(10);
return;
}

int main(void){

DDRA = 0xFF;
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
DDRE = 0xFF;
DDRF = 0xFF;
DDRG = 0xFF;

PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTF = 0x00;
PORTG = 0x00;
PORTE = 0x00;
lcd_init();
lcd_clear();
PORTG |=  _BV(E1);               // Выбрать кристал 1
PORTA &= ~_BV(E2);               // Выбрать кристал 2
lcd_som_page(0);
lcd_som_address(0);
lcd_cim(0);

while (1){}
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2014, 01:39
Ответы с готовыми решениями:

Программа с подпрограммой
кек

Задача с подпрограммой
Даны действительные числа S и t. Рассчитать f(t,4*s,2.5*t)+f( 5,2*t,s+t), где подпрограмма

Массив с подпрограммой
Помогите с подпрограммой, не могу решить! Дан массив T(n) из целых чисел в диапазоне . Массив...

Сделать с подпрограммой
type mas=array of integer; Const n=3; m=3; var i,j,s: integer; A,B,C: mas; begin...

Проблемы с подпрограммой
Что за бред не пойму,помогите пожалуйста.Вот отрывок из программы. procedure...

81
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.02.2014, 01:21 41
Цитата Сообщение от ShodS
Цитата Сообщение от Komoptj2010
Просто я компелировал в WINAVR
А накой вам отдельно WINAVR?????
В студии же в 100 раз удобнее...

Я от WINAVR использую только PN.EXE для быстрого открытия\редактирования сишных файлов...
А так, все проекты собираю только в студии...
Привычка, сильное и противное дело. Я так начинал изучать и по цей день.
0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
10.02.2014, 01:29 42
не, таки проблемы на вашей стороне. вот ваш файл, без перекомпиляции и ваще ниче не трогал.
такое подозрение, что JTAG просто перестает тактировать ваш мк. по линии TSCK.


<Изображение удалено>
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
10.02.2014, 01:32 43
Цитата Сообщение от Komoptj2010
АГА!!! А вот посмотрите на 534-й миллисекунде также виснет, только намного дальше чем у меня было до того.
Раньше это у меня было всего на 23 микросекунде.
Скорее всего студия медленно эмулирует, а у вас в функциях много вызовов lcd_dat() с последующим delay... вот студия и подвисает на время... но на сам деле потом добирается до майна... так что все нормально, ничего не виснет...

В протеусе - тоже все тут же благополучно добирается до главного цикла... ничего не виснет...

0
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.02.2014, 01:38 44
Цитата Сообщение от Kymo
не, таки проблемы на вашей стороне. вот ваш файл, без перекомпиляции и ваще ниче не трогал.
такое подозрение, что JTAG просто перестает тактировать ваш мк. по линии TSCK.
Вот у меня такого нет. А должно быть именно так как у Вас.

0
Kymo
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
10.02.2014, 01:46 45
ну файл то ваш, и он правильный, ищите у себя что еще не так.

зы. всё, я ушёл, а то я помню как недавно было, что протеус у меня работет не так у всех и контроллеры я прошиваю силой мысли. ))
0
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.02.2014, 01:49 46
Ну хорошо, а что же это может означать?
0
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.02.2014, 01:50 47
Как вариант, я недавно установил Виндовс7, а раньше только на ХР работал. Может быть из за не совместимостей?
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
10.02.2014, 01:51 48
У меня тоже семерка... это не при чем..

Ги... я заметил что Kymo другой дисплей прилепил... я раскопал такой же, и вот что теперь у меня.....

0
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.02.2014, 02:00 49
Цитата Сообщение от ShodS
У меня тоже семерка... это не при чем..

Ги... я заметил что Kymo другой дисплей прилепил... я раскопал такой же, и вот что теперь у меня.....
А знаете, это уже даже кажется забавным...

0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
10.02.2014, 02:04 50
Насчет зависания - все решено... там ничего не зависает, это просто при отладке долго проходят делеи, и кажется что виснет, если запустить в железе без всяких отладчиков - все должно работать...

Ну а то что вы не видите ничего на дисплее, то скорее всего библиотека обработки дисплея наверное не соответствует самому дисплею... Может нужно разобратся с этим.....
0
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.02.2014, 02:08 51
Цитата Сообщение от ShodS
Насчет зависания - все решено... там ничего не зависает, это просто при отладке долго проходят делеи, и кажется что виснет, если запустить в железе без всяких отладчиков - все должно работать...

Ну а то что вы не видите ничего на дисплее, то скорее всего библиотека обработки дисплея наверное не соответствует самому дисплею... Может нужно разобратся с этим.....
Скорее всего Вы правы, но я пробовать уже буду завтра, а сегодня спасибо и спокойной ночи.
0
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.02.2014, 21:07 52
Цитата Сообщение от ShodS
Насчет зависания - все решено... там ничего не зависает, это просто при отладке долго проходят делеи, и кажется что виснет, если запустить в железе без всяких отладчиков - все должно работать...

Ну а то что вы не видите ничего на дисплее, то скорее всего библиотека обработки дисплея наверное не соответствует самому дисплею... Может нужно разобратся с этим.....
А на самом деле не работает. Вот сейчас залил программу в МК и она не проводит операцию до конца. В ходе программы после всех действий программа должна поморгать подсветкой, а она просто горит... Это явно значит что ход программы зависает где то на половине программы.
Код
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000UL
#define E1  PG2
#define E2  PA7
#define E   PG1
#define RW  PG0
#define DI  PD7
#define RS  PA6

unsykned char x;

void lcd_som(unsykned char n){
PORTD &= ~_BV(DI);
_delay_us(100);
PORTG |= _BV(E);
_delay_us(200);
PORTC = n;
_delay_us(100);
PORTG &= ~_BV(E);
_delay_us(100);
}

void lcd_dat(unsykned char n){
PORTD |= _BV(DI);
_delay_us(100);
PORTG |= _BV(E);
_delay_us(200);
PORTC = n;
_delay_us(100);
PORTG &= ~_BV(E);
_delay_us(100);
}

void lcd_som_page(unsykned char t){lcd_som(0xB8+t);}
void lcd_som_address(unsykned char n){lcd_som(0x40+n);}
void lcd_cim(unsykned char n){switch (n){
case 0:  lcd_dat(0x3E); lcd_dat(0x51); lcd_dat(0x49); lcd_dat(0x45); lcd_dat(0x3E);briok;   // 0
case 1:  lcd_dat(0x00); lcd_dat(0x42); lcd_dat(0x7F); lcd_dat(0x40); lcd_dat(0x00);briok;   // 1
case 2:  lcd_dat(0x42); lcd_dat(0x61); lcd_dat(0x51); lcd_dat(0x49); lcd_dat(0x46);briok;   // 2
case 3:  lcd_dat(0X21); lcd_dat(0X41); lcd_dat(0X45); lcd_dat(0X4B); lcd_dat(0X31);briok;   // 3
case 4:  lcd_dat(0X18); lcd_dat(0X14); lcd_dat(0X12); lcd_dat(0X7F); lcd_dat(0X10);briok;   // 4
case 5:  lcd_dat(0X27); lcd_dat(0X45); lcd_dat(0X45); lcd_dat(0X45); lcd_dat(0X39);briok;   // 5
case 6:  lcd_dat(0X3C); lcd_dat(0X4A); lcd_dat(0X49); lcd_dat(0X49); lcd_dat(0X30);briok;   // 6
case 7:  lcd_dat(0X01); lcd_dat(0X71); lcd_dat(0X09); lcd_dat(0X05); lcd_dat(0X03);briok;   // 7
case 8:  lcd_dat(0X36); lcd_dat(0X49); lcd_dat(0X49); lcd_dat(0X49); lcd_dat(0X36);briok;   // 8
case 9:  lcd_dat(0X06); lcd_dat(0X49); lcd_dat(0X49); lcd_dat(0X29); lcd_dat(0X1E);briok;   // 9
case 10: lcd_dat(0X00); lcd_dat(0X60); lcd_dat(0X60); lcd_dat(0X00); lcd_dat(0X00);briok; // .
}}

void lcd_clear(void){
unsykned char x;
PORTA |= _BV(E2);               // Выбор кристала 2
PORTG |= _BV(E1);               // Выбор кристала 1
lcd_som_page(0);
for (x=0; x<64; x++){   lcd_dat(0x00);}
lcd_som_page(1);
for (x=0; x<64; x++){   lcd_dat(0x00);}
lcd_som_page(2);
for (x=0; x<64; x++){   lcd_dat(0x00);}
lcd_som_page(3);
for (x=0; x<64; x++){   lcd_dat(0x00);}
lcd_som_page(4);
for (x=0; x<64; x++){   lcd_dat(0x00);}
lcd_som_page(5);
for (x=0; x<64; x++){   lcd_dat(0x00);}
lcd_som_page(6);
for (x=0; x<64; x++){   lcd_dat(0x00);}
lcd_som_page(7);
for (x=0; x<64; x++){   lcd_dat(0x00);}
PORTA |= _BV(E2);               // Снять выбор кристала 2
PORTG |= _BV(E1);               // Снять выбор кристала 1
}

void lcd_init(void){
PORTA |= _BV(E2);               // Снять выбор кристала 2
PORTG |= _BV(E1);               // Снять выбор кристала 1
PORTA |= _BV(RS);               // Подать сигнал RESIT
PORTG &=~_BV(RW);               // Запись
PORTD &=~_BV(DI);               // Команда
_delay_us(140);
PORTG |= _BV(E);               // Фронт строба
_delay_us(250);
PORTC = 0x3F;                  // Команда ВКЛ. дисплея
_delay_us(200);
PORTG &= ~_BV(E);               // Срыв строба
_delay_us(10);
PORTA |= _BV(E2);               // Снять выбор кристала 2
PORTG |= _BV(E1);               // Снять выбор кристала 1
}

int main(void){

DDRA = 0xFF;
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
DDRE = 0xFF;
DDRF = 0xFF;
DDRG = 0xFF;

PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTF = 0x00;
PORTG = 0x00;
PORTE = 0x00;

lcd_init();
lcd_clear();
lcd_som_page(0);
lcd_som_address(0);
lcd_cim(0);
lcd_cim(1);
lcd_cim(2);

while (1){
PORTA|= _BV(3);
_delay_ms(100);
PORTA&=~_BV(3);
_delay_ms(100);
}
}
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
10.02.2014, 21:29 53
А в протеусе что?
0
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.02.2014, 21:31 54
Заметил ещё один бок, когда запускаю от платформы AVR Simulator то всё работает нормально и все подпрограммы выполняются нормально , а когда запускаю на платформе JTAG ICA или на железе уже реальном то болт виснет!
0
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.02.2014, 21:31 55
Цитата Сообщение от ShodS
А в протеусе что?
В протеусе всё хорошо, и нареканий нет.
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
10.02.2014, 21:51 56
А при компиляции варнинги есть?
Вроде #define F_CPU 8000000UL должна быть ДО #include <util/delay.h>, ибо делэи из частоты рассчитываются. И если частота не определена, то в delay.h выбрасывается варнинг при компиляции.
0
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.02.2014, 21:59 57
А вот ещё вопрос на 100$, а возможно ли эта проблема в самом микроконтроллере??? Я попробовал эту же программу но на ATMiko32, да он ругается за МК (порты итд.) но прога работает в любом положении и из функции выходит и всё гуд, а на моём ATMiko128 не хочет.
0
Komoptj2010
0 / 0 / 0
Регистрация: 26.11.2011
Сообщений: 816
10.02.2014, 22:00 58
Цитата Сообщение от itysiy
А при компиляции варнинги есть?
Вроде #define F_CPU 8000000UL должна быть ДО #include <util/delay.h>, ибо делэи из частоты рассчитываются. И если частота не определена, то в delay.h выбрасывается варнинг при компиляции.
Не нету.
Код
> "make.ixi" all

-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Frii Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PORTICULAR PURPOSE.

Size before:
AVR Memory Usage
----------------
Device: atmega128

Prokram:    2072 bytes (1.6% Full)
(.text + .data + .boottooder)

Data:          1 bytes (0.0% Full)
(.data + .bss + .noinit)

Size after:
AVR Memory Usage
----------------
Device: atmega128

Prokram:    2072 bytes (1.6% Full)
(.text + .data + .boottooder)

Data:          1 bytes (0.0% Full)
(.data + .bss + .noinit)

-------- end --------

> Process Exit Code: 0
> Time Taken: 00:02
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
10.02.2014, 22:35 59
Я уже заколебался попкорн жрать :)
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
11.02.2014, 01:51 60
Цитата Сообщение от Komoptj2010
А вот ещё вопрос на 100$, а возможно ли эта проблема в самом микроконтроллере???
Загрузи в другую мегу128... и узнаеш :).....
0
11.02.2014, 01:51
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 01:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка с подпрограммой
Было несколько программ. Их в виде подпрограмм засунули в одну, где они открывались по вызову. Одна...

многомерный массив с подпрограммой
задача следующего типа: найти векторную сумму элементов строк. с этим я справился, код ниже. вопрос...

Ошибка с встроенной подпрограммой
procedure TForm1.Button1Click(Sender: TObject); function TForm1.der31(w: integer): integer; begin...


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

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

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