roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 ноя 2024, 15:44

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 141 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10  След.
Автор Сообщение
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 30 сен 2009, 19:31 
Не в сети

Зарегистрирован: 27 авг 2008, 10:45
Сообщения: 1981
Откуда: Харьков
прог. языки: С/С++
Погуглил. lcd_putsf вроде бы требует как раз flash char *. Так что похоже, что CVAVR таки кладет строковые константы во флеш по умолчанию. Ну надо смотреть map-файл, куда память расходуется. Не верю я, что можно простым проектом сожрать просто так кило памяти. Или автор понаделал сильно много строковых переменных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 07:33 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2008, 21:15
Сообщения: 4130
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич
Цитата:
Так что похоже, что CVAVR таки кладет строковые константы во флеш по умолчанию

Это было бы неразумно

Код:
char str[20];

void func(char *s)
{
    /* ............ */
}

/* ............ */
func(str);
func("abcd");
/* ............ */


Если "abcd" в ПЗУ - как func() об этом узнает?

_________________
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 10:06 
Не в сети
Аватара пользователя

Зарегистрирован: 20 мар 2009, 12:45
Сообщения: 682
Откуда: Украина, Одесса
ФИО: Сергей
вот из библиотеки CVAVR
Код:
// write the string str located in FLASH to the LCD
void lcd_putsf(char flash *str)
{
char k;
while (k=*str++) lcd_putchar(k);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 11:12 
Не в сети

Зарегистрирован: 27 авг 2008, 10:45
Сообщения: 1981
Откуда: Харьков
прог. языки: С/С++
blindman писал(а):
Если "abcd" в ПЗУ - как func() об этом узнает?


Об этом узнает программист - его компилятор выругает за передачу flash char * в функцию, которая хочет char *
А чтобы положить строку в ОЗУ - по идее надо написать
Код:
char *varstr[]="abcd"


В gcc все наоборот - там просто строка кладется в ОЗУ (наследие процессоров с фон-неймановской архитектурой), а чтоб положить во флеш - надо писать кажется PSTR("abcd").


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 11:28 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2008, 21:15
Сообщения: 4130
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич
Цитата:
Об этом узнает программист - его компилятор выругает за передачу flash char * в функцию, которая хочет char *

Если программист удосужился выставить соответствующий уровень предупреждений :)
Цитата:
А чтобы положить строку в ОЗУ - по идее надо написать
Код:
char *varstr[]="abcd"


Ну уж за такое компилятор точно обматерит :)

_________________
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 12:18 
Не в сети

Зарегистрирован: 27 авг 2008, 10:45
Сообщения: 1981
Откуда: Харьков
прог. языки: С/С++
А - ну бегом писал, конечно char varstr[]="abcd" ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 13:12 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 09 фев 2006, 15:36
Сообщения: 3339
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков
Убегал от злого здоровика-компилятора с топором? :)

_________________
Linux user | Firefox user


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 17:54 
Не в сети

Зарегистрирован: 23 апр 2009, 14:12
Сообщения: 106
Откуда: Курская обл.
boez писал(а):
Погуглил. lcd_putsf вроде бы требует как раз flash char *. Так что похоже, что CVAVR таки кладет строковые константы во флеш по умолчанию. Ну надо смотреть map-файл, куда память расходуется. Не верю я, что можно простым проектом сожрать просто так кило памяти. Или автор понаделал сильно много строковых переменных.


да нет лишних строковых, все нужное :D
Код:
/*****************************************************
Chip type           : ATmega8
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/
#include <stdlib.h>
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#define ADC_VREF_TYPE 0x00

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
bit bylo_dlinnoe_nazatie=0;
char Displ_Print[16];
char rezhim=1; //     4-коэффициент форсунки   5- датчик скорости
float LitrNaSotny=0;float TotalFuel=0;float TotalPut=0;unsigned long int  StoGramm=0;unsigned long int  SpeedCounter=0;unsigned long int  i=0;char  Speed_For_light=0;
eeprom unsigned long int  eepromPrFors; // производительность форсунки (время в мкс, за которое наливается 0,01л)/1000
eeprom unsigned long int eepromImpuls_km;// количество импульсов с датчика скорости на 1км пути.
unsigned long int  PrFors=0; unsigned long int  Impuls_km=0;
//eeprom unsigned long int eepromTotalFuel;eeprom unsigned long int eepromTotalPut;eeprom unsigned long int eeprom_v_bake;
unsigned int  key_interval; float  v_bake;float  v_bake_plus;       
unsigned int  adc_data;
float  adc_data_display;
unsigned int  time=0;

// таймер времени
interrupt [TIM0_OVF] void timer0_ovf_isr(void){Speed_For_light=0;time++;if (time>10) {time=0;ADCSRA|=0xCB;};};
interrupt [EXT_INT0] void ext_int0_isr(void){SpeedCounter++;TotalPut=TotalPut+1;Speed_For_light++;}
// Прерывание по форсунке
interrupt [EXT_INT1] void ext_int1_isr(void)
{

    if ( PIND.3 ) 
        {
           // Закрытие форсунки, считаем время открытия
        MCUCR=0x0B;// разрешаем прерывание по спаду
        TCCR1B=0x00; // останавливаем таймер
        i=i+TCNT1; // имеем тики таймера, то есть мкс :) за 0.83 сек вливается 0,01л
        TCNT1=0;
       
        if (i>PrFors) {
          StoGramm++;i=0;LitrNaSotny=Impuls_km*100/SpeedCounter;                                             
          if (LitrNaSotny>10000) {LitrNaSotny=99990 ;};
          SpeedCounter=0;TotalFuel=TotalFuel+1;
          v_bake=v_bake-0.01;
          };


    }
    else   // Открытие форсунки
    {MCUCR=0x0F;      // разрешаем прерывание по нарастанию
     TCCR1B=0x02;// 1 кгц // запускаем таймер
    }  }
interrupt [ADC_INT] void adc_isr(void){ adc_data=ADCW; ADCSRA|=0x00;}





void main(void)
{
PORTB=0x00;DDRB=0x00;PORTC=0x7E;DDRC=0x00;PORTD=0x01;DDRD=0x01;TCCR0=0x05;TCNT0=0x00;TCCR1A=0x00;TCCR1B=0x03;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;ASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;GICR|=0xC0;MCUCR=0x0B;GIFR=0xC0;TIMSK=0x01;ACSR=0x80;SFIOR=0x00;#asm("sei")
lcd_init(16);delay_ms(100);delay_ms(5);TotalFuel=0;PrFors=eepromPrFors*1000;Impuls_km=eepromImpuls_km;PORTD=0x00;delay_ms(100);PORTD=0x01;delay_ms(100);PORTD=0x00;delay_ms(100);PORTD=0x01;delay_ms(100);PORTD=0x00;lcd_clear();PrFors=830000;Impuls_km=5000;ADMUX=ADC_VREF_TYPE;ADCSRA=0x8F;v_bake=0;
       
while (1) {
if (Speed_For_light>3) {PORTD=0x01;};adc_data_display=adc_data*100/18.65;

// индикация
if (rezhim==1) {ftoa(LitrNaSotny/100,1,Displ_Print);lcd_gotoxy(0,0);lcd_putsf("L/     ");lcd_gotoxy(3,0);lcd_puts(Displ_Print);ftoa(adc_data_display/100,1,Displ_Print);lcd_gotoxy(10,0);lcd_putsf("V      ");lcd_gotoxy(12,0);lcd_puts(Displ_Print);ftoa(TotalPut/Impuls_km,2,Displ_Print);lcd_gotoxy(0,1);lcd_putsf("Km      ");lcd_gotoxy(3,1);lcd_puts(Displ_Print);ftoa(v_bake,1,Displ_Print);lcd_gotoxy(10,1);lcd_putsf("L      ");lcd_gotoxy(12,1);lcd_puts(Displ_Print);};
if (rezhim==2) {lcd_gotoxy(0,0);lcd_putsf("    Zapravka    ");lcd_gotoxy(4,1);ftoa(v_bake_plus,2,Displ_Print);lcd_puts(Displ_Print);lcd_putsf("   ");};   
if (rezhim==3) {ftoa(TotalFuel/100,2,Displ_Print);lcd_gotoxy(0,0);lcd_putsf("L      ");lcd_gotoxy(2,0);lcd_puts(Displ_Print);ftoa(TotalPut/Impuls_km,2,Displ_Print);lcd_gotoxy(7,0);lcd_putsf(" Km");lcd_gotoxy(11,0);lcd_puts(Displ_Print);ftoa(((TotalFuel)/(TotalPut/Impuls_km)),1,Displ_Print);lcd_gotoxy(0,1);lcd_puts(Displ_Print);lcd_putsf(" L / 100 Km");};
if (rezhim==4) {lcd_gotoxy(4,0);lcd_putsf("Forsunka");itoa(PrFors/1000,Displ_Print);lcd_gotoxy(5,1);lcd_puts(Displ_Print);lcd_putsf("   ");};
if (rezhim==5) {lcd_gotoxy(4,0);lcd_putsf("Speed");lcd_putsf("   ");itoa(Impuls_km,Displ_Print);lcd_gotoxy(5,1);lcd_puts(Displ_Print);lcd_putsf("   ");};
//кнопки
if (rezhim==1) {if (PINC.1==0) {while (PINC.1==0) {key_interval++;delay_ms(100);if (key_interval>20) {key_interval=0;TotalFuel=0; TotalPut=0;lcd_clear();bylo_dlinnoe_nazatie=1; };};if (bylo_dlinnoe_nazatie==0){key_interval=0;rezhim=3;lcd_clear();};bylo_dlinnoe_nazatie=0;};};
if (rezhim==1) {if (PINC.3==0) {while (PINC.3==0) {key_interval++;delay_ms(100);if (key_interval>20){key_interval=0;rezhim=2;lcd_clear(); };};};};
if (rezhim==2) {if (PINC.1==0) {while (PINC.1==0) {key_interval++;delay_ms(100);if (key_interval>20){key_interval=0;rezhim=4;lcd_clear();bylo_dlinnoe_nazatie=1; };};if (bylo_dlinnoe_nazatie==0){key_interval=0;rezhim=1;v_bake=v_bake+v_bake_plus;v_bake_plus=0;lcd_clear();};bylo_dlinnoe_nazatie=0;};};
if (rezhim==2) {if ( PINC.3==0) {v_bake_plus=v_bake_plus+0.1;delay_ms(50);};if ( PINC.4==0){v_bake_plus=v_bake_plus-0.01;delay_ms(350);};};
if (rezhim==4) {if (PINC.1==0) {while (PINC.1==0) {key_interval++;delay_ms(100);if (key_interval>20){key_interval=0;rezhim=5;lcd_clear();bylo_dlinnoe_nazatie=1; };};if (bylo_dlinnoe_nazatie==0){key_interval=0;rezhim=1;lcd_clear();};bylo_dlinnoe_nazatie=0;};};
if (rezhim==4) {if ( PINC.3==0) {PrFors=PrFors+1000;eepromPrFors=PrFors/1000;delay_ms(100);};if ( PINC.4==0) {PrFors=PrFors-1000;eepromPrFors=PrFors/1000;delay_ms(100);};};
if (rezhim==5) {if (PINC.1==0) {while (PINC.1==0) {key_interval++;delay_ms(100);if (key_interval>20){key_interval=0;rezhim=6;lcd_clear();bylo_dlinnoe_nazatie=1; };};if (bylo_dlinnoe_nazatie==0){key_interval=0;rezhim=1;lcd_clear();};bylo_dlinnoe_nazatie=0;};};
if (rezhim==5) { if ( PINC.3==0) {Impuls_km++;eepromImpuls_km=Impuls_km;delay_ms(100);};if ( PINC.4==0) {Impuls_km--;eepromImpuls_km=Impuls_km;delay_ms(100);};};
if (rezhim==3) {if (PINC.1==0) {while (PINC.1==0) {key_interval++;delay_ms(100);if (key_interval>20) {key_interval=0;};};if (bylo_dlinnoe_nazatie==0){key_interval=0;rezhim=1;lcd_clear();};bylo_dlinnoe_nazatie=0;};};
delay_ms(100);
if (rezhim==6) {rezhim=1;};//..не знаю зачем пока ))
};  // конец цикла
}







       













Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 18:14 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 09 фев 2006, 15:36
Сообщения: 3339
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков
Я такой говнокод смотреть не буду. :no:

_________________
Linux user | Firefox user


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 18:24 
Не в сети
Аватара пользователя

Зарегистрирован: 20 мар 2009, 12:45
Сообщения: 682
Откуда: Украина, Одесса
ФИО: Сергей
:ROFL:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 18:37 
Не в сети

Зарегистрирован: 23 апр 2009, 14:12
Сообщения: 106
Откуда: Курская обл.
ну некоторое время назад сами так писАли ... :pardon:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 21:46 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Очень ненаглядно на одной строке писать несколько операторов - сложно читается

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 01 окт 2009, 23:57 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 09 фев 2006, 15:36
Сообщения: 3339
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков
Нет, в одну строку столько операторов никогда не писал :)
Рекомендую скормить этот сурс автоформаттеру и сравнить читабельность.

_________________
Linux user | Firefox user


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 02 окт 2009, 17:23 
Не в сети

Зарегистрирован: 23 апр 2009, 14:12
Сообщения: 106
Откуда: Курская обл.
Сделано было специально, куски кода, которые не вызывали проблем сгреб в одну строчку чтобы не прокручивать километры кода :pardon:
А вот автоформаттера в CVAVR не обнаружил, может плохо искал?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Автомобильный вольтметр
СообщениеДобавлено: 02 окт 2009, 17:28 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2008, 21:15
Сообщения: 4130
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич
http://gnuwin32.sourceforge.net/packages/indent.htm

_________________
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!



Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 141 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 21


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO