Отговори на тема  [ 43 мнения ]  Отиди на страница 1, 2, 3  Следваща
Добавка към аларма за кола хелп 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение Добавка към аларма за кола хелп
Моля за малко помощ. Какво ли не опитах, но
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();
}


Нед Дек 13, 2009 1:18 am
Профил WWW
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Яну 31, 2006 11:11 pm
Мнения: 295
Местоположение: София
Мнение 
Неползвам MicroC но твоя проблем идва от това че викаш функцията check() от главната програма main() а също така и от прекъсването interrupt(). Това е доста лоша идея. Трябва в прекъсването да се викат отделни функции, а още по-добре да не се полазва викане на функции.


Нед Дек 13, 2009 9:54 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
.... И въобще като цяло безкрайно зле написана програма.


Нед Дек 13, 2009 10:36 am
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
"if (BUT=0) { "

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


Нед Дек 13, 2009 11:20 am
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Чет Ное 20, 2008 1:49 pm
Мнения: 276
Местоположение: Бургас
Мнение 
За такава проста задача е безсмислено да се ползва прекъсване. Направи си един цикъл, който да сканира входовете и да прихваща фронтове. При преден фронт - броиш и светкаш. Толкоз.
Имай предвид, че на този процесор епромът му издържа доста малко цикли на запис.

_________________
Digitally yours: Optron


Нед Дек 13, 2009 1:00 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Пон Яну 09, 2006 11:32 am
Мнения: 276
Местоположение: Kozloduy
Мнение 
Това което си написал е едно голямо нищо и съответно нищо не прави. Вземи предвид забележките и я напиши от начало без дори да поглеждаш към старото си творение. И прекъсване не ти трябва, не забравяй че = и == не е едно и също. Като напишеш нещо ново постни го да видиме напредъка


Нед Дек 13, 2009 2:01 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
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 години. Благодаря за препоръките. Айде,че сега започвам програмката :)
Поздрави от Варна!


Нед Дек 13, 2009 8:36 pm
Профил WWW
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
Написах програмата наново. Този път си начертах на един бял лист диаграмка и по нея написах програмата :) И най-накрая разбрах как се работи с Протеуса и я тествах и познайте... РАБОТИИИ 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 | Прегледано 2011 пъти ]
Нед Дек 13, 2009 10:07 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Ное 09, 2008 12:28 am
Мнения: 63
Мнение 
Трябва да се забрани споменаването на Pic16F84 във форума.
Да се добави в правилата и условията за ползване на сайта - Бан изтриване на акаунта и блокиране по IP.


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


Пон Дек 14, 2009 12:17 am
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
Аз този проект го правя точно за да се отърва от него :twisted: и да го пробутам на майка ми да й следи колата :)
Иначе сега съм с 16ф876а и съм доволен 8)


Пон Дек 14, 2009 12:25 am
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Ное 09, 2008 12:28 am
Мнения: 63
Мнение 
16F886 са 2 пъти по ефтини, не знам защо не поръчвате от тях.
В Комет зареждат по 25 бройки, защото не се търсят най-вероятно.


Пон Дек 14, 2009 1:12 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

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

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

while(BUT != 0);
continue;

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


Пон Дек 14, 2009 10:55 am
Профил ICQ
Ранг: Популярен
Ранг: Популярен

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

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


Пон Дек 14, 2009 4:20 pm
Профил WWW
Ранг: Ориентиран
Ранг: Ориентиран

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

_________________
Digitally yours: Optron


Пон Дек 14, 2009 10:41 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
Благодаря :)
П.П. Иначе от сириус съм поръчвал USB AVR ISP програматор само платката с аттинито и си го сглобих и бачка безпроблем и сега се чудя какво да го правя, защото вече не се занимавам с атмеги и са чудя на кой да го дам :? Може да си го запазя, че ще вземе да ми потрябва някой ден :wink:


Пон Дек 14, 2009 10:50 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 43 мнения ]  Отиди на страница 1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни