Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн дек 12, 2016 00:05:53
господа, у кого нибудь есть библиотека ssd1305 под CVAVR?
нужено ну просто не передать как, а гугл не ищет.
нужено ну просто не передать как, а гугл не ищет.
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Прочитал, при чем еще вчера, вот только ни фига не понял.Z_h_e писал(а):Тут почитайте и еще много где наверное написано.
у вас на самом деле ЭТО компилируется в CVAVR?mar1lynmanson писал(а):Сделал как по ссылке при помощи #include <pgmspace.h>, объявления массива с данными с пометкой PROGMEM и доступом к данным через pgm_read_byte(&())
это вообще ни о чем, так о проблемах не рассказывают, если хотят их решитьmar1lynmanson писал(а):вежливый посыл на ЙУХ и кучу ошибок
Уже нет. Смешно, но факт. На #include <pgmspace.h> - компилятор реагирует нормально, на pgm_read_byte(&()), а вот при попытке использовать PROGMEM указывает что не хватает знака ";"ARV писал(а):у вас на самом деле ЭТО компилируется в CVAVR?mar1lynmanson писал(а):Сделал как по ссылке при помощи #include <pgmspace.h>, объявления массива с данными с пометкой PROGMEM и доступом к данным через pgm_read_byte(&())![]()
Спасибо, но это я уже посмотрю завтра. Да и походу нужно сваливать с CVAVR потому как примеров на нем крайне мало в сети. А также он у меня пиратский потому может и глюкотню всякую выдает, потому как у меня не укладывается в уме как кусок кода может нормально работать в main функции и сыпать ошибками при попытке скопировать его в вспомогательную функцию.uk8amk писал(а):CVAVR позволяет использовать указатели на область флеш. С ними код выходит более читабельный чем через pgmspace.
Искать во встроенной справке на тему Flash Pointers.
Очень странно. Мне казалось, что cvavr вообще не должен переваривать pgmspace.h, в том числе PROGMEM. Или вы умудрились в среду вместо родного компилятора gcc прикрутить?!Уже нет. Смешно, но факт. На #include <pgmspace.h> - компилятор реагирует нормально, на pgm_read_byte(&()), а вот при попытке использовать PROGMEM указывает что не хватает знака ";"
одно из объяснений подобного поведения, может быть очень простым: автосохранение исходника при компиляции не включеноCOKPOWEHEU писал(а):Очень странно
Код: Выделить всё
/*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Project : at13 termo
Chip type : ATtiny13A
AVR Core Clock frequency: 9,600000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*******************************************************/
#include <tiny13a.h>
#include <delay.h>
#include <1wire.h>
#include <ds1820.h>
int temp=0;
int d1, d2, d3, d4;
void spi(unsigned char data_h,unsigned char data_l) {
unsigned char f;
PORTB.0=0; // SCK = 0
delay_us(150);
PORTB.3=0; // CS = 0
for(f = 0; f<8; f++) {
if ((data_h&(0b10000000)) == 0b10000000) {
PORTB.4=1; // MOSI = 1
}
else { PORTB.4=0; // MOSI = 0
};
delay_us(150);
PORTB.0=1; // SCK = 1
data_h = (data_h << 1);
delay_us(150);
PORTB.0=0; // SCK = 0
}
delay_us(150);
for(f = 0; f<8; f++) {
if ((data_l&(0b10000000)) == 0b10000000) {
PORTB.4=1; // MOSI = 1
}
else { PORTB.4=0; // MOSI = 0
};
delay_us(150);
PORTB.0=1; // SCK = 1
data_l = (data_l << 1);
delay_us(150);
PORTB.0=0; // SCK = 0
}
delay_us(150);
PORTB.3=1; // CS = 1
}
void tem(void)
{
temp=ds1820_temperature_10(0); // Чтение температуры
if (temp>=0) {
if (temp>1000) {
temp=4096-temp;
d1=10; //минус
}
else {
d1=12; //пусто
};
};
if (temp<0) {
temp=-1*temp;
d1=10; //минус
};
d2=temp/10;
d3=temp%10;
}
void main(void)
{
//CS 3 // Выбор ведомого
//MOSI 4 // Передатчик ведущего, приемник ведомого
//SCK 0 // Тактовый сигнал
//led 1
//ds18b20 2
// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=Out Bit3=Out Bit2=In Bit1=In Bit0=Out
DDRB=(0<<DDB5) | (1<<DDB4) | (1<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0);
w1_init();
spi(9,0b00001111); //дешифраторы включены первые 6 мест
spi(10,15); //яркость //максимальная
spi(11,6); //разряды 6 символов
spi(15,0); //Тест дисплея выключен
spi(12,1); //Выйти из сна
while (1)
{
tem();
spi(1,d1); // зажечь цифру
spi(2,d2); // зажечь цифру
spi(3,(128+d3)); // зажечь цифру
spi(4,0); // зажечь цифру
spi(5,99); // зажечь цифру
spi(6,13); // зажечь цифру
}
}
Код: Выделить всё
//При первом запуске идет плавное увеличение сигнала пота PB0 от 0 до 50% заполнения.
while(OCR0A<0x7f)
{
OCR0A=OCR0A+0x01;
delay_ms(10); //время увеличения шим
}
//Выполняем условие опроса входа, если на порту 3 лог 1 то заполнение 50%, в противном случае происходит заполнение
if (PINB.3==1)
{
delay_ms(5); //Задержка при увеличении
if (OCR0A<0xff)
OCR0A=OCR0A+0x01; //Прибавляем на единицу
}
else
{
OCR0A=0x7f; //Сброс до 50%
}
А в чём проблема то, если код до килобайта ужимается ?levaclaus писал(а):Есть Attiny13 c 1024 байт памяти, и есть код, который ужимается до 1040 байт
1040 > 1024Аlex писал(а):А в чём проблема то
Библиотека DS18B20 в CVAVR использует float, когда можно обойтись фиксированной точкой. Ниже функция получения температуры, выдающая результат в виде 10*t, где t - измеренная температура. Например, если t=27,3 C, то функция вернёт значение 273.levaclaus писал(а):Комрады, помогите впихнуть невнихуемое. Есть Attiny13 c 1024 байт памяти, и есть код, который в cvavr 3,12 ужимается до 1040 байт. Или может есть легкая библиотека для ds18b20
Код: Выделить всё
#include <ds18b20.h>
// temp. conversion time [ms] depending on the resolution
static flash int conv_delay[4]={100,200,400,800};
// valid temp. bit mask depending on the resolution
static flash unsigned bit_mask[4]={0xFFF8,0xFFFC,0xFFFE,0xFFFF};
signed int my_ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
if (ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3;
if (ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
delay_ms(conv_delay[resolution]);
if (ds18b20_read_spd(addr)==0) return -9999;
w1_init();
return ((*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*5/8);
}Код: Выделить всё
temp=-1*temp;Код: Выделить всё
temp=-temp;Код: Выделить всё
if ((data_l&(0b10000000)) == 0b10000000)Код: Выделить всё
if (data_l&(1<<7))Можешь попробовать такlevaclaus писал(а):Убрал задержки в spi();
Сделал unsigned char d1, d2, d3, d4;
Заменил в spi(); "if (data_h&(1<<7))"
Получилось 1004 байта, 98% flash.