Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Спасибо, это хорошая мысль, мне просто надо дойти до нее самому))
Последний раз редактировалось Пока_без_кота Чт сен 10, 2015 07:51:35, всего редактировалось 1 раз.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение BOB51 »

Существует "шаблон" - образец разметки областей определения констант, данных, имен регистров - файл определения имен под применяемый компилятор.
Т.е. "в проекте могут присутствовать" - но именно могут, а что там реально останется - решать по конкретной задаче надо.
Плюс типовая "заголовочная шапка"
8)
Однако это все весьма условные вещи - каждый пишет так, как приучился - а остальное является в основном рекомендациями.
Как один из образцов пробы создания подобного ассемблерного исходника под MCS51 из раздела viewtopic.php?f=62&t=94201&start=40 :

download/file.php?id=199128
под эту схему
download/file.php?id=199341

:beer:
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Подскажите пожалуйста по такому вопросу. Есть датчики, которые выдают высокий логический уровень при срабатывании. Как их лучше всего подключить ко входам внешних прерываний MCS-51 ? Мне в голову пришло 2 логических элемента "НЕ". Но встречал их только в сочетании и с элементами "И" ("ИЛИ") (например 74НС00 - 4 логических элемента "2И-НЕ" в 1 корпусе). Бывают ли просто элементы "НЕ" ? И что еще можно применить? Допустима ли вот такая схема (принимаем, что S1 - это выход датчика) ?
Изображение
Последний раз редактировалось Пока_без_кота Сб сен 12, 2015 21:38:11, всего редактировалось 7 раз.
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение FireProoF »

Всем привет. Может кто проверить код для 8051 aduc812?
Я поднимаю два ШИМ на разных таймерах и вывожу на пины 1_1 и 2_1. В процессе меняется скважность каналов.
Спойлер

Код: Выделить всё

#include "main.h"

sbit P1_1 = P1^1; /* SFR for P1.1 */
sbit P2_1 = P2^1; /* SFR for P1.1 */

#define PWMPIN   P1_1
#define CLOCK    11059000

#define PERIOD1   1
#define PERIOD2   .5

double Q1 = 0.7;
double Q2 = 0.8;

int HIGH1 = ( 65536 * 12) / CLOCK * Q1;//counts of timer's overflows to reach Q1*Period1
int HIGH2 = ( 65536 * 12) / CLOCK * Q2;//counts of timer's overflows to reach Q2*Period2
int HIGH1_temp = 0;
int HIGH2_temp = 0;

int LOW1 = ( 65536 * 12) / CLOCK * (1-Q1);//counts of timer's overflows to reach (1-Q1)*Period1
int LOW2 = ( 65536 * 12) / CLOCK * (1-Q2);//counts of timer's overflows to reach (1-Q2)*Period2
int LOW1_temp = 0;
int LOW2_temp = 0;

bit pwm1_flag = 0;
bit pwm2_flag = 0;

void pwm_setup(void);
void changeDCPWM1(double);
void changeDCPWM2(double);
void delay(int);

void main(void)
{
   pwm_setup();

   int loops;

   delay(10000);

   changeDCPWM1(0.6);
   changeDCPWM2(0.3);

   delay(10000);

   for(loops = 0;;loops++)
   {
      if(loops == 1000)   loops = 0;
      
      changeDCPWM1(Q1*loops/1000);
      changeDCPWM2(Q1*(1-(loops/1000)));      
   }
}

void delay(int delay)
{
   while(delay--);
}

void pwm_setup(void)
{
   TMOD = 0x11;//T0 and T1 in 16bit
   EA = 1;//Enable interrupts
   ET0 = 1;//Enable T0 overflow interrupts
   ET1 = 1;//Enable T1 overflow interrupts
   TR0 = 1;//Start T0
   TR1 = 1;//Start T1
}

void changeDCPWM1(double newQ1)
{
   HIGH1 = ( 65536 * 12) / CLOCK * newQ1;
   LOW1 = ( 65536 * 12) / CLOCK * (1-newQ1);
}

void changeDCPWM2(double newQ2)
{
   HIGH2 = ( 65536 * 12) / CLOCK * newQ2;
   LOW2 = ( 65536 * 12) / CLOCK * (1-newQ2);
}

void timer0/*_isr*/(void) interrupt 1 //event T0 overflow handler
/*Interrupt*/
{
   TF0 = 0;//Clear interrupt flag
   
   if(pwm1_flag) //if now PWM1 is "1"
   {
      HIGH1_temp++;//increase counts of T0 overflows
      if(HIGH1_temp >= HIGH1)     //if '1' state of PWM1 is reached
      {
         P1_1 = 0;//PWM '0'
         pwm1_flag = 0;//'cause it's '0' state now
         HIGH1_temp = 0;
      }
      //else do nthn and return to counting   
   }
   else  //if now PWM1 is "0"
   {
      LOW1_temp++;//increase counts of T0 overflows
      if(LOW1_temp >= LOW1)     //if '0' state of PWM1 is reached
      {
         P1_1 = 1;//PWM '1'
         pwm1_flag = 1;//'cause it's '1' state now
         LOW1_temp = 0;
      }
      //else do nthn and return to counting
   }
}

void timer1/*_isr*/(void) interrupt 2 //event T0 overflow handler
/*Interrupt*/
{
   TF1 = 0;//Clear interrupt flag
   
   if(pwm2_flag) //if now PWM1 is "1"
   {
      HIGH2_temp++;//increase counts of T0 overflows
      if(HIGH2_temp >= HIGH2)     //if '1' state of PWM1 is reached
      {
         P2_1 = 0;//PWM '0'
         pwm2_flag = 0;//'cause it's '0' state now
         HIGH2_temp = 0;
      }
      //else do nthn and return to counting   
   }
   else  //if now PWM1 is "0"
   {
      LOW2_temp++;//increase counts of T0 overflows
      if(LOW2_temp >= LOW2)     //if '0' state of PWM1 is reached
      {
         P2_1 = 1;//PWM '1'
         pwm2_flag = 1;//'cause it's '1' state now
         LOW2_temp = 0;
      }
      //else do nthn and return to counting
   }
}


Вот прилагаю заголовочный файл для aduc812:
Спойлер

Код: Выделить всё

/*----------
ADUC812.H

Header file for Analog Devices ADuC812 controller.
Rev.  3.0    02nd July 2007

Copyright (c) 1999 - 2007 Keil - An ARM Company
All rights reserved.
----------*/

