Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Добавка към аларма за кола хелп
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=7388
Страница 1 от 3

Автор:  darkshy [ Нед Дек 13, 2009 1:18 am ]
Заглавие:  Добавка към аларма за кола хелп

Моля за малко помощ. Какво ли не опитах, но
mikroC-то версия 8.2.0.0 при компилиране дава:
"Reentracy not allowed: function [mask] called in both main and interrupt threads"
mask е функция за извеждане стойност на 7сегментен дисплей от микроСи-то.
Отскоро започнах да пиша на Си.
Това представлява добавка към алармена система за кола, защото на майка ми и разбиха колата и сега сложихме аларма и искам когато някой чукне колата алармата да праща импулс към пик-а койта изписва на дисплея колко пъти е чукната колата. Ако са повече от 0 свети светодиода на РА0. Брояча на чуквания брои само до 9. При всяко чукване светва мощна халогенна лампа чрез реле насочена към колата за 30 сек вързана към РА1. А към РА2 има бутон за нулирване на дисплея. Информацията за дисплея се записва в еепрома за да може ако спре тока да се зареди стара стойност. :) Мисля, че идеята е добра, но не мога да реализирам софтуера поради тази тъпа грешка :? . Таман ще си пробутам 16ф84а на майка ми, че са чудя какво да го правя :twisted: :twisted: . Сега си взех 16ф876А 8)
предварително 10х

Ето кода:
Код:
#include "Display_utils.c"
#define LED PORTA.F0
#define LAMP PORTA.F1
#define BUT PORTA.F2
#define INTT PORTB.F0
unsigned char data;

void writeps() {
    data++;
    eeprom_write(0x00,data);
}

void check() {
     for(;;) {
             if (BUT=0) {
                data=0;
                eeprom_write(0x00,data);
             }
             data=eeprom_read(0x00);
             if (data>0) {
                if (data=9) {
                   LED=1;
                   PORTB=mask(data);
                   for(;;) {
                   asm sleep;
                   }
                }
             LED=1;
             }
             else {
                LED=0;
             }
             PORTB=mask(data);
     }
}

void interrupt() {
     delay_us(1);
     if (INTT==0 && LAMP==0 && BUT==1) {
        writeps();
        LAMP=1;
        delay_ms(30000);
        LAMP=0;
     }
     check();
}

void main() {
     INTCON=0b10010000;
     PORTA=0;
     PORTB=0;
     TRISA=0b00000100;
     TRISB=0b00000001;
     check();
}

Автор:  bobyper [ Нед Дек 13, 2009 9:54 am ]
Заглавие: 

Неползвам MicroC но твоя проблем идва от това че викаш функцията check() от главната програма main() а също така и от прекъсването interrupt(). Това е доста лоша идея. Трябва в прекъсването да се викат отделни функции, а още по-добре да не се полазва викане на функции.

Автор:  relsys [ Нед Дек 13, 2009 10:36 am ]
Заглавие: 

.... И въобще като цяло безкрайно зле написана програма.

Автор:  bateAz [ Нед Дек 13, 2009 11:20 am ]
Заглавие: 

"if (BUT=0) { "

Това какво прави ? 8O

Автор:  optron [ Нед Дек 13, 2009 1:00 pm ]
Заглавие: 

За такава проста задача е безсмислено да се ползва прекъсване. Направи си един цикъл, който да сканира входовете и да прихваща фронтове. При преден фронт - броиш и светкаш. Толкоз.
Имай предвид, че на този процесор епромът му издържа доста малко цикли на запис.

Автор:  bobyk [ Нед Дек 13, 2009 2:01 pm ]
Заглавие: 

Това което си написал е едно голямо нищо и съответно нищо не прави. Вземи предвид забележките и я напиши от начало без дори да поглеждаш към старото си творение. И прекъсване не ти трябва, не забравяй че = и == не е едно и също. Като напишеш нещо ново постни го да видиме напредъка

Автор:  darkshy [ Нед Дек 13, 2009 8:36 pm ]
Заглавие: 

10x. Сега ще я започвам отново. За прекъсването и еепрома нарочно го направих така за да се пробвам и да науча как става. :)
Смятам да започвам да чета една книжка за C за PIC-ове в pdf. Като пренапиша програмата ще я кача отново да кажете дали напредвам :) Книжката я дръпнах от тук: http://www.mcu-bg.com/mcu_site/viewtopic.php?t=6458 . Също така искам да попитам на какъв компилатор да пиша ccs mikroc или hitech. Насочих се към микроС защото има вградени библиотеки и се работи по-лесно (според мен) от ccs-a и hitech-a. Поправете ме ако греша. Иначе предпочитам hitech-a от ccs-a, въпреки, че ццс-а има уизарди,но .. микроС-ито мисля, че е най-добре за мен :) Също така имам последен въпрос към феновете на proteus-а. Защо като заредя асм файла в протеуса и ми дава грешки при компилирването?! Мисля, че е от това, че като отворя асм-то с ноутпад-а пред инструкциите има хекс числа. И съм сигурен, че това е от компилатора на микроС-ито и не знам как да му кажа да не ги слага. :?
Ако не се изразявам добре, не се притеснявайте да ми пишете. Не смея да ви викам "колеги" защото първо - не съм още напреднал с материята и второ - съм още на 14 години. Благодаря за препоръките. Айде,че сега започвам програмката :)
Поздрави от Варна!

Автор:  darkshy [ Нед Дек 13, 2009 10:07 pm ]
Заглавие: 

Написах програмата наново. Този път си начертах на един бял лист диаграмка и по нея написах програмата :) И най-накрая разбрах как се работи с Протеуса и я тествах и познайте... РАБОТИИИ 8) Точно както исках 8)
Ето диаграмката и кода:
Код:
#include "Display_utils.c"
#define LED PORTA.F0
#define LAMP PORTA.F1
#define BUT PORTA.F2
#define INTT PORTA.F3
unsigned char data;

void main() {
     INTCON=0b10010000;
     PORTA=0;
     PORTB=0;
     TRISA=0b00001100;
     TRISB=0;
     for(;;) {
start:
             data=eeprom_read(0x00);
             PORTB=mask(data);
             if(BUT==0) {
                        LED=0;
                        data=0;
                        eeprom_write(0x00,data);
             }
             if(INTT==0) {
                         LED=1;
                         if(data==9) {
                                     for(;;) {
                                             if(BUT==0) {
                                                        goto start;
                                             }
                                     }
                         }
                         if(data<9) {
                                    data++;
                                    eeprom_write(0x00,data);
                         }
                         data=eeprom_read(0x00);
                         PORTB=mask(data);
                         LAMP=1;
                         delay_ms(30000);
                         LAMP=0;
             }
     }
}


П.П. Диаграмата претърпя промени :)

Прикачени файлове:
HPIM0878.JPG
HPIM0878.JPG [ 1.83 MiB | Прегледано 2022 пъти ]

Автор:  lafi [ Пон Дек 14, 2009 12:17 am ]
Заглавие: 

Трябва да се забрани споменаването на Pic16F84 във форума.
Да се добави в правилата и условията за ползване на сайта - Бан изтриване на акаунта и блокиране по IP.


Не мога да разбера, защо го ползват още в радиолюбителските сайтове, след като е по-скъп от алтернативата 16F628 и скоро най-вероятно ще бъде спрян от производство, ако не е вече.

Автор:  darkshy [ Пон Дек 14, 2009 12:25 am ]
Заглавие: 

Аз този проект го правя точно за да се отърва от него :twisted: и да го пробутам на майка ми да й следи колата :)
Иначе сега съм с 16ф876а и съм доволен 8)

Автор:  lafi [ Пон Дек 14, 2009 1:12 am ]
Заглавие: 

16F886 са 2 пъти по ефтини, не знам защо не поръчвате от тях.
В Комет зареждат по 25 бройки, защото не се търсят най-вероятно.

Автор:  bobyk [ Пон Дек 14, 2009 10:55 am ]
Заглавие: 

Че имаш желание да учиш е похвално. Ето ти малко градивна критика:
1.МикроЦ - едно недоразумение както всичко на МикроЕ. По добре си избери нещо друго (няма много да ти липсват точно тяхните библиотеки, има достатъчно други из нета, а и винаги можеш да си напишеш сам, не си позволявай да свикваш с малоумията им иначе ще се превънеш в ... малоумник), по възможност да е по ANSI C ориентирано че и CCS си има особености. Wizard-ите не са лошо нещо ама ако генерират ANSI C код, а не нещо специфично за съответния компилатор.
2.Обикновено еепрома не се ползва като рам понеже живота му не е безкраен, има малко по-различен подход ако искаш да си запазиш състоянието при отпадане на захранването, то в твоя случай това не е от особено значение.
3.В Си винаги има начин да избегнеш употребата на goto, т.е. като се понаучиш ще видиш колко грозно и безсмислено е това. В твоя случай continue прави това което искаш.
for( ; ; ) {
if(BUT==0) {
goto start;
}

би могло да е ...

while(BUT != 0);
continue;

Е могат и още неща да се кажат за твоята програма ама за сега толкова.
Ще ми се да ни запознаеш и със следващия си "проект", ама нека да е някоя 18ка че пик16 е едно наказание дето... има доста изписано. А и днешно време на прилични пари има доста по истински контролери, не се задържай на много малките.

Автор:  darkshy [ Пон Дек 14, 2009 4:20 pm ]
Заглавие: 

Благодаря за съветите. :) Аз точно за това не искам да използвам CCS защото не генерира точно ANSI код и кода не може да се използва с други компилатори.
Значи ще се насоча към hitech-a. Както казва bobyk имам мерак да се науча, а не като някои хора, които искат всичко да им е наготово. Освен това не искам да назубря нещо, ами искам да го осмисля и разбера. В момента малко бавно протича обучението ми защото съм в 8ми клас в МГ Варна и много ни дават домашни и тем подобни работи и ми остава малко свободно време през което да изучавам микроконтролерите. Като се понауча малко ще захващам 18ките. btw смятам да си поръчам ICD2 клонинг от тук: http://www.sirius-pcb.com/?mod=catalog&show=50 .Мислех за pickit2 клонинг (пак от същия сайт), но като се поразчетох из форуми мисля, че ИЦД-то е по-добрия вариант. :wink: btw едно не ми е ясно, ако на крачетата за дебъгване и програмиране на ПИК-а е вързано например lcd, как ще се дебъгва? Нещото, което се сетих е тези крачета да ги оставя само за дебъг и програмиране, но тази идея не ми допада особенно. Не съм много добър в хардуера и затова ви питам. Питам в тази тема за да не отварям нова. ББ и поздрави от Варна.

П.П. Замислих се дали има някой друг в този форум от Варна?! :roll:

Автор:  optron [ Пон Дек 14, 2009 10:41 pm ]
Заглавие: 

Айде, от мен една похвала, стига толкова критики:
Браво! Подходил си методично и си използвал нагледни методи и това е дало резултат. Друго си е, когато видиш нещата на картинки (имам предвид диаграмата в случая). Така и занапред. Като се усъвършенстваш, за простички задачи вече няма да са ти нужни диаграмки на хартия, ти ще си ги представяш в главата общо взето.
От Сириус поръчвай само сглобени и тествани изделия, защото доколкото съм чувал, китовете им са зле комплектовани и понякога не тръгват.
ПП: На твоите години, аз вече се борих с транзистори. Ама тогава бяха и други времена. Сега технологиите са доста напред спрямо тогава. Подозирам какво ще ти е средното образование ... ;) Успех ти желая.

Автор:  darkshy [ Пон Дек 14, 2009 10:50 pm ]
Заглавие: 

Благодаря :)
П.П. Иначе от сириус съм поръчвал USB AVR ISP програматор само платката с аттинито и си го сглобих и бачка безпроблем и сега се чудя какво да го правя, защото вече не се занимавам с атмеги и са чудя на кой да го дам :? Може да си го запазя, че ще вземе да ми потрябва някой ден :wink:

Страница 1 от 3 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/