тут со всеми что сумел "напортачить". думаю в "исправленных ошибок или несогласиях" которых я проделал будут кучи моих ошибок, потому лучше чтобы опытные пользователи началибы портирование с хотабы с предыдущего архива например с ругания компилятора о том чтобы "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
описание подпрограмм: 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);//задержка
Добавлено 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
Здравствуйте! Задумался над тем, как авторы часов на ВЛИ и ГРИ реализуют различные спец эффекты, к примеру скроллинг цифр в разные стороны, затухание и подобные. Могли бы рассказать как все это работает, особенно сочетание с динамической индикацией... Думал думал и никак не соображу, очень хочется сделать это в своих часах. Изучал исходники, но мало что понял, свой код то писать сложно, а уж понять чужой.
Единственная мысль которая возникла, это массив с набором параметров каких то, но до конца мысль сформировать не могу. Буду благодарен за помощь. В первую очередь интересно не готовое решение, а сам принцип. Хочу понять досконально как оно работает.