/*  BYTE Register  */
sfr   P0        = 0x80;
sfr   SP        = 0x81;
sfr   DPL       = 0x82;
sfr   DPH       = 0x83;
sfr   DPP       = 0x84;
sfr   PCON      = 0x87;
sfr   TCON      = 0x88;
sfr   TMOD      = 0x89;
sfr   TL0       = 0x8A;
sfr   TL1       = 0x8B;
sfr   TH0       = 0x8C;
sfr   TH1       = 0x8D;
sfr   P1        = 0x90;
sfr   SCON      = 0x98;
sfr   SBUF      = 0x99;
sfr   I2CDAT    = 0x9A;
sfr   I2CADD    = 0x9B;
sfr   P2        = 0xA0;
sfr   IE        = 0xA8;
sfr   IE2       = 0xA9;
sfr   P3        = 0xB0;
sfr   IP        = 0xB8;
sfr   ECON      = 0xB9;
sfr   ETIM1     = 0xBA; //AR
sfr   ETIM2     = 0xBB;
sfr   ETIM3     = 0xC4;
sfr   EDATA1    = 0xBC;
sfr   EDATA2    = 0xBD;
sfr   EDATA3    = 0xBE;
sfr   EDATA4    = 0xBF;
sfr   WDCON     = 0xC0;
sfr   EADRL     = 0xC6;
sfr   T2CON     = 0xC8;
sfr   RCAP2L    = 0xCA;
sfr   RCAP2H    = 0xCB;
sfr   TL2       = 0xCC;
sfr   TH2       = 0xCD;
sfr   PSW       = 0xD0;
sfr   DMAL      = 0xD2;
sfr   DMAH      = 0xD3;
sfr   DMAP      = 0xD4;
sfr   ADCCON2   = 0xD8;
sfr   ADCDATAL  = 0xD9;
sfr   ADCDATAH  = 0xDA;
sfr   PSMCON    = 0xDF;
sfr   ACC       = 0xE0;
sfr   I2CCON    = 0xE8;
sfr   DCON      = 0xE8;
sfr   ADCCON1   = 0xEF;
sfr   B         = 0xF0;
sfr   ADCOFSL   = 0xF1;
sfr   ADCOFSH   = 0xF2;
sfr   ADCGAINL  = 0xF3;
sfr   ADCGAINH  = 0xF4;
sfr   ADCCON3   = 0xF5;
sfr   SPIDAT    = 0xF7;
sfr   SPICON    = 0xF8;
sfr   DAC0L     = 0xF9;
sfr   DAC0H     = 0xFA;
sfr   DAC1L     = 0xFB;
sfr   DAC1H     = 0xFC;
sfr   DACCON    = 0xFD;

/* BIT Register..... */
/* TCON */
sbit  TF1       = 0x8F;
sbit  TR1       = 0x8E;
sbit  TF0       = 0x8D;
sbit  TR0       = 0x8C;
sbit  IE1       = 0x8B;
sbit  IT1       = 0x8A;
sbit  IE0       = 0x89;
sbit  IT0       = 0x88;
/* P1 */
sbit  T2EX      = 0x91;
sbit  T2        = 0x90;
/* SCON */
sbit  SM0       = 0x9F;
sbit  SM1       = 0x9E;
sbit  SM2       = 0x9D;
sbit  REN       = 0x9C;
sbit  TB8       = 0x9B;
sbit  RB8       = 0x9A;
sbit  TI        = 0x99;
sbit  RI        = 0x98;
/* IE */
sbit  EA        = 0xAF;
sbit  EADC      = 0xAE;
sbit  ET2       = 0xAD;
sbit  ES        = 0xAC;
sbit  ET1       = 0xAB;
sbit  EX1       = 0xAA;
sbit  ET0       = 0xA9;
sbit  EX0       = 0xA8;
/* P3 */
sbit  RD        = 0xB7;
sbit  WR        = 0xB6;
sbit  T1        = 0xB5;
sbit  T0        = 0xB4;
sbit  INT1      = 0xB3;
sbit  INT0      = 0xB2;
sbit  TXD       = 0xB1;
sbit  RXD       = 0xB0;
/* IP */
sbit  PSI       = 0xBF;
sbit  PADC      = 0xBE;
sbit  PT2       = 0xBD;
sbit  PS        = 0xBC;
sbit  PT1       = 0xBB;
sbit  PX1       = 0xBA;
sbit  PT0       = 0xB9;
sbit  PX0       = 0xB8;
/* WDCON */
sbit  PRE2      = 0xC7;
sbit  PRE1      = 0xC6;
sbit  PRE0      = 0xC5;
sbit  WDR1      = 0xC3;
sbit  WDR2      = 0xC2;
sbit  WDS       = 0xC1;
sbit  WDE       = 0xC0;
/* T2CON */
sbit  TF2       = 0xCF;
sbit  EXF2      = 0xCE;
sbit  RCLK      = 0xCD;
sbit  TCLK      = 0xCC;
sbit  EXEN2     = 0xCB;
sbit  TR2       = 0xCA;
sbit  CNT2      = 0xC9;
sbit  CAP2      = 0xC8;
/* PSW */
sbit  CY        = 0xD7;
sbit  AC        = 0xD6;
sbit  F0        = 0xD5;
sbit  RS1       = 0xD4;
sbit  RS0       = 0xD3;
sbit  OV        = 0xD2;
sbit  F1        = 0xD1;
sbit  P         = 0xD0;
/* ADCCON2 */
sbit  ADCI      = 0xDF;
sbit  DMA       = 0xDE;
sbit  CCONV     = 0xDD;
sbit  SCONV     = 0xDC;
sbit  CS3       = 0xDB;
sbit  CS2       = 0xDA;
sbit  CS1       = 0xD9;
sbit  CS0       = 0xD8;
/*  I2CCON  */
sbit  MDO       = I2CCON^7;
sbit  MDE       = I2CCON^6;
sbit  MCO       = I2CCON^5;
sbit  MDI       = I2CCON^4;
sbit  I2CM      = I2CCON^3;
sbit  I2CRS     = I2CCON^2;
sbit  I2CTX     = I2CCON^1;
sbit  I2CI      = I2CCON^0;
/*  DCON  */
sbit  D1        = DCON^7;
sbit  D1EN      = DCON^6;
sbit  D0        = DCON^5;
sbit  D0EN      = DCON^3;
/* SPICON */
sbit  ISPI      = 0xFF;
sbit  WCOL      = 0xFE;
sbit  SPE       = 0xFD;
sbit  SPIM      = 0xFC;
sbit  CPOL      = 0xFB;
sbit  CPHA      = 0xFA;
sbit  SPR1      = 0xF9;
sbit  SPR0      = 0xF8;


