тут со всеми что сумел "напортачить". думаю в "исправленных ошибок или несогласиях" которых я проделал будут кучи моих ошибок, потому лучше чтобы опытные пользователи началибы портирование с хотабы с предыдущего архива например с ругания компилятора о том чтобы "This library requires AVR-GCC 3.3 or later, update to newer AVR-GCC compiler !" я просто закоментировал. потом еше codevision выдавал ошибку ссылавшего на файл pgmspace.h, в место него воткнул в папку AVR-GCC-овский файл pgmspace и назвал его avr_pgmspace и т.д. https://drive.google.com/open?id=1CEmjv ... OEhwjAKlHg
упростил вопросс, убрал все лишнее (может не все), остались 2 ошибки на данный момент. зачем ругается компилятор ?
Error: D:\C prog\cvavreval\MY PROJ\tests\test_328_2\generator.c(86): a value of type 'flash pchar flash *' can't be used to initialize an entity of type 'f_get_txt'
Error: D:\C prog\cvavreval\MY PROJ\tests\test_328_2\generator.c(126): incompatible return expression of type 'unsigned char [16]', expect a 'flash pchar'
#define DDRTEMP DDRD // Установить порт к которому подключен датчик температуры на выход
#define PINTEMP PIND // Установить порт к которому подключен датчик температуры на вход
#define BT 0 // Пин порта к которому подключен датчик температуры
#define Speed_temp 0.122 // частота таймера в кГц
//#define StartDelay(x,t) if (t) {(t)--;} else {switch (x){case 0: (t)=-1;
#define StartDelay(x,t) if (t) {if (~(t)) (t)--;} else {switch (x){case 0: (t)=-1;
#define Delay(num,te,x,t) (x)=(num); (t)=(te)*Speed_temp; break; case(num): (t)=-1;
#define EndDelay(te,x,t) (t)=(te)*Speed_temp; default: (x)=0;};};
//переменные:
//num - порядковый номер задержки (пока не придумал как автоматизировать), главное чтобы не повторялись внутри одной группы задержек
//te - время задержки в миллисекундах
//x - статик переменная, хранит адрес возврата (номер точки)
//t - статик переменная, счетчик задержки
void GetTemp(void) //процедура получения температуры
{
static unsigned char DelyGetTemp = 1000*Speed_temp; //задержка перед первым измерением 1 сек.
static unsigned char StepGetTemp = 0;
static unsigned char TermH, TermL;
StartDelay(StepGetTemp,DelyGetTemp) //это разделители, чтобы подпрограмма не выполнялась слишком долго, а перезапускалась и при перезапуске продолжалась с места остановки
DS18B20_init(); // Инициализация DS18B20
Delay(1,0,StepGetTemp,DelyGetTemp)
write_18b20(0xCC); // Проверка кода датчика
Delay(2,0,StepGetTemp,DelyGetTemp)
write_18b20(0x44); // Запуск температурного преобразования
Delay(3,850,StepGetTemp,DelyGetTemp) // Пауза >750 мс
DS18B20_init(); // Инициализация DS18B20
Delay(4,0,StepGetTemp,DelyGetTemp)
write_18b20(0xCC); // Проверка кода датчика
Delay(5,0,StepGetTemp,DelyGetTemp)
write_18b20(0xBE); // Считываем содержимое ОЗУ
Delay(6,0,StepGetTemp,DelyGetTemp)
TermL = read_18b20(); // Читаем младший байт блокнота
Delay(7,0,StepGetTemp,DelyGetTemp)
TermH = read_18b20(); // Читаем старший байт блокнота
Delay(8,0,StepGetTemp,DelyGetTemp)
Temperature=((((TermH<<8)+TermL)*10)>>4)+Corr;
if (OK_Flag != 0) {Temperature = -2000; Count=0;};
Count+=(~Count)? 1:0; //это моё- счет правильныхъ измерений - для исключения ложных переключений компрессора
EndDelay(150,StepGetTemp,DelyGetTemp) //задержка перед следующим измерением до 1сек
}
при развертывании дефайнов код разворачивается в обычный свитч-кейс...
_______________
я уже выкладывал эту идею на обозрение на этом форуме - меня попросили избавиться от ГОТО (я избавился) и предложили идею как узнавать текущий программ каунтер - через стек (он сохраняется в стеке при вызове подпрограммы) - пошел по этому пути, т.к. считаю, что на подзадачах код будет более компактным (а для тини это важно)
но у меня ничего не вышло...
______________ пробовал через указатели - не получается в указатель загрузить данные из регистра SP... пишет про несоответствие типов пробовал через ассемблерные вставки - не получается вставке передать метку (из С кода) и как параметр метку тоже применить не получилось (чтобы взять адрес из неё)
пишу здесь, т.к. работаю в КВАВР и если возможно, предпочел бы (но не обязательно) получить подсказку по нюансам именно этого компилятора ...
может есть у кого какие наработки или мысли...
Сделал на подпрограммах - вроде всё понял... и квавр уже не ругается и 100 слов кода сэкономилось... но... ничего не работает и не понятно почему...
весь код остался прежним, изменилось содержимое дефайнов:Спойлер
#pragma warn- // this will prevent warnings
void Set_PC(unsigned int x)
{
#asm
;ldd R26,Y+1 ;R26=xL загрузка параметра в X
;ld R27,Y ;R27=xH
;закомментировал, т.к. значение х уже в этих регистрах
in R30,SPL ;загрузка SPL в Z
;in r31,SPH ; для меги
clr R31 ; для тини
ADIW r30,0x01 ;Z=Z+1
st Z+,r26 ;обновляем точку перехода в ОЗУ
st Z, r27
#endasm
}
unsigned int Get_PC(void)
{
#asm
IN R26,SPL ;SP->X
;IN R27,SPH ;SP->X для мег
CLR R27 ;для тини
ADIW r26,0x01 ;X=X+1
LD r30,X+ ;результат из ОЗУ по X
LD r31,X
#endasm
}
#pragma warn+ // enable warnings
#define StartDelay(x,t) if (t) {if (~(t)) (t)--; goto Label##x;} else {if ((x)) Set_PC((x)); (t)=-1;};
#define Delay(num,te,x,t) (t)=(te)*Speed_temp; (x)=Get_PC(); (t)=-1; goto Label##x;
#define EndDelay(te,x,t) (t)=(te)*Speed_temp; (x)=0; Label##x:;
описание подпрограмм: Set_PC(х) - получает параметр и записывает его в ячейку памяти, по которой осуществится переход при завершении подпрограммы (аналог JMP но по переменной, а не по метке) Get_PC() - возвращает значение PC точки, откуда был вызван StartDelay(x,t) - проверяет вышло ли время ожидания, и если вышло - переходит по сохраненному адресу, если нет переходит к концу программного блока Delay(num,te,x,t) - записывает время в переменную ожидания, адрес в переменную возврата и выходит из блока...
(num теперь не нужна, но пока осталась для совместимости со старым кодом) EndDelay(te,x,t) - обозначает конец программного блока (метка), + добавлена задержка следующего запуска блока кода
Последний раз редактировалось Ivanoff-iv Чт окт 31, 2019 13:03:20, всего редактировалось 1 раз.
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Да, я знаю, что любая ОС это делает, но не любая ОС влезет в тини, чтобы ещё и место полезное осталось...
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Почему невпихуемое? уже несколько проектов шустро крутятся на тини 2313... например термостат, на DS18b20 и семисегментнике, с настройкой уставок, коррекции измерения датчика, и плавным изменением яркости индикатора, с высоким приоритетом пользовательского интерфейса (нет ни малейшего подмаргивания экрана, четкие измерения длительности нажатия клавиш... хотел ещё в меню вывести направление регулирования, но флеш предательски закончился... если я заведу свой новый код - влезет и он и ещё место останется...), неужели ради простого термостата или таймера обязательно мегу или стм покупать?
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
И Вы пытаетесь что-то изобретать, дабы впихнуть невпихуемое
Вы хотите сделать красивый линейный код, изобретая обёртки, которые разворачиваются в ужасные switch-case'ы.
Подглядите, как это делают в элементарных кооперативных ОС. Откроете для себя кое-что новенькое
[uquote="Аlex",url="/forum/viewtopic.php?p=3728074#p3728074"]обёртки, которые разворачиваются в ужасные switch-case'ы.[/uquote] ну... уже не разворачиваются...[uquote="Аlex",url="/forum/viewtopic.php?p=3728074#p3728074"]Подглядите, как это делают в элементарных кооперативных ОС...[/uquote] Если порекомендуете, куда глянуть, буду благодарен...
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аlex писал(а):Подглядите, как это делают в элементарных кооперативных ОС
в OSA "разворачивается" все намного страшнее... там даже для сборки не так все просто организовано. имхо, с точки зрения красоты кода OSA далеко не лучший пример. я очень в ней разочаровался, а от внутренней "механике" вообще в ужасе.
имхо.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Каждому своё...
Много лет уже ей пользуюсь и ни разу в ней не разочаровался...
На сколько помню, ты был слишком требователен к искомой ОСи. Не забывай, OSA - простая и кооперативная ОСь !
Да и разговор был не совсем об операционках и их качествах. А о том, что человек делает планировщик, только через одно место. В то время, когда уже давно придумали другой способ реализации подобных алгоритмов.
OSA - штука интересная, но для тини немного крупновата... (почитал доки, пошарил коды, поставить пока не вышло...)
_____
Мой код не заработал... я нашел и убрал свои косяки... но, если задержек больше одной, то оптимизатор код так закручивает, что функции Гет и Сет РС оказываются на разных уровнях вложенности и перескок из одной в другую оказывается невозможен...
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Здравствуйте профессионалы,помогите пожалуйста новичку,только начал изучать программирование,начал с камня атмега 16,попробовал зажечь светодиод,потом как и все,попробовал зажечь светодиод через кнопку,все получилось,только вот беда,контролер запитан у меня через программатор усбас,при подаче питания на микроконтроллер сразу без нажатия кнопки загорается светодиод и тухнет-это из за чего такое?
Спойлер#include <mega16.h>
#include <delay.h>
void main(void)
{
PORTB=0x02;//вторая ножка порта В установлена как выход 00000010
DDRB=0x01;//на первой ножке порта В +5(высокий сигнал 1)00000001
while (1)
{
if(PINB.1==0)//если на ножке 1 порта В подключили землю(0 потенциал),
//то выполняется код в фигурных скобках
//выполнение кода в фигурных скобках
{
PORTB.0=1;//включился
delay_ms(100);//задержка
PORTB.0=0;//выключился
delay_ms(100);//задержка
PORTB.0=1;//включился
delay_ms(1000);//задержка
PORTB.0=0;//выключился
delay_ms(1000);//задержка
}
}
}Добавлено after 7 minutes 33 seconds:
Еще подскажите пожалуйста,также начал осваивать протеус,по началу светодиоды мигали,а потом перестали,может я что-то натыкал,как это исправить?
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=0b00001011;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void main(void)
{
// Declare your local variables here
while (1)
{
TIM1++;
TYPE=PINB;
TYPE&=0b00010000;
if (TIM1>20) {
TIM1=0;
TIM2=0;
TIM3=0;
};
read_adc (1);
if (TYPE==16){
if (ADCW>40) {
if (AVAR) {
goto _ENDPR;
};
TIM2++;
if (TIM2>14) {
TIM3=0;
AVAR=1;
PORTB.0=1;
};
goto _ENDPR;
};
if (AVAR) {
TIM3++;
if (TIM3>14) {
AVAR=0;
TIM1=0;
TIM2=0;
TIM3=0;
PORTB.0=0;
};
};
}
else
{
if (ADCW>520 | ADCW<40) {
if (AVAR) {
goto _ENDPR;
};
TIM2++;
if (TIM2>14) {
TIM3=0;
AVAR=1;
PORTB.0=1;
};
goto _ENDPR;
};
if (AVAR) {
TIM3++;
if (TIM3>14) {
AVAR=0;
TIM1=0;
TIM2=0;
TIM3=0;
PORTB.0=0;
};
};
};
_ENDPR:
};
}
Пытаюсь по сигналу на PB4 бегать по разным веткам
СпойлерTIM1++;
TYPE=PINB;
TYPE&=0b00010000;
if (TIM1>20) {
TIM1=0;
TIM2=0;
TIM3=0;
};
read_adc (1);
if (TYPE==16){
if (ADCW>40) {
if (AVAR) {
goto _ENDPR;
};
TIM2++;
if (TIM2>14) {
TIM3=0;
AVAR=1;
PORTB.0=1;
};
goto _ENDPR;
};
if (AVAR) {
TIM3++;
if (TIM3>14) {
AVAR=0;
TIM1=0;
TIM2=0;
TIM3=0;
PORTB.0=0;
};
};
}
else
{
if (ADCW>520 | ADCW<40) {
if (AVAR) {
goto _ENDPR;
};
TIM2++;
if (TIM2>14) {
TIM3=0;
AVAR=1;
PORTB.0=1;
};
goto _ENDPR;
};
if (AVAR) {
TIM3++;
if (TIM3>14) {
AVAR=0;
TIM1=0;
TIM2=0;
TIM3=0;
PORTB.0=0;
};
};
};
, но что-то идет не так. как будто всегда висит ноль на входе (в железе уровень меняется).
Что я делаю не так? Помогите
Вопрос снят, разобрался. Предшественник выключил цифровой буфер на входе.
Здравствуйте! Задумался над тем, как авторы часов на ВЛИ и ГРИ реализуют различные спец эффекты, к примеру скроллинг цифр в разные стороны, затухание и подобные. Могли бы рассказать как все это работает, особенно сочетание с динамической индикацией... Думал думал и никак не соображу, очень хочется сделать это в своих часах. Изучал исходники, но мало что понял, свой код то писать сложно, а уж понять чужой.
Единственная мысль которая возникла, это массив с набором параметров каких то, но до конца мысль сформировать не могу. Буду благодарен за помощь. В первую очередь интересно не готовое решение, а сам принцип. Хочу понять досконально как оно работает.