Уже не такой простой диспетчер с динамической очередью задач для PIC12F/16F

Доброго времени суток. Опять я со своими ассемблером и ПЫК16. Вот наконец-то, как и запланировал, дописал свою «Недо ОС» на ассемблере под Пики. Кому интересно, с чего начиналось — могут почитать здесь: we.easyelectronics.ru/Gnusmas/prostoy-dispetcher-s-fiksirovannoy-ocheredyu-zadach-dlya-pic16.html

В этой итерации я шагнул гораздо дальше. Настолько дальше, что следующей итерацией должно уже быть что-то на Си. Но я все же прошу заглянуть адептов асcемблера и высказать свое 'фе' по поводу качества и функционала моего кода, чтобы я был твердо уверен, что выжал все, что можно было.
Из того что усовершенствовано по сравнению с предыдущим проектом:
  1. Очередь задач из фиксированной переделана в динамическую, в виде кольцевого буфера, размер котрого задеться в файле настройки ОС
  2. Проект «Недо ОС» разбит на несколько файлов: файл «ядра», файл задач, файл настройки ОС, файл макросов общего употребления
  3. Все возможные настройки системы упакованы в макросы и по максиму автоматизированы. То есть расчитано, что Вы зайдете в файл настройки системы Nedo_OS_v1.4.h, внесете в него необходимые Вам параметры ОС, а дальше все само подстроится и создастся. Вам останется только написать обработчик для каждой Вашей задачи.
  4. Исправление банальных ляпов вроде переписи содержимого таймера в конце, а не начале обработчика прерывания, что устраняет неравномерность возникновения прерываний при разном количестве таймеров, и прочие мелочи.

Сейчас проект (8 светодиодов мигают каждый со своей частотой) занимает 269 слов памяти программ и 52 байта ОЗУ, влазя таким образов во все 12F и 16F камни. На 16F84 остается 755 слов памяти программ (3/4 доступного объема) 16 байт ОЗУ (1/4 доступного обьема). Как видим, добавление очереди задач в виде кольцевого буфера и номера целевой задачи для каждого таймера съело львиную долю ОЗУ. Замечания и пожелания приветствуются.

Подключение экрана ILI9341 к pic24

PIC
Недавно приехал ко мне этот девайс, подключил к pic24fj64gb004, нарисовал линии, круги, как то все уныло, захотел выводить изображение, зря что ли покупал, тем более что контроллер позволяет работать с USB флешкой, выкопал микрочиповское демо, поправил под свой контроллер, дописал прошивку, подпаял экран, воткнул флешку и все заработало, описание экрана можно без проблем найти в сети так что вдаваться в дебри что там и как вдаваться не буду, шина работает на частоте 16 мгц, все это конечно скоростями не поражает, все таки 16мгц и отсутствие DMA скорости не прибавляют :-).
видео процесса вывода
youtu.be/ezIEmxJ4txk
вследствии недостаточного размера памяти и быстродействия контроллера, картинки переконвертированы в формат RGB565 и записаны на флешку, программа читает содержимое файлов и выводит на экран,
в main

 while(1)
    {
      USBTasks();

        if(USBHostMSDSCSIMediaDetect())
          {
           deviceAttached = TRUE;
           LED0_IO=1;
           
          if(FSInit())
            {
             if(TickGet() - t >= TICK_SECOND*2)
                {
                  t = TickGet();
                  i++;
                }
             switch(i){
                case 1:TFT_FillScreen(BRIGHTGREEN);
                     break;
                case 2:TFT_FillScreen(BRIGHTBLUE);
                     break;
                case 3:TFT_FillScreen(BRIGHTCYAN);
                     break;
                case 4: TFT_FillScreen(MAGENTA);;
                     break;
                case 5: TFT_FillScreen(YELLOW);
                     break;
                case 6:  TFT_FillScreen(BLACK);;
                     break;
                case 7:TFT_FillScreen(CYAN);;
                     break;
                case 8:TFT_FillScreen(DARKGRAY);;
                     break;
                case 9:TFT_FillScreen(BRIGHTRED);
                     break;
                case 10:
                    
                    myFile = FSfopen("1.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);
                      

                   break;
                  case 11:


                      myFile = FSfopen("2.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 12:
                    
                        myFile = FSfopen("3.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 13:
                     
                        myFile = FSfopen("4.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 14:
                     
                        myFile = FSfopen("5.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 15:
                    
                   myFile = FSfopen("6.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                  case 16:
                    
                      myFile = FSfopen("7.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 17:
                   
                        myFile = FSfopen("8.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 18:
                  
                        myFile = FSfopen("9.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 19:
                  
                        myFile = FSfopen("10.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);

                   break;
                   case 20:
                    
                        myFile = FSfopen("11.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);
                   break;
                   case 21:
                   
                        myFile = FSfopen("1.raw","r");
                    do{
                      charsRead = FSfread((WORD *)myData,2,1024,myFile);
                      WriteDisplayPicture(myData,charsRead);
                       }
                       while(charsRead==1024);
                      FSfclose(myFile);
                      i=1;
                   break;
                 }

если устройство подключилось, инициализируем файловую систему, потом по таймеру выводим изображения.

Лабораторные работы на МК PIC или версия "БЫСТРОГО СТАРТА"

PIC
Когда то, давным давно… В далекой галактике....


Читать дальше
  • +8
  • 29 сентября 2014, 15:01
  • ppram5
  • 1

Arriba. Ещё одна IDE.

PIC


На сайте микрочипа появилась IDE Arriba, основанная на Eclipse. Для любителей оригинального Eclipse есть возможность установить Arriba-plugin + Arriba Connect отдельно (некий софт, связывающий GDB и микрочиповские программаторы-отладчики).



Всё бы хорошо, но…
Бесплатная версия поддерживает только PicKit 3 + Simulator. Для обладателей шайб (ICD2, 3) требуется Enterprise Edition по прекрасной цене 495$.

Что можно сказать? Сначала микрочип взяли опен-сурсный gcc и перепилили его в свою серию компиляторов XC и теперь продают за денежку, но и этого оказалось недостаточно. Теперь можно к опен-сурс IDE продавать ПО для работы с их контроллерами. Браво чтоль…

Из плюсов: возможно в скором это ограничится не только прикручиванием к Eclipse, но и к другим IDE, например QtCreator, C::B и т.д.
  • +2
  • 02 сентября 2014, 10:59
  • becopt

одноразовый usb pic программатор из ft232, ft245, ft2232

Пытаясь прокачать свой tl866cs до более дорогого с исп выходом, я залил в него загрузчик, который был выковырен одним участником форума vrtp.ru. А у программатора этого есть серийник и номер устройства, которые наверное теперь отслеживаются китайцами и в новых обновлениях могут быть заблокированы.
Прошить загрузчик я прошил, а второй программатор уже продал, решив оставить себе прокачанный.
Т.к. пиками я не занимаюсь, то отдельного у меня не было, а платить 5 евров было жалко и ехать далеко до магазина.

И тут внезапно оказывается есть программатор под лпт, причем он работает с картами pci, надо тамт олько указать адрес карты.
И там же есть PICPgm USB Programmer, который сделан на ft232.
У меня нет нет 232, зато есть пинборд2 с тф2232. А это по сути 2хфт232.

Подключаем.


В настройках софта выбираем усб программатор, а напротив номеров выводов снимает все галки инвертирования. Потом замыкаем data in с data out. Теперь софт определяет наш программатор.
Более того, софт может автоматом определять контроллер.
У меня он определил все и прошил.

И вот тут кроется его одноразовость. По каким-то причинам фтшка работает очень медленно. Скорей всего потому, что автор использует bit bang вместо настоящего спи, который можно гнать аж до 24мгц вроде бы или выше.
Поэтому такой вариант хватит разве что прошить загрузчик. 128к программатор читает около 3х минут.

Не забудьте, что некоторые пики 18й серии работают только от 3.3в и на пинборде надо переключить джампер питания i\o на 3.3в.

Если вы хотите прокачать свой tl866cs, то вам нужен апдейтер bit.ly/YaJYDq
Вроде бы он не требует стороннего программатора или же генерит прошивку с нужным конфигом и ее надо самому заливать.

О погоде. Ethernet-метео с вертикальным взлётом.

Есть у меня знакомый Слон.
И делает этот Слон эзернет-термометры.
вот такие:



Читать дальше

Счетчик электроэнергии 2х тарифный

Накрылся 2х тарифный квартирный счетчик, не проработов и 2х лет. Похоронив вместе с собой показания потребления за полгода (вынуть, я подозреваю, их можно, читаем далее как. но куда в нашем совке их предъявишь). Разбераем прибор и смотрим, что и как внутри.



подкат
  • +1
  • 26 сентября 2012, 11:57
  • EnTuTb

Extra-pic

Под катом плата в eagle и модель в sketchup.Зачем я это сделал? Да просто захотелось что-то собрать, потравить, спаять и в SketchUp порисовать.

Читать дальше

Набор исходников для эмбеддера

Осматривал свои старые закрома, нашёл этот архивчик

Примеры исходников
  • +9
  • 28 июля 2012, 11:38
  • uni
  • 1

таки запилил FLC-метр

по класической схеме с LM311
на PIC16f684, с энкодерным управлением, на олдскульных АЛ304.
на борту имеется акум на 600счемто mah от мобильника и разъем для зарядки сзади
кто-то может узнать свой корпус утащеный мной давным давно из мусоровоза



Читать дальше
  • +3
  • 26 июля 2012, 22:43
  • kest