P.S. а есть ли симулятор 8051 для keil> Признаюсь, не искал) Хочу узнать стоит ли?
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Ser60 »

Пока_без_кота писал(а):Подскажите ...

Чтобы предотвратить недоразумения укажите используемую модель МК. С точки зрения силлабовских С8051 неясно зачем вообще нужен инвертор. Настройте ногу порта под прерывание по падающему уровню и все. Но если нужен, Ваша схема с транзистором тоже сработает, не забудьте только включить внутреннюю подтяжку у пина порта. Кроме того, элементы ИЛИ-НЕ и И-НЕ превращаются в инвертор при замыкании входов. Наконец, имеется полно микросхем инверторов на дискретной логике.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение BOB51 »

По вопросам "как чего внешнего прикошачить"
"1000 и одна микроконтроллерная схема"
http://elektromehanika.org/load/0-0-1-459-20 вторая книга
http://elektromehanika.org/load/0-0-1-458-20 первая книга
:beer:
Насчет кодов/прожек работаю только с ассемблером... :dont_know:
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Ser60 писал(а):... Кроме того, элементы ИЛИ-НЕ и И-НЕ превращаются в инвертор при замыкании входов. ...

Спасибо, не знал))
Внимательно пошерстил поиск инет магазинов и нашел таки 74HC04 - 6 логических элементов "НЕ" в 1 корпусе, то что надо, только с избытком))
МК - AT89S52, Силабсы шибко дорогие для обучения, и в дипе нет((

2 BOB51
Спасибо за наводку на книги, действительно много интересного!!!

И подскажите еще такой вопрос. Почему команда jbc может не всегда сбрасывать бит после его проверки и перед переходом на метку ?
Есть кусок кода (привожу не все, просто для понимания сути):
Спойлер

Код: Выделить всё

Count_shadow    equ   10
Flag_1          equ          20h.0
Flag_2          equ          20h.1

dseg    at      8h

Counter:
   ds   1
org   21h
Stack:

cseg
   jmp   Start
org 03h
   jmp     Sensor_1
org 0Bh
   reti
org 13h
   jmp     Sensor_2
org 1Bh
   reti
org 100h

Start:
   mov     SP,#Stack

Ini:

   mov     TCON,   #00000101b
   mov     IE,     #10000101b
   clr     Flag_1
   clr     Flag_2

Main:
   mov   P0,#11111111b
   jbc   Flag_1, Up
   jbc   Flag_2, Down
   jmp   Main

Up:
   mov     P0,#00000001b
   mov     A,P0

Again_Up2:
   rl   A
   call   Del_100ms
   mov   P0,A
   jbc   Flag_2,Down
   jnb   P0.7,Again_Up2
   djnz   Counter,Again_Up2

   clr     Flag_1                  ; Приходиться вот здесь очищать флаг вручную, чтобы цикл Up не начал выполняться опять

   jmp   Main

Down:
   mov   P0,#10000000b
   mov   A,P0

Again_Down2:
   rr   A
   call   Del_100ms
   mov   P0,A
   jbc   Flag_1,Up
   jnb   P0.0,Again_Down2
   djnz   Counter,Again_Down2

   clr     Flag_2                  ; Приходиться вот здесь очищать флаг вручную, чтобы цикл Down не начал выполняться опять

   jmp   Main

Del_100ms:
   MOV   R2, #004h
   MOV   R1, #0A0h
   MOV   R0, #04Ch
   DJNZ   R0, $
   DJNZ   R1, $-4
   DJNZ   R2, $-8
   MOV   R0, #049h
   DJNZ   R0, $
   ret

Sensor_1:
   clr   EA
   setb   Flag_1
   mov   Counter,#Count_shadow
   setb   EA
   reti
   
Sensor_2:
   clr   EA
   setb   Flag_2
   mov   Counter,#Count_shadow
   setb   EA
   reti

end



Проблема в том, что в главном цикле я использую переход к ветке по команде jbc, и флаг при этом должен автоматически сбрасываться. Но он не всегда сбрасывается с первого раза, тоесть иногда (закономерности нет) совершается повторный прогон ветки, как будто флаг не сбросился. Если в конце ветки вручную сбросить флаг командой clr Flag_1(2), то все ок, ненужных повторов не наблюдается.
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение FireProoF »

Есть ли на 8051 или 8052 изменение частоты работы таймера, например, как на stm32?
P.S.aduc812

Да, и посмотрите пожалуйста правильно ли я объявил обработчики прерываний?
viewtopic.php?p=2487104#p2487104
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение BOB51 »

Пока_без_кота писал(а):И подскажите еще такой вопрос. Почему команда jbc может не всегда сбрасывать бит после его проверки и перед переходом на метку ?
...
Проблема в том, что в главном цикле я использую переход к ветке по команде jbc, и флаг при этом должен автоматически сбрасываться. Но он не всегда сбрасывается с первого раза, тоесть иногда (закономерности нет) совершается повторный прогон ветки, как будто флаг не сбросился. Если в конце ветки вручную сбросить флаг командой clr Flag_1(2), то все ок, ненужных повторов не наблюдается.


Значит где-то намутилось с наложением прерываний.
Частный случай - попытка проверить и сбросить линию порта ...
Смотреть внимательно надо... токмо завтрыть...
Да и на чем пишется/проверяется? Я только по тем прожкам проверить могу, что у меня в наличии имеются ( в начале viewtopic.php?f=62&t=94201 заявленых ) или тест-контролем по макету.

FireProoF
у 51-й частота или от системного генератора или с внешнего входа.
никто не запрещает выдать импульс на внешнюю лапку второго таймера программно (в прерывании по переполнению основного)...
8)
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Ser60 »

Пока_без_кота: Хотите микросхему только с одним или с двумя инверторами - посмотрите на другие серии. Например 74LVC1G и 74LVC2G. Насчет флагов - пока крутитесь в цикле Again_Up2, может произойти прерывание, приводящее к установке бита Flag_1.

FireProoF: правильно объявить прерывания от таймеров следует так:

Код: Выделить всё

void timer0(void) interrupt 1 //event T0 overflow handler
void timer1(void) interrupt 3 //event T1 overflow handler
void timer2(void) interrupt 5 //event T2 overflow handler

Цифра после interrupt должна соответствовать номеру прерывания в таблице
http://www.keil.com/support/man/docs/c51/c51_le_interruptfuncs.htm
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Ser60 писал(а): ... Насчет флагов - пока крутитесь в цикле Again_Up2, может произойти прерывание, приводящее к установке бита Flag_1.

Не подскажите, как лучше это продотвратить? Запрещать прерыванияв в цикле Again_Up2 нельзя((
petrenko
Друг Кота
Сообщения: 5321
Зарегистрирован: Вт фев 21, 2012 13:51:55
Откуда: Начинающий
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение petrenko »

Пока_без_кота писал(а):
Ser60 писал(а): ... Насчет флагов - пока крутитесь в цикле Again_Up2, может произойти прерывание, приводящее к установке бита Flag_1.

Не подскаж-и-ете, как лучше это пр-о-едотвратить? Запрещать прерывания_в в цикле Again_Up2 нельзя..
Вы "троллите" ,шутите или действительно не догадываетесь ? :dont_know:

Для надёжности делайте так, как если бы м.к. ничего не должен делать "автоматически" - то есть делайте сбросы и установки флажков явно командами.
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Ser60 »

Как вариант, согласно предложению выше. Только мне кажется, что Вы проблему-то уже решили по-своему:
Пока_без_кота писал(а):Если в конце ветки вручную сбросить флаг командой clr Flag_1(2), то все ок, ненужных повторов не наблюдается.


Если нет, опишите словами с максимумом подробностей чего хотите добиться. По коду (и ходу) смахивает на подавление дребезга кнопок с записью чего-то в Р0. Только пока идёт выполнение цикла Again_Up2 и если произойдёт прерывание, то переменная Counter в нём получит иное значение и цикл выполнится уже большее число раз (это важно?). При большом числе прерываний от сенсора 1 код вообще может не выдти из этого цикла. Ещё мне кажется, что флаги Flag_1 и Flag_2 в приведённом фрагменте кода дублируют биты запроса прерываний INT0 и INT1. Тогда зачем вообще нужны эти флаги? Как и вообще, зачем в данном случае нужны прерывания, если у Вас и так в цикле Main производится жёсткий polling ожидания установки флагов.

Насчёт дороговизны - учиться и следует стремиться на чём-то новом. Если хотите освоить архитектуру х51, то уж не древних Атмеловских. Силлабовские реализации архитектуры x51 одни из самых лучших в этой архитектуре, если не самые. "Разоритесь" на них и увидите, что жизнь имеет цвета. В них некоторые старые модели серии С8051F3xx всё ещё выпускаются в DIPe. А новые сажайте на макетки типа моих
Изображение
Кстати, этой весной Силлабы запустили в производство новую дешёвую серию EFM8 своих x51 моделей.
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение FireProoF »

[quote="Ser60"]

СпойлерFireProoF: правильно объявить прерывания от таймеров следует так:

Код: Выделить всё

void timer0(void) interrupt 1 //event T0 overflow handler
void timer1(void) interrupt 3 //event T1 overflow handler
void timer2(void) interrupt 5 //event T2 overflow handler

Цифра после interrupt должна соответствовать номеру прерывания в таблице
http://www.keil.com/support/man/docs/c51/c51_le_interruptfuncs.htm[
/quote]
Спасибо
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

petrenko писал(а):Вы "троллите" ,шутите или действительно не догадываетесь ? :dont_know:

Третье. Я просто хотел бы построить оптимальный алгоритм. Но раз мои костыли это и так неплохой вариант, то пускай будет.

2 Ser60
Да я просто все на макетках привык делать, травлю только если ну вообще прижмет.
Спасибо за наводку, попробую избавиться от лишних сущностей (флагов), и использовать флаги прерываний.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Для Ser60.
Опишу, чего я хочу. Это должно стать контроллером освещения лестницы. Датчики (через микросхемы логического "НЕ" (инверторы), которыми я интересовался ранее) подключены ко входам внешних прерываний. По срабатыванию датчика загораются лампочки, потом начинает бежать тень по ходу движения, потом затухание по ходу движения (если вдруг срабатывания было ложным). При срабатывании 2 датчика тень начинает бежать от него без загорания (все ведь уже и так горит). При срабатывании 1 опять от него и так далее. На случай ложного срабатывания (ну и просто, чтобы лампочки погасли, когда человек уже ушел с лестницы) и нужна переменная Count_shadow.

Попробовал вместо флагов использовать биты запросов прерываний (те которые TCON.1 и TCON.3). Впринцыпе получилось, только тип прерываний для внешних входов пришлось изменить с динамичекого (по перепаду из 1 в 0) на статический (по низкому уровню), и соответственно реакция на кнопки стала заторможенее (кнопку надо держать нажатой хотя-бы 1 секунду, чтобы направление бегущей тени изменилось, раньше достаточно было кратковременного нажатия). Но если все это дело будет управляться PIR-датчиками, как я хочу, то должно быть нормально, они все равно выдают сигнал минимум по пару секунд. И кстатии, теперь нет необходимости вручную сбрасывать биты запросов прерываний, они сами нормально сбрасываются командой jbc. Наверное это связано с тем, что я изменил тип внешних прерываний (с динамического на статический).
Также попробовал вообще без прерываний, просто постоянно опрашивая ноги, на которых висят кнопки (как Вы написали), и оно заработало !!! Причем с потребительской точки зрения я не заметил НИКАКОЙ разницы. Но я хотел задействовать прерывания "на будущее", потому что в плане есть задумка, чтобы 1 контроллер управлял 2 такими лестницами, и тут мне кажется, что я просто мозг сломаю, чтобы все делать в 1 главном цикле, поэтому я и принял такую концепцию - работу с флагами вынести в прерывания, а в основном цыкле просто запускать все в нужном порядке/направлении, соответственно выставленным флагам. Если Вы (или кто-нибудь) можете предложить мне более оптимальный алгоритм, чем я придумал, я буду очень благодарен.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Ser60 »

Мне сейчас надо уходить, но я подумаю и отпушу позже. А пока у меня вот какой вопрос: если собираетесь управлять двумя лестницами, то у Вашего МК всего 2 входа внешнего прерывания. Вам-же нужно обслужить 4 сенсора, так что опрос состояния ног может быть и тек уж и плох (?)
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Ser60 писал(а):... у Вашего МК всего 2 входа внешнего прерывания. Вам-же нужно обслужить 4 сенсора

Ну я думал подключить 2 пару сенсоров к другим ногам и параллельно ко входам прерываний, и в обработчике прерывания я проверял бы состояние нужной ноги, и делал бы вывод: если есть просто срабатывание прерывания - значит сработал сенсор 1 лестницы, если есть срабатывание прерывания и при этом нужная нога прижата к земле, значит сработал сенсор 2 лестницы)))
Но признаюсь, Вы мне очень сильно открыли глаза на то, как много можно сделать и без использования прерываний (опрос состояния нужных ног действительно неплох). Будет над чем подумать на досуге, спасибо Вам!!!
Последний раз редактировалось Пока_без_кота Вт сен 15, 2015 09:59:50, всего редактировалось 1 раз.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Ser60 »

Не уверен, что я правильно понял задачу: имеется лестница и 2 сенсора движения в обоих концах. Если свет выключен, то при срабатывании одного сенсора (человек входит на лестницу) должен бежать свет от человека до другого конца в направлении движения. Когда лестница пройдена (сработает второй сенсор), свет на ней должен выключаться в направлении тени противоположной движению. Если это не так, опишите логику подсветки подробнее.

Если так, то что должно быть если свет на лестнице включится и с другого ее конца зайдет навстречу первому другой человек? И что должно быть если человек зашел на лестницу, свет включился, но не дойдя до второго сенсора человек передумал и повернул обратно? Кстати, здесь на сайте где-то была статья об автоматизации подсветки лестницы. Детали не помню.

Я-бы такого плана алгоритм программировал на основе конечного автомата. Переходы между состояниями управляются событиями от сенсоров и истечения интервалов в 100 мс. В начале когда света нет МК спит. Как только произошла регистрация движения на одном из концов, запускается таймер 100-мс интервалов. Между интервалами МК спит, а по истечении интервалов делает то, что у Вас там сейчас в цикле. Как цикл проработал определенное число раз, таймер выключается. Это, конечно, лишь наброски т.к. я не понимаю полную логику работы системы. В таком режиме МК будет гораздо меньше потреблять тока. Пока-же если у Вас он тактируется на 12 мгц и постоянно находится в активном режиме, то пожирает по ДШ около 25 мА - примерно в 10 - 20 раз больше чем современные МК на такой частоте.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Пока_без_кота »

Ser60 писал(а): ...что должно быть если свет на лестнице включится и с другого ее конца зайдет навстречу первому другой человек?
И что должно быть если человек зашел на лестницу, свет включился, но не дойдя до второго сенсора человек передумал и повернул обратно?

В идеале надо бы по 4 сенсора на каждую лестницу (по 2 на каждую сторону, тогда можно бы составить алгоритм подсчета людей в зоне (появляется возможность учета вошедших/вышедших людей). Но это все становится слишком сложно, я решил делать проще. Лестница должна подстраиватся под ПОСЛЕДНИЙ сработавший сенсор. Это самый простой из универсальных алгоритмов. При этом алгоритме невозможна ситауция, что человек вошел, а контроллер подумал, что он вышел и все потушил. Лестница подстраивается под последнего вошедшего, ведь ему дольше всего по ней идти (при условии одинаковой скорости конечно :)) ) То что лесница думает, что человек вошел, когда он на самом деле вышел не очень плохо, мне в принцыпе пофиг что там будет за спиной, когда я оттуда уйду :))) Немного дискомфортно (подумаешь, тень бежит навстречу, и то, только если ты идешь следом за вышедшим, что бывает примерно в 50% случаев) будет тому человеку, что остался после меня, но это редкий случай, и я думаю им можно принебречь, помня про экономию 2 датчиков движения, места и проводов для них, а также уйму времени на написание и отладку кода для такого сложного (и все равно не безглючного) алгоритма.
Впринцыпе к этой части алгоритма у меня претензий и нет, я просто ещу, как это все правильнее реализовать, учитывая, что в будущем контроллеру придется управлять 2 такими лестницами. И вот тут я просто не представляю, как он будет одновременно (точнее псевдоодновременно) обрабатывать 2 потока, я такого еще никогда не делал.
До спользования внешних прерываний для датчиков, я уже пробовал делать опрос датчиков движения по таймеру. И это тоже работало (2 таких контроллера на Мега8 сделал для одного знакомого моего друга, уже больше года жалоб от него нет, хотя специально просил его сообщать мне о малейших глюках).
И сейчас, разрабатывая аналогичный контроллер на MCS-51, я просто решил специально поэкспериментировать, чтобы больше научиться, и поставил перед собой задачу "1 контроллер - 2 лестницы", тем более что ног у AT89S52 просто куча, людям будет дешевле обходиться (почти в раза меньше всех деталей).
Потребление мне впринцыпе пока безразлично, устройство будет работать от сети 220В, и его потребление меркнет на фоне потребления ламп, которыми оно будет управлять. Когда доведу до ума саму идею, можно будет думать надо потреблением.
Про конечные автоматы читал вскользь, надо будет таки более углубленно поизучать.
Ответить

Вернуться в «Разные вопросы по МК»