Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > AVR: обрезает строку


Автор: nerezus 30.11.2009, 14:37
Код


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mega8.h>
#include <delay.h>

#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

void main(void) {

    char *buff;
    char *message = "Preved medved!!!";
    int symbols = 16;

    PORTB=0x00;
    DDRB=0x00;


    buff = (char*) malloc((symbols  + 1) * sizeof(char));

    lcd_init(symbols);
    while (1) {
        strcpy(buff, "");
        strcat(buff, message);
        lcd_gotoxy(0, 0);
        lcd_puts(buff);
        delay_ms(200);
    }
}



Контроллер ATmega8, LCD LM020L.
Выводит только Prev. Как вывести полную фразу?

Автор: 17dufa 30.11.2009, 15:00
nerezus, 
1. документация на lcd_puts никаких дополнительных телодвижений не описывает (какой-нить флаг выставить, какую-нить доп функцию вызвать)?
2. под отладчиком гонять пробовали? что лежит в buff в момент вызова lcd_puts?

Автор: nerezus 30.11.2009, 15:04
Не умею отлаживать.

Опытным путем нашел проблему:

Код

char *buff;
buff = (char*) malloc((symbols  + 1) * sizeof(char));
 при замене на
Код

char buff[17];
 работает.

Но как юзать malloc?

Автор: UniBomb 30.11.2009, 15:09
nerezus, а зачем такая порнография при работе с мк?

Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mega8.h>
#include <delay.h>

#define __lcd_port PORTB

#include <lcd.h>

void main(void) 
 {
    PORTB=0x00;
    DDRB=0x00;

    buff[] = "Preved medved!!!";

    lcd_init(16);
    while (1) 
     {
        lcd_gotoxy(0, 0);
        lcd_puts(buff);
        delay_ms(200);
     }
 }

Автор: xvr 30.11.2009, 15:12
Есть предположение, что размер кучи для malloc надо где то выставлять

Автор: UniBomb 30.11.2009, 15:13
В CodeVision (как я понял ТС её использует) с маллоком были проблемы - эта функция не возвращала указател на выделенную память. Пофиксили или нет - не знаю..

Автор: nerezus 30.11.2009, 15:25
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mega8.h>
#include <delay.h>

#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

void main(void) {

    char buff[17];
    int i;
    int c = 0;
    char *source = "                Preved medved                ";

    lcd_init(16);
    while (1) {
        for(i = 0; i < 16; i++) {
            buff[i] = source[i + c];
        }
        buff[16] = 0;
        lcd_gotoxy(0, 0);
        lcd_puts(buff);
        c++;
        if (c > strlen(source) - 16) {
            c = 0;
        }
        delay_ms(200);
    }
}




Так работает(бегущая строка), но код ужасен из-за констант ((

Добавлено через 1 минуту
Цитата

В CodeVision (как я понял ТС её использует) с маллоком были проблемы - эта функция не возвращала указател на выделенную память. Пофиксили или нет - не знаю..
 2.04 версия.
Не, когда основная функция не работает - это совсем загадка анатомии разработчиков =\ Разочарован.

Автор: Severyanin 30.11.2009, 15:39
nerezus,  я бы вообще не советовал юзать динамическое выделение памяти на мк, слишком большие затраты процессорного времени. Тем более для дисплея, юзай статику где только возможно

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