Страница 7 из 15

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср апр 06, 2011 18:12:26
Gudd-Head
Chip115 писал(а):да. вылечен. мне больше 2 к не давал :(
Вы точно не путаете флэш с ОЗУ?

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср апр 06, 2011 19:02:29
Chip115
я уже не знаю что с чем путать. Окончательно запутался
1.3. Встроенная память
CIP-51 имеет стандартную (8051) структуру адресного пространства памяти программ и данных. В
состав памяти входит ОЗУ данных объемом 256 байт, старшие 128 байт которого имеют двойную
конфигурацию. В режиме косвенной адресации осуществляется доступ к старшим 128 байтам ОЗУ общего
назначения, а в режиме прямой адресации осуществляется доступ к 128 байтам адресного пространства
регистров специального назначения (SFR). Младшие 128 байт ОЗУ доступны как для прямой, так и для
косвенной адресации. Из них первые 32 байта адресуются как четыре банка регистров общего назначения, а
следующие 16 байт могут адресоваться как побайтно, так и побитно.
Память программ МК состоит из 32 Кбайт (‘F410/1) или 16 Кбайт (‘F412/3) Flash-памяти. Эта память
может перепрограммироваться внутрисистемно секторами по 512 байт, не требуя при этом специального
внешнего напряжения программирования.

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср апр 06, 2011 20:12:07
Gudd-Head
Ух ты... Где это такое окошечко настроек?
И что выдаёт компилятор?

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Чт апр 07, 2011 17:41:21
Chip115
нужна помощь в асме. я там колом.
имеется стартап

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

$NOMOD51
;------------------------------------------------------------------------------
;  This file is part of the C51 Compiler package
;  Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
;  Version 8.01
;
;  *** <<< Use Configuration Wizard in Context Menu >>> ***
;------------------------------------------------------------------------------
;  STARTUP.A51:  This code is executed after processor reset.
;
;  To translate this file use A51 with the following invocation:
;
;     A51 STARTUP.A51
;
;  To link the modified STARTUP.OBJ file to your application use the following
;  Lx51 invocation:
;
;     Lx51 your object file list, STARTUP.OBJ  controls
;
;------------------------------------------------------------------------------
;
;  User-defined <h> Power-On Initialization of Memory
;
;  With the following EQU statements the initialization of memory
;  at processor reset can be defined:
;
; <o> IDATALEN: IDATA memory size <0x0-0x100>
;     <i> Note: The absolute start-address of IDATA memory is always 0
;     <i>       The IDATA space overlaps physically the DATA and BIT areas.
IDATALEN        EQU     80H
;
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> 
;     <i> The absolute start address of XDATA memory
XDATASTART      EQU     0     
;
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> 
;     <i> The length of XDATA memory in bytes.
XDATALEN        EQU     0      
;
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> 
;     <i> The absolute start address of PDATA memory
PDATASTART      EQU     0H
;
; <o> PDATALEN: PDATA memory size <0x0-0xFF> 
;     <i> The length of PDATA memory in bytes.
PDATALEN        EQU     0H
;
;</h>
;------------------------------------------------------------------------------
;
;<h> Reentrant Stack Initialization
;
;  The following EQU statements define the stack pointer for reentrant
;  functions and initialized it:
;
; <h> Stack Space for reentrant functions in the SMALL model.
;  <q> IBPSTACK: Enable SMALL model reentrant stack
;     <i> Stack space for reentrant functions in the SMALL model.
IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.
;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
;     <i> Set the top of the stack to the highest location.
IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
; </h>
;
; <h> Stack Space for reentrant functions in the LARGE model.      
;  <q> XBPSTACK: Enable LARGE model reentrant stack
;     <i> Stack space for reentrant functions in the LARGE model.
XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.
;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
;     <i> Set the top of the stack to the highest location.
XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 
; </h>
;
; <h> Stack Space for reentrant functions in the COMPACT model.    
;  <q> PBPSTACK: Enable COMPACT model reentrant stack
;     <i> Stack space for reentrant functions in the COMPACT model.
PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.
;
;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
;     <i> Set the top of the stack to the highest location.
PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
; </h>
;</h>
;------------------------------------------------------------------------------
;
;  Memory Page for Using the Compact Model with 64 KByte xdata RAM
;  <e>Compact Model Page Definition
;
;  <i>Define the XDATA page used for PDATA variables. 
;  <i>PPAGE must conform with the PPAGE set in the linker invocation.
;
; Enable pdata memory page initalization
PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.
;
; <o> PPAGE number <0x0-0xFF> 
; <i> uppermost 256-byte address of the page used for PDATA variables.
PPAGE           EQU     0
;
; <o> SFR address which supplies uppermost address byte <0x0-0xFF> 
; <i> most 8051 variants use P2 as uppermost address byte
PPAGE_SFR       DATA    0A0H
;
; </e>
;------------------------------------------------------------------------------

; Standard SFR Symbols 
ACC     DATA    0E0H
B       DATA    0F0H
SP      DATA    81H
DPL     DATA    82H
DPH     DATA    83H

                NAME    ?C_STARTUP


?C_C51STARTUP   SEGMENT   CODE
?STACK          SEGMENT   IDATA
				
                RSEG    ?STACK
                DS      1

                EXTRN CODE (?C_START)
                PUBLIC  ?C_STARTUP

                CSEG    AT      0
?C_STARTUP:     LJMP    STARTUP1

                RSEG    ?C_C51STARTUP

STARTUP1:	 
			   	
IF IDATALEN <> 0
				
				
                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
ENDIF

IF XDATALEN <> 0
                MOV     DPTR,#XDATASTART
                MOV     R7,#LOW (XDATALEN)
  IF (LOW (XDATALEN)) <> 0
                MOV     R6,#(HIGH (XDATALEN)) +1
  ELSE
                MOV     R6,#HIGH (XDATALEN)
  ENDIF
                CLR     A
XDATALOOP:      MOVX    @DPTR,A
                INC     DPTR
                DJNZ    R7,XDATALOOP
                DJNZ    R6,XDATALOOP
ENDIF

IF PPAGEENABLE <> 0
                MOV     PPAGE_SFR,#PPAGE
ENDIF

IF PDATALEN <> 0
                MOV     R0,#LOW (PDATASTART)
                MOV     R7,#LOW (PDATALEN)
                CLR     A
PDATALOOP:      MOVX    @R0,A
                INC     R0
                DJNZ    R7,PDATALOOP
ENDIF

IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)

                MOV     ?C_IBP,#LOW IBPSTACKTOP
ENDIF

IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)

                MOV     ?C_XBP,#HIGH XBPSTACKTOP
                MOV     ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF

IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
                MOV     ?C_PBP,#LOW PBPSTACKTOP
ENDIF

                MOV     SP,#?STACK-1

; This code is required if you use L51_BANK.A51 with Banking Mode 4
;<h> Code Banking
; <q> Select Bank 0 for L51_BANK.A51 Mode 4
#if 0   
;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
EXTRN CODE (?B_SWITCH0)
                CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0
#endif
;</h>
                LJMP    ?C_START

                END

нужно куда нить воткнуть что бы работало вот это

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

ANL  PCA0MD,    #0BFh
MOV  PCA0MD,    #000h
Это типа отключается вочдог таймер.
А на счет того окна это Flash/Configure flash tolls.../Tagerts

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Чт апр 07, 2011 19:17:08
Gudd-Head
Ё-моё, что это за жесть? Что за стартап такой?
"Flash/Configure flash tolls.../Tagerts" что-то у меня нет такого... :dont_know:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Пт апр 08, 2011 02:27:30
Chip115
как нет? у меня кеил микровижн 4. можно еще через targets options
а этот старт ап сгенерирован кейлом при создании нового проекта.

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Пт апр 08, 2011 16:33:34
Chip115
Все. проблема решена. Дело было в том что массивы долго забивались и вочдог срабатывал. При сбросе воча в стартапе проблема исчезла. Буду мучить микру дальше :)

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Пн апр 18, 2011 06:38:43
Paguo-86PK
А какая DemoBoard с PIC+ADC+DAC мне подойдёт, чтобы всё дёшего, сердито, но хватало на организацию линии задержки видеокадра через магазинное ОЗУ? АЦП/ЦАП подойдёт и с малой (4-8) разрядностью. Главное, чтобы можно было задержать поток от 1/512 строки до 625 строк?
Это необходимо к теме OSD/OSM.

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср апр 20, 2011 16:47:02
Chip115
Можете взглянуть на настройки таймера 3?
По плану должен каждые 10мс вызывать прерывания
Интересует место, где сбрасываются флаги в подпрограмме обработки прерывания.
C8051

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

void Timer3_Init(void)
{
  TMR3CN    = 0x04;				   // òàéìåð3 â 16 áèò. ðåæèìå âêëþ÷åí. ïðåääåëèòåëü ÷àñòîòû 1:12
  EIE1      = 0x80;				   // Âêëþ÷èòü ïðåðûâàíèå îò òàéìåðà3
  TMR3L     = 0x3F;				// 06			10 ms
  TMR3H     = 0xB0;				// f8 1 ìñ

}
void Timer3_ISR (void) interrupt 14
{
	TMR3CN=TMR3CN^0xC0;			 // сбрасываем флаги TF3H TF3L
	
	if (test2==1)
	{	
		MC3PHAC_Send(cmd_FORW,sizeof(cmd_FORW));  // start
		test2=0;
	}
	 
	 
	 	
} 

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Чт апр 21, 2011 19:16:46
Gudd-Head
Chip115 писал(а):Можете взглянуть на настройки таймера 3?
Интересует место, где сбрасываются флаги в подпрограмме обработки прерывания.
И?...

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср май 25, 2011 14:14:17
Chip115
В подпрограмму обработки не переходит (
Есть еще одна проблема.
МК С8051F410 и имеется клавиатура. Проводники меж платой с МК и клавиатурой длинные,да еще собраны все в кучу. + рядом проходят импульсные высоковольтные цепи и аналогичные низковольтные.
Клава тупит в общем. Вероятнее всего наводки. т.к раньше клава срабатывала при подносе руки к шлейфу от клавиатуры. Как можно побороть зло? Перекомпоновка не получится. уж сильно маленький корпус,что бы размахнуться. И проводники короче сделать нельзя.
Хотел побороть программно.
Ввести цикл. Счетчик отсчитывает в так с мк скажем 100. И если этот счетчик дойдет до ста, значит срабатывание истинное,иначе наводка пришла. Ведь если дело в ней,то она не сможет довести этот счетчик до 100. По любому где нить просядет и заново цикл начнется.
Но почему то на практике все остается без изменений . Что не так?
Схема прилагается. Так же кусок кода опроса клавы.
массивы , которые тут юзаю и функции

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

xdata unsigned char mas[]={0x36,0x2E,0x1E,0x35,0x2D,0x1D,0x33,0x2B,0x1B};	 // массив состояний клавиатуры
char check_noise ()
{
	unsigned char nCounter=0;   				                // переменная для хранения инкремента 	
	for (nCounter=0; nCounter < NCOUNTER; nCounter++) {}
	return nCounter;
}

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

//-----------------------------------------------------------------------------
// Function for scan of keyboard
//-----------------------------------------------------------------------------
void Scan (void)
{	
	P1=0x3E;                                                       // выберем столбик для опроса на порту P 1.2
	if(P1==mas[0])						   // если нажата Dn_1
	{
	  while (P1==mas[0]) {cnoise=check_noise ();}   // проверяем на истинность срабатывания
	  if (cnoise==NCOUNTER)                                 /* если check_noise () вернула значение равное NCOUNTER, то                                            срабатывание истинное*/
	  {
		
	  } 	
	}
	if (P1==mas[1] )						   // если нажата up_1
	{
	  while (P1==mas[1]) {cnoise=check_noise ();} 
	  if (cnoise==NCOUNTER)
	  {
		
	  }	
	}	
	if (P1==mas[2])						       // если нажат сброс "Штанга"
	{
	    while (P1==mas[2]) {cnoise=check_noise ();} 
	  if (cnoise==NCOUNTER)
	  {
		
	   }
	}	

	P1=0x3D;                                                       // выберем столбик для опроса на порту P 1.1
	if(P1==mas[3] )						   // если нажата Dn_0
	{
	  while (P1==mas[3]) {cnoise=check_noise ();} 
	  if (cnoise==NCOUNTER)
	  {
				
		} }
	}
	if (P1==mas[4])						   // If press  up_0   .
	{
		while (P1==mas[4]) {cnoise=check_noise ();} 
	  if (cnoise==NCOUNTER)
	  {
		
	   } 
	}
	if (P1==mas[5]&flag_1==0)						   // если нажата res_t			.
	{
		while (P1==mas[5]) {cnoise=check_noise ();} 
	  if (cnoise==NCOUNTER)
	  {
		
	  }
	}	

	P1=0x3B;                                                       // выберем столбик для опроса на порту P 1.0
	if(P1==mas[6])						   //  если нажат стоп
	{
		while (P1==mas[6]) {cnoise=check_noise ();} 
	  if (cnoise==NCOUNTER)
	  {
		
	  }						   
	}
	if (P1==mas[7] )						   //  если нажат старт
	{
	  while (P1==mas[7]) {cnoise=check_noise ();} 
	  if (cnoise==NCOUNTER)
	  {
		
	   }	
	}
	if (P1==mas[8])						   // если нажат  s/l 
	{
	   while (P1==mas[8]) {cnoise=check_noise ();} 
	   if (cnoise==NCOUNTER)
	  {
	   
           }		
	
	}  
	
}
схема
Изображение

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср май 25, 2011 14:31:59
Gudd-Head
Chip115 писал(а):Проводники меж платой с МК и клавиатурой длинные,да еще собраны все в кучу. + рядом проходят импульсные высоковольтные цепи и аналогичные низковольтные.
Экранирование, витая пара, сдвоенные дроссели и т.п.. В общем, наверняка можно что-то придумать.

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср май 25, 2011 14:44:31
МитяРа
Chip115 писал(а):Есть еще одна проблема.
Ты пробовал, как мя те посоветовал сканировать единицей и повесить на обратные линии по 2.4кОм на землю?

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср май 25, 2011 14:59:19
Chip115
МитяРа писал(а):
Chip115 писал(а):Есть еще одна проблема.
Ты пробовал, как мя те посоветовал сканировать единицей и повесить на обратные линии по 2.4кОм на землю?
нет. я тока перенес тему сюда. Сча от универа отойду и за паяльник сяду ) Попробую )

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср май 25, 2011 15:06:49
МитяРа
Chip115 писал(а):Попробую )
Была у мя классная книжка издательства Бином "Справочник по ОМЭВМ", там очень хорошо описано со схемами сканирование клавиатуры..
Если не найдёшь, могу прислать по почте...

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср май 25, 2011 15:08:12
Chip115
МитяРа писал(а):
Chip115 писал(а):Попробую )
Была у мя классная книжка издательства Бином "Справочник по ОМЭВМ", там очень хорошо описано со схемами сканирование клавиатуры..
Если не найдёшь, могу прислать по почте...
она?

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср май 25, 2011 15:14:00
МитяРа
Chip115 писал(а):она?
Угу.. Хорошая книжка про классику..
Только сразу предупрежу, там очепятки встречаются..
Из-за одной такой, мя неделю не мог понять, почему прога неправильно работает..

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср май 25, 2011 15:21:03
Chip115
Буду внимателен ) И еще... Единицами не получится опрашивать...у меня диоды стоят,а выпаивать их не благодарное дело. Не факт что поможет, а возни куча. много времени убью. Монтаж через опу. пол установки надо разобрать (((

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср май 25, 2011 15:53:49
МитяРа
Chip115 писал(а):у меня диоды стоят,
Мя про диоды те ничего не говорил. Почему ты решил, что их выпаивать надо..
Надо поставить три сопротивления на корпус и изменить алгоритм на сканирование единицей..

P.S А диоды стоят для того, что-бы порты не вышибло при нажатии нескольких клавиш.. :wink:

Вот посмотри, это страничка из этой книги:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Добавлено: Ср май 25, 2011 16:54:01
Chip115
Блин. я нуб . У меня (по моей проге) нули перебираю по 0 1 2, а считываю состояние с 3 4 5... это же не верно? Должно быть на оборот...с диодов считывать . так?