Перейти к содержанию

bragol

Участник
  • Публикаций

    27
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о bragol

  • Звание
    Участник
  1. Цитата(редактор @ Dec 16 2015, 12:47) Размещение переменной? - в середине ИСПОЛЬЗУЕМОЙ области XDATA, в конце? (определяется по МАП файлу). Затирается Периодически или однократно? После определенной функции или случайным образом? Из прерывания или из фона? В общем телепатия началась. Вот расположение этой переменной: КодX:031AH         PUBLIC        pCompareFl она формируется из массива, который в дальнейшем объединяется в переменную типа флоат КодX:02D3H         PUBLIC        pCompare Код* * * * * * *  X D A T A   M E M O R Y  * * * * * * *             XDATA   0000H     027FH     UNIT         _XDATA_GROUP_             XDATA   027FH     00AFH     UNIT         ?XD?MAIN             XDATA   032EH     000BH     UNIT         ?XD?ALPHABETLCD нас интересует область MAIN
  2. Цитата(редактор @ Dec 14 2015, 13:17) Если компилятор Keil и модель памяти LAGE, то стек располагается в XDATA. это первый возможный вариант затирания данных. Если затирается конкретная переменная (еще и в середине массива) то вероятнее всего неверный указатель, который и портит эту ячейку. модель памяти именно LARGE Затирается конкретная переменная типа флоат, она не в массиве и указатели не используются в программе вообще
  3. Цитата(Kolia @ Dec 10 2015, 13:26) Скорее всего кокой-то буфер накладывается на данные (выходит за свои пределы). это понятно, но не понятно почему это происходит, когда я в память не лезу, компилятор все делает сам и главное, как это исправить? Цитата(Палыч @ Dec 11 2015, 10:27) Обратите внимание на значение регистра AUXR после сброса МК. В программе нужно поправить: КодAUXR = 0x10; // XDATA = 1792 не помогло. Еще есть такая закономерность, когда происходит "нахлест", то перезаписывается конкретная переменная типа флоат, которая по дефолту равно 1, причем записываются в нее те самые иероглифы, но как только я через меню переписываю ее значение, то программа начинает работать корректно [attachment=97461:IMG_2015...1_160326.jpg] [attachment=97462:IMG_2015...1_160439.jpg]
  4. Микроконтроллер AD89C51RD2, 64 КБ встроенной памяти, 1792 Б XRAM. Есть к нему прошивка в несколько тысяч строк, вот ее габариты: "Program Size: data=76.5 xdata=820 code=38246". Проблема возникает именно с областью памяти xdata. В программе есть переменные, которые я записываю в эту область памяти типа: float xdata ppk2K72 = 0.9843; float xdata ppk2K73 = 0.99698; float xdata ppk2K61 = 0.99596; float xdata ppk2K62 = 0.99849; Таких переменных больше 100 и их обязательно надо хранить в памяти. Так вот пока эти переменные были закоментированны и не забивали память, программа работала корректно, но как только пришло время их использовать, я перепрошил свое устройство, то появились явные глюки, связанные с переполнением памяти. Программа выводит на дисплей хаотичные символы из памяти, перезаписывает некоторые другие переменные неправильными значениями... Глюк пропадает, когда я освобождаю область памяти XDATA, который у меня настроен на максимальный объем памяти: void initialization() { EA = 1; // enable interrupts CKRL = 0xFF; //Clock Reload Register for calculating core frequency CKCON0 = 0x01; // X2 mode for all peripherals CKCON1 = 0x00; // X2 for SPI AUXR |= 0x10; // XDATA = 1792 IPH0 = 0x00; // низкий уровень прерываний для всей переферии IPL0 = 0x00; //********** UART Mode 1 (8 bit) with int_BRD PCON |= 0x80; // SMOD1 = 1 SCON = 0x50; // uart in mode 1 (8 bit), REN=1 BDRCON &= ~0xEC; // BRR=0; SRC=0; BDRCON |= 0x0E; // TBCK=1;RBCK=1; SPD=1 BRL = 0xB8; // 9600 Bds at 11.092MHz ES = 1; // Enable serial interrupt BDRCON |= 0x10; // Baud rate generator run TI = 0; RI = 0; }
  5. Работа с АЦП на МК ADuC814

    Что неужели ни у кого схожих проблем не было??? Многократно все перепроверил...
  6. Работа с АЦП на МК ADuC814

    выше я немного ошибся на терминал все-таки выводятся нули, а 0х0FFF только в кейловском симуляторе. И еще вряд ли это от МК, проверил на 2-ух разных результат один и тот же, но и на программу грешить не могу, потому что за основу брал исходники производителей
  7. Работа с АЦП на МК ADuC814

    Цитата(Палыч @ Nov 15 2011, 12:58) Так, какая у Вас проблема? Ничего не выдаётся на терминал? Или выдаются неверные результаты измерения АЦП? На терминал ничего не выводится, в симуляторе либо одни нули, чего судя по всему быть не может, либо 0х0FFF если программно подключаю Vref 2,5V. Такой результат и в первом и во втором варианте, по сути АЦП вообще ничего не делает, иначе на терминал выводилось бы 0х0FFF при подключенном опорном напряжении или нечто стремящееся к нулю, второй день уже бьюсь пробовал и в режиме разового преобразования и в режиме постоянного. Может быть что на МК АЦП не работает??? Я понимаю, что скорее всего где-то я ошибся и этот вариант можно рассматривать самым последним, но все равно мне просто интересно может ли на МК выйти из строя какой-то один блок, а не весь целиком. И еще такой немаловажный момент, я ради интереса скачал программу с сайта производителя на мой адук814 с разовым преобразованием и при ее запуске диод вместо того, чтоб мигать просто постоянно горит, да и вольтметром проверяли, он показывает постоянное напряжение, а должен скакать, получается, что у них тоже неправильная программа??? Что на мой взгляд маловероятно
  8. Работа с АЦП на МК ADuC814

    Пишу пробный вариант программы для работы с АЦП (1) Настройка последовательно порта для вывода результатов преобразования (2) Настройка регистров АЦП (3) Произвести преобразование (4) Вывести результат на UART На реальной микросхеме почему-то не работает пробовал и стандартные методы, за основу которых взяты примеры с сайтов производителей и через прерывания пробую, тоже не выдает данные на гипер терминал Вот через прерывание: Код#include <ADUC814.H> #include <stdio.h> sbit BLINK = P3^3; void pause (int i) {     while ( i > 0 )         --i; } void ADC_int () interrupt 6 {         printf("\n%02BX%02BX\n", ADCDATAH, ADCDATAL);         return;         /*         while (ADCCON3 & 0x80);         BLINK = ~BLINK;         if(ADCDATAL != 0 || ADCDATAH != 0)             printf("We Have Some DATA!");         pause(10000);*/ } void main (void) {     int CHAN = 0; //    unsigned char chan_2_convert; /*----------------------------------------------- Configure the serial port to run at 9600 Baud. -----------------------------------------------*/     PCON = 0x80;     PLLCON = 0x30;     SCON = 0x50;     TMOD |= 0x20;     TH1 = 0xF7;     TR1 = 1;     TI = 1; /*----------------------------------------------- Configure the A/D to sequentially convert each input channel. -----------------------------------------------*/     ADCCON1 = 0x80;     ADCCON2 = CHAN;     EA = 1;     EADC = 1;     while (1)     {             SCONV = 1;         BLINK = ~BLINK;         pause(10000);             } } Вот другим способом, тут пытался подать напряжение Vref, программно: Код#include <ADUC814.H> #include <stdio.h> void pause (int i) {     while ( i > 0 )         --i; } void main (void) {     unsigned char chan_2_convert; /*----------------------------------------------- Configure the serial port to run at 9600 Baud. -----------------------------------------------*/     PCON = 0x80;     PLLCON = 0x30;     SCON = 0x50;     TMOD |= 0x20;     TH1 = 0xF7;     TR1 = 1;     TI = 1; /*----------------------------------------------- Configure the A/D to sequentially convert each input channel. -----------------------------------------------*/ ADCCON1 = 0x80; ADCCON2 = 0x1C;     while (1)     {         unsigned int conv_val; /*----------------------------------------------- Start a conversion and wait for it to complete. -----------------------------------------------*/         chan_2_convert = 0;// (chan_2_convert + 1) % 6; //  ADCCON2 = (ADCCON2 & 0xF0) | chan_2_convert;         SCONV = 1;         while (ADCCON3 & 0x80);         pause(10000); /*----------------------------------------------- Read A/D data and print it out. ---------------------------------------------*/         conv_val = ADCDATAL | ((ADCDATAH & 0x0F) << 8);         printf ("ADC Channel %bu = 0x%4.4X\r\n", chan_2_convert, conv_val);     } } В чем может быть моя ошибка?
  9. MCS-51

    Цитата(Verifi @ Aug 29 2011, 11:27) И не найдёте,а по поводу вылетов поставьте галочку в свойствах совместимость с 2000 или 98винь-вы же программист под винду-или такой же как под 51 мк. Активно узал ADUCи 7лет назад,всё делал в кейле,там отладка кстати через родной драйвер adimon Нашел 7-ую версию, работает корректно и исправно, ниже ссылка, если вдруг кому-нибудь понадобится ftp://ftp.analog.com/pub/MicroConverter/ADuC8xx/WSD/ ЗЫ ЦитатаP.S. Насчет SDCC 51 не обольщайтесь. Он с небольшими проектами (small model) еще как-то справляется, а дальше пойдут проблемы. И какие же подводные камни меня ждут? О каких проблемах речь идет? Мне эта информация необходима для дальнейшего общения с начальством, так что буду благодарен за предоставленную информацию.
  10. MCS-51

    Цитата(paskal @ Aug 26 2011, 20:49) А что за дисплей? Какие ноги куда подключены? EdSim51 это симулятор 51 МК, я спрашивал про его возможность "воспринимать" hех файлы скомпилированные именно из Си кода, так как hех файлы, скомпилированные из ассемблерного кода он запускает корректно. http://www.edsim51.com/ --- Вот о чем речь идет
  11. MCS-51

    Кто-нибудь использовал EdSim51? Если писать на ассемблере, то он корректно воспринимает код и делает то, что я хочу, но когда пытаюсь в него загрузить нех файл созданный с помощью кейла или SDCC, то он собственно не пашет и странным образом зацикливает прогу, вот пример рабочего кода ассемблера и не рабочего Си, прога элементарная, в качестве примера на дисплее выводит1 -> 2 -> 3 в цикле: Цитатаmain: setb p3.3 setb p3.4 call one call two call three jmp main one: clr p1.1 clr p1.2 call clear ret two: clr p1.0 clr p1.1 clr p1.6 clr p1.4 clr p1.3 call clear ret three: clr p1.0 clr p1.1 clr p1.6 clr p1.2 clr p1.3 call clear ret clear: mov p1, #0FFH ret Цитата#include <ADUC812.H> void one(); void two(); void three(); void clear(); sbit P3_3 = P3^3; sbit P3_4 = P3^4; void main( void ) { P3_3 = 1; P3_4 = 1; while(1) { one(); two(); three(); } } void one() { /*__sbit P1_1 = 0; __sbit P1_2 = 0;*/ P1 = 0xF9; clear(); } void two() { /*__sbit P1_0 = 0; __sbit P1_1 = 0; __sbit P1_6 = 0; __sbit P1_4 = 0; __sbit P1_3 = 0;*/ P1 = 0xA4; clear(); } void three() { /*__sbit P1_0 = 0; __sbit P1_1 = 0; __sbit P1_6 = 0; __sbit P1_2 = 0; __sbit P1_3 = 0;*/ P1 = 0xB0; clear(); } void clear() { P1 = 0xFF; }
  12. MCS-51

    Цитата(zltigo @ Aug 22 2011, 15:12) Это-же не Вам был ответ , а Lmx2315. Ошиблись? Или я чего не понял? Я же выше сказал уже: проблемы с родным языком, если конечно он для него родной... человек не воспринимает чужие посты и просьбы не засорять тему, и вы тоже не воспринимаете, но вам "простительно" Модераторам огромная просьба почистить тему от всех постов, не касающихся специфики темы. Здесь вообще есть модераторы??? Я бы ЛС отправил, так быстрей бы все сделали
  13. MCS-51

    Цитата(sergeeff @ Aug 22 2011, 11:48) По делу это сесть перед монитором и отвечать на ваши вопросы типа "Это правильно написано или нет? Это будет работать или нет? Где взять этот файл? Где найти эти утилиту?". Извиняйте. Своих дел хватает. У меня начинает складываться такое мнение, что с изучением языков программирования, вы стали забывать свой родной язык... Если не хотите или не можете отвечать на поставленные вопросы, не отвечайте вообще, из-за ваших ответов не по теме теряется общий смысл Огромная просьба к модераторам, если Вас не затруднит, почистите пожалуйста тему. С Ув.
  14. MCS-51

    А есть у кого-нибудь программа Windows Serial Downloader более свежая? Моя версия 6.7 под ХР вылетает раз по 10 подряд пред тем как корректно запуститься? Смотрел на сайте Analog devices что-то не нашел... ЦитатаЯ не Ваш работодатель и способен видеть, что то, что Ваш опыт ограничивается copy-paste бессмертной программы "Hello World!". Не надо ЗДЕСЬ неуклюже пытаться вешать лапшу на уши написав на языке 'C' эквивалент русского "моя праграмиста на си много крестик однако". ... Проявление сарказма может подвигнет автора топика на переосмысление свое жизненного опыта. Хотя, судя по его ответам, прислушиваться к советам он не горазд. Значит должен сам протоптать свою жизненную дорожку. 2 scifi и sergeeff Я сразу сказал, что я только набираюсь опыту и на плюсах ничего серьезней реализации различных алгоритмов не писал. А вы продолжайте острить, если не можете сказать, что-нибудь по делу, интернет дает вам такую возможность...
  15. MCS-51

    Цитата(AHTOXA @ Aug 19 2011, 09:47) Неправильно. В функции blink() вы пытаетесь изменять параметр count, и надеетесь, что он изменится в вызывающей функци (main). А это не так, параметр здесь передаётся по значению. То есть, при каждом вызове функции blink() значение параметра count будет 28. Чтобы изменять значение параметра, надо передать указатель на него. Вы правы, спасибо за комментарий по делу Я кстати ошибся с МК, тут у меня используют 814... Цитата#include <stdio.h> #include <ADUC814.H> void blink( unsigned int * ); sbit BLINK = P1^0; //int cik = 0; void main() { unsigned int counter = 28; unsigned int *ptr = &counter; P1 = 0x0FE; TH0 = 0x0; TL0 = 0x0; TMOD |= 0x1; TR0 = 1; while( 1 ) { blink( ptr ); } } void blink( unsigned int *count ) { if (TF0 == 1) { TF0 = 0; --(*count); if (*count == 0) { *count = 28; BLINK = ~BLINK; } } }