Обновяване на 8051 микроконтролер:

void main(void)
{
 unsigned char in_char;
   int flag=1,j,i;
   int count, d = 0 ; 
   char s[4]="",p;
   ithul();
   LCD_res();
   init_lcd()
   ;print_lcd(1,"The Project");//Printing command.
   ;print_lcd(2,"of Me:");//Printing command.
   for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}
   for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}

while(1)
  {
 count = 0;
    loop1 : if(P3_0 == 1){
      goto loop1;
      }
//Running '1' 
    loop2 : if(P3_0 == 0){
      goto loop2;
      }
//Running '0'
    while(P3_0 == 1){
      count ++;
       }
  init_lcd()
   ;print_lcd(1,"Done Counting!");//Printing command.
   for(i=0; i<1; i++){delay(1000);delay(1000);delay(1000);}

   ;print_lcd(2,"    - L/H...");//Printing command.
   for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}
   for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}
    for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}

   ;print_lcd(2,itoa(count/200));//Printing command.
   for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}
    for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}
   }
}

Това е моят код. Това, което прави, е да получава честота от порта, да я чете и да я отпечатва на LCD.

РАБОТИ! Но след около 2 минути LCD става като "asda68!#123646$#$^%&*(dfas" вид боклуци!).

Как мога да обновя микроконтролера 8051, за да не полудее? Чух нещо за "пресни" "безплатни" "flash" команди, мисля, но наистина не знам какво е или как да използвам това. ТАКА.. Моля, помогнете!


person Shay Shtern    schedule 13.01.2015    source източник
comment
Защо имате точка и запетая в началото на всеки печатен ред? free(count) не прави нищо, освен евентуално разрушаване на памет, тъй като count не е указател.   -  person Dan    schedule 13.01.2015
comment
Вие сте декларирали int count;, така че какво се очаква да направи free(count);?   -  person Weather Vane    schedule 13.01.2015
comment
опс, съжалявам, че го изтрих.   -  person Shay Shtern    schedule 13.01.2015
comment
Във всеки случай трябва да използвате регистър на таймера (за предпочитане с улавяне, задействано от края), за да измервате честотата, а не софтуерна верига.   -  person Weather Vane    schedule 13.01.2015
comment
Не трябва ли itoa() да приема низов параметър?   -  person Weather Vane    schedule 13.01.2015
comment
този itoa() получава число/int и го превръща в arr на char.   -  person Shay Shtern    schedule 13.01.2015
comment
например 324 int се превръща в {3, 2 ,4}   -  person Shay Shtern    schedule 13.01.2015
comment
Какво ви казва вашият езиков наръчник за itoa()? В следващата справка за компилатор 8051 е char *itoa(int number, char* string, int radix);. Така че ще предавате въображаем указател на низ и рано или късно ще получите грешка. Какви предупреждения на компилатора получавате? crossware.com/smanuals/c8051/_itoa.html   -  person Weather Vane    schedule 13.01.2015
comment
как мога да ви изпратя пълната функция? Разбрах, че работи. това е променено от мен   -  person Shay Shtern    schedule 13.01.2015


Отговори (1)


Вашата функция:

char * itoa( int x ) { 
    const unsigned int BASE = 10; 
    unsigned int u = abs( x ); 
    size_t n = 0; 
    unsigned int tmp = u; 
    char *s; 
    do { ++n; } 
    while ( tmp /= BASE ); 
    n += x < 0; 
    s = malloc( ( n + 1 ) * sizeof( char ) ); 
    s[n] = 0; 
    do { s[--n] = u % BASE + '0'; } 
    while ( u /= BASE ); 
    if ( x < 0 ) s[--n] = '-'; 
    return s;
} 

Всеки път, когато извикате itoa(), той заделя повече памет за низа s и след известно време паметта му свършва но никога не проверява върнатата стойност от malloc(). Трябва да поставите free() обратно в програмата.

char *strg;
...
strg = itoa (count / 200);
print_lcd(2,strg);
free(strg);

Така че целият код ще изглежда така, вижте къде е коментирано.

void main(void) {
    char *strg;                 // new variable
    unsigned char in_char;
    int flag=1,j,i;
    int count, d = 0 ; 
    char s[4]="",p;
    ithul();
    LCD_res();
    init_lcd();
    print_lcd(1,"The Project");//Printing command.
    print_lcd(2,"of Me:");//Printing command.
    for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}
    for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}

    while(1) {
        count = 0;
        loop1 : if(P3_0 == 1){
            goto loop1;
        }
        //Running '1' 
        loop2 : if(P3_0 == 0){
            goto loop2;
        }
        //Running '0'
        while(P3_0 == 1){
            count ++;
        }
        init_lcd();
        print_lcd(1,"Done Counting!");//Printing command.
        for(i=0; i<1; i++){delay(1000);delay(1000);delay(1000);}

        print_lcd(2,"    - L/H...");//Printing command.
        for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}
        for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}
        for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}

        strg = itoa (count / 200);  // keep the returned pointer
        print_lcd(2,strg);          // display the "frequency"
        free(strg);                 // free the pointer memory
        for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}
        for(i=0; i<20; i++){delay(1000);delay(1000);delay(1000);}
    }
}
person Weather Vane    schedule 13.01.2015
comment
Получавам грешка: non pointer type cast към общ указател от тип 'int' - person Shay Shtern; 13.01.2015
comment
Може ли малко по-конкретно? - person Weather Vane; 13.01.2015
comment
Съжалявам. Нов съм тук и все още не разбирам всички функции на сайта!| BTW Страхотни хора тук! така че.. Защо получава тази грешка? - person Shay Shtern; 13.01.2015
comment
Кой ред дава грешката? Това става нагоре ;-) Моля, опишете го черно на бяло. - person Weather Vane; 13.01.2015
comment
изчакайте малко .. хехе... къде трябва да добавя командата за ред 'free'? - person Shay Shtern; 13.01.2015
comment
@ShayShtern вижте коригирания отговор. - person Weather Vane; 13.01.2015
comment
Така че трябва да напиша командата free... след отпечатването? не е във функцията 'itoa'? Просто искам да се уверя в това. - person Shay Shtern; 13.01.2015
comment
Защо ще го освободите, преди да сте го използвали? Вижте моя отговор. Ако работи, моля, приемете отговора, гласувайте за него и т.н., за да възнаградите времето ми. Благодаря! - person Weather Vane; 13.01.2015
comment
opssi, разбирам те погрешно... Моя грешка.. Опитвам отново.. повторение след няколко минути.. МНОГО БЛАГОДАРЯ ВСЕ ПАК ОЦЕНЯВАМ, така че.. Все още получавам нежелан LCD... C кодът преминава компилация. - person Shay Shtern; 13.01.2015