| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Простенький проект на PIC12F683 (MicroC PIC v8.2.0.0.) - HELP!
02.04.2010, 22:36
|
|
|
Частый гость
Регистрация: 04.03.2005
Сообщений: 36
Сказал спасибо: 264
Сказали Спасибо 34 раз(а) в 8 сообщении(ях)
|
Простенький проект на PIC12F683 (MicroC PIC v8.2.0.0.) - HELP!
Мужики, помогите  - что-то туго мне программированеи контроллеров дается, на элементарном туплю... 
Не получается по каждому нажатию менять "картинку" на индикаторе, и то что находится в switch/case... Ткните носом - где "накосячил".
Ещё вопрос - как сделать что бы после "не нажимания" кнопок секунд 10 (типа - закончили выбор) сохранить "выбор" в EEPROM, что бы при след. включении cчитать и "применить" это значение? Понимаю что надо использовать таймер, вопрос как? Если можно - конкретный пример.
|
Код:
|
////////////////////////////////////////////////////////////
// //
// КОНТРОЛЛЕР PIC12F683 (внутренний генератор 4Mhz) //
// //
////////////////////////////////////////////////////////////
#define REG_PIN_DATA GPIO.F4 // DATA 4094/74xx164
#define REG_PIN_CLK GPIO.F5 // CLK 4094/74xx164
#define sw GPIO.F3 // Button In
#define RESET GPIO.F0
#define REG_DATA_ON REG_PIN_DATA = 1;
#define REG_DATA_OFF REG_PIN_DATA = 0;
#define REG_CLK {REG_PIN_CLK = 1; asm nop; asm nop; REG_PIN_CLK = 0;}
unsigned short zz, oldstate;
// unsigned char digs[5]={0x3F, 0x06, 0x5B, 0x4F, 0x00}; // Общ. катод
unsigned char digs[5]= {0xC0, 0xF9, 0xA4, 0xB0, 0xFF}; // Общ. анод
void Register(char tmp) // Процедура загрузки в регистр
{
char i, dig;
dig = digs[tmp];
for(i=8; i›0; i--)
{
if(dig & 0x80)
{
REG_DATA_ON
}
else
{
REG_DATA_OFF
}
dig ‹‹=1;
REG_CLK
}
}
void Register_init(void) // Процедура иниц. регистра
{
char i;
for(i=0; i‹8; i++)
{
REG_DATA_OFF;
REG_CLK
}
}
void SW(void)
{
// zz++;
// if (zz › 3) zz = 0;
switch (zz) {
case 0:
{
Register(0);
break;
}
case 1:
{
Register(1);
break;
}
case 2:
{
Register(2);
break;
}
case 3:
{
Register(3);
break;
}
default : Register(4);
}
}
void main()
{
GPIO = 0;
CMCON0 = 0b00000111;
ANSEL = 0b00000000;
TRISIO = 0b00001000;
do
{
Register(4);
zz = 0;
if (Button(&GPIO, 3, 10, 0)) oldstate = 1;
if (oldstate && Button(&GPIO, 3, 10, 1))
{
zz++;
if (zz › 3) zz = 0;
SW();
RESET = 1;
Delay_ms(500);
RESET = 0;
oldstate = 0;
}
}
while (1);
} |
Проект с исходником во вложении, и схема в Протеусе.
Последний раз редактировалось Alex_NEMO; 02.04.2010 в 22:45.
|
|
|
|
03.04.2010, 00:30
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Простенький проект на PIC12F683 (MicroC PIC v8.2.0.0.) - HELP!
Сообщение от Alex_NEMO
|
|
Ещё вопрос - как сделать что бы после "не нажимания" кнопок секунд 10 (типа - закончили выбор) сохранить "выбор" в EEPROM, что бы при след. включении cчитать и "применить" это значение?
|
А шо там непанятна? просто как двери...
Организовываем счётчик на 10 секунд... и считаем его на уменьшение. Когда нажимаются клавиши то в счётчик опять записываем 10 секунд... когда клавиши не жмём и счётчик таки досчитает до "0", запускаем запись в ЕЕПРОМ...
вы сначала АЛГОРИТМ проработайте... кна бумаге.. с квадратиками с ромбиками... очень но помогает по началу... а потому же пишите...
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 03.04.2010 в 00:32.
|
|
|
|
05.04.2010, 13:10
|
|
|
Частый гость
Регистрация: 04.03.2005
Сообщений: 36
Сказал спасибо: 264
Сказали Спасибо 34 раз(а) в 8 сообщении(ях)
|
Re: Простенький проект на PIC12F683 (MicroC PIC v8.2.0.0.) - HELP!
Сообщение от picavr
|
|
вы сначала АЛГОРИТМ проработайте... кна бумаге.. с квадратиками с ромбиками... очень но помогает по началу... а потому же пишите...
|
picavr, большое спасибо за наводку!  "Проанализировал" код с помощью проги Code Visualizer - сразу понял, где "косяк"! Оказывается, я сам обнулял переменную "zz" в самом начале бесконечного цикла и выводил на индикатор "3".
перенес строки:
|
Код:
|
Register(4);
zz = 0; |
в облась инициализации/объявления переменных - все запахало как надо! 
Бум дальше с EEPROM разбираться и со счетчиком!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:50.
|
|