Форум за електроника Форуми Форум за електроника

Форум за електроника
Български форум за електроника, ремонти, схеми, документация
 
 Въпроси/ОтговориВъпроси/Отговори   ТърсенеТърсене   ГрупиГрупи   Регистрирайте сеРегистрирайте се 
 ПрофилПрофил   Влезте, за да видите съобщенията сиВлезте, за да видите съобщенията си   ВходВход 

Service Manual Search :   Enhanced by: Jabse.com : българската търсачка
Въпрос за банките памет на PIC16F877A
Иди на страница Предишна  1, 2, 3, 4, 5  Следваща
 
Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Общи приказки - Just talking
Предишната тема :: Следващата тема  
Автор Съобщение
Комбинатор
Опитен потребител
Опитен потребител


Регистриран на: 31 Окт 2007
Мнения: 310

МнениеПуснато на: Сря Фев 27, 2008 12:04    Заглавие: Отговорете с цитат

Препълването на стека става и когато,
има 2 вложени call команди а е излязъл от тях с
един return едно goto. (след определен брой преминавания през циклите и ето ти препълванети)
За повторяеми еднакви програмни кода има макроси,
да замества. А вместо да връща 0 и 1 , за да вижда условия
,аз си правя това с флагове.
дефинирам си байт и в него имам 8 флага.
един бит ми е за "ok" , "eror" .......
Така ще може по всяко едно време да проверява, и да вижда резултат.
Примерно :
проверява порт по време на някакво условие.
ако порта е вдигнат в продължение на това условие
си сетва флаг port_ok , довържва си проверките
след това според флага port_ok си взима другите решения ......
въпрос на навик.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
emil74
Опитен потребител
Опитен потребител


Регистриран на: 16 Мар 2007
Мнения: 1106

МнениеПуснато на: Сря Фев 27, 2008 21:48    Заглавие: Отговорете с цитат

Ето част от кода:
;--------------------------------------------
Set_SYM2
movf PORTB,w
movwf ASSIGN_BUFFER ;Zapi6i PORTB kato adres na reda
movf ASSIGN_BUFFER,w
xorlw B'00000000'
btfsc STATUS,Z
goto ENDING ;Ne, kraj na priemaneto

bsf BUSY
incf SYM_COUNTER,f
movf ASSIGN_BUFFER,w
BSF STATUS,5 ;
movwf SYM2
bcf STATUS,5
bcf BUSY

call Check_Line
;---------------------------------------------

Set_SYM3
movf PORTB,w
movwf ASSIGN_BUFFER ;Zapi6i PORTB kato adres na reda
movf ASSIGN_BUFFER,w
xorlw B'00000000'
btfsc STATUS,Z
goto ENDING ;Ne, kraj na priemaneto

bsf BUSY
incf SYM_COUNTER,f
movf ASSIGN_BUFFER,w
BSF STATUS,5 ;
movwf SYM3
bcf STATUS,5
bcf BUSY

call Check_Line
;---------------------------------------------------

Искам да намаля това:

movf ASSIGN_BUFFER,w
xorlw B'00000000'
btfsc STATUS,Z
goto ENDING ;Ne, kraj na priemaneto

Имам го 160 пъти!!!
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
Комбинатор
Опитен потребител
Опитен потребител


Регистриран на: 31 Окт 2007
Мнения: 310

МнениеПуснато на: Сря Фев 27, 2008 23:31    Заглавие: Отговорете с цитат

На пръв поглед,

movf PORTB,w
movwf ASSIGN_BUFFER
movf ASSIGN_BUFFER,w ;ТОЗИ РЕД Е ИЗЛИШЕН
xorlw B'00000000'
btfsc STATUS,Z

А за намаляне на кода е малко трудно да се каже,
едно call не би изменило много ситуацията.
Трябвало е да направиш кода с пойнтване на SYM... n пъти
Ако имаш n на брой SYM да индексираш масив.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Niakoi
Опитен потребител
Опитен потребител


Регистриран на: 20 Авг 2006
Мнения: 350
Местожителство: Каръктаун

МнениеПуснато на: Чет Фев 28, 2008 0:09    Заглавие: Отговорете с цитат

emil74 написа:
Ето част от кода:


Искам да намаля това:

movf ASSIGN_BUFFER,w
xorlw B'00000000'
btfsc STATUS,Z
goto ENDING ;Ne, kraj na priemaneto

Имам го 160 пъти!!!

Махни това:
xorlw B'00000000'
и пак ще ти стане проверката...
_________________
Жица, на която не виждам двата края, не я пипам!
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
woodoman
Активен потребител
Активен потребител


Регистриран на: 03 Яну 2008
Мнения: 67

МнениеПуснато на: Чет Фев 28, 2008 12:55    Заглавие: Отговорете с цитат

Доколкото разбрах SYM_COUNTER ти показва коя сума ще инициализираш следващия път. Друго което ме интересува е всички суми една след друга ли се инициализират. Или между тях имаш друг код. Защото ако е така мисля, че може значително да се намали кода.
_________________
Нека да си помагаме взаимно. Защото ако не си помогнем ние няма кой да ни помогне.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
Комбинатор
Опитен потребител
Опитен потребител


Регистриран на: 31 Окт 2007
Мнения: 310

МнениеПуснато на: Чет Фев 28, 2008 14:20    Заглавие: Отговорете с цитат

incf SYM_COUNTER,f
f-константа (0 или 1) ли е или се получава след определени условия,
предполагам че е 1.
Поразгледах кода, и все едно проверяваш PORTB дали е = 0
ако е нула го пращаш ENDING
ако е различно от 0 сетваш BUSY ,SYM_COUNTER++ (при f=1)
резултата от PORTB go пращаш в съответната банка
в променлива SYM[n]
чистиш BUSY.
Предполагам че PORTB ти приема LPT D0-D7.
Дошъл ли е момента в който променливите SYM0-SYMn
не им стига една банка от SRAM-а и отиваш в друга, щото това е още една пречка за оптимизиране на кода, не че няма да стане но нещата се усложняват доста. (Да щом кода е 160 пъти).
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
emil74
Опитен потребител
Опитен потребител


Регистриран на: 16 Мар 2007
Мнения: 1106

МнениеПуснато на: Пет Фев 29, 2008 0:02    Заглавие: Отговорете с цитат

1. SYM_COUNTER брои колко символа има в съобщението, което се изписва. Той се увеличава при всеки приет символ.
По протокола, след приемане на 0x00, приемането спира и се влиза в програмата за изписване на текста. SYM_COUNTER, се променя само докато се приема текстът. В подпрограмата за изобразяване неговата стойност се записва в друг работен буфер (WORK_BUFFER), който се намалява с 1 при всеки подаден за изобразяване символ. Нулиране на работния буфер означава, че е предадено цялото съобщение. Тогава се активира подпрограма за осигуряване на определено свободно поле, преди отново да се започне с предаване на същия текст. Отново се зарежда SYM_COUNTER в WORK_BUFFER и всичко се повтаря, докато не постъпи заявка за прекъсване от PORTB. Понеже не е удачно да се прекрати съобщението по средата, тази заявка не е реализирана с разрешение за прекъсване от порта в класическия смисъл, а се състои в една проверка, извършвана само след като се превърти целият текст.

2. ДА, f e 1.

3. ДА, PORTB приема LPT1, pin2-9 (D0-7)
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Посетете сайта на потребителя
Комбинатор
Опитен потребител
Опитен потребител


Регистриран на: 31 Окт 2007
Мнения: 310

МнениеПуснато на: Пет Фев 29, 2008 10:58    Заглавие: Отговорете с цитат

Значи на мен ми е по трудно да чета готови кодове , отколкота да си ги пиша.
Ако твърдо си решил асемблер. Мога да ти испратя руски вариант на
книгата за PIC на Предко.
Ако решиш да опиташ някои C компилатор имам последната версия на MIKROELEKTRONIKA и предпоследната на CCS PCWHD 4.065
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
woodoman
Активен потребител
Активен потребител


Регистриран на: 03 Яну 2008
Мнения: 67

МнениеПуснато на: Пет Фев 29, 2008 12:55    Заглавие: Отговорете с цитат

Здравей. Ако правилно съм разбрал при включване на устройството то започва да изпиства символите записани в паметта. Като след всеко изписване прави проверка дали има заявка за записване на нови данни. Ако няма започва отново извеждането на надписа. Ако има спира извеждането е се прехвърля в програма за приемане. Докато не се приеме символ Н'00' не излиза от подпрограмата и не изписва нищо. При приемане на Н'00' се връща в основната и започва извеждането. Ако е така ще ти предложа един код за зареждане на данните.

SYM
BSF STATUS,7
MOVLW 0x20
MOVWF SYMADR
SYM1
<ТУК ПОСТАВЯШ ПРОВЕРКАТА ДАЛИ Е ИЗПРАТЕН СИМВОЛА ОТ РС>
BSF BUSY,0
MOVF SYMADR,W
MOVWF FSR
MOVF PORTB,W
MOVWF INDF
XORLW B'00000000'
BTFSC STATUS,Z
GOTO A1
INCF SYM_COUNTER,F
INCF SYMADR,F
BTFSC STAT,0
GOTO A2
MOVFW SYMADR
XORLW 0x70
BTFSS STATUS,Z
GOTO A3
MOVLW 0x30
ADDWF SYMADR
BSF STAT,0
GOTO A3
A2
MOVFW SYMADR
XORLW 0xF0
BTFSC STATUS,Z
GOTO A1
A3
BCF BUSY,0
GOTO SYM1
A1
BSF STAT,1
BCF STAT,0
RETURN

Където регистър SYMADR съдържа адреса на кледката в която ще се записва. Използвал съм адресите от 120 до 16F на Банка2 и от 1А0 до 1EF на Банка3. Така се постига по голяма компактнос на програмата.
Регистър STAT съдържа битфлагове. Бит0 показва в коя банка се работи в момента 0-Банка2, 1-Банка3. Бит1 показва че опирацията е преключила поради приемане на код Н'00' или са свършели адресите за приемане. Разбрах че ще приемаш 160 символа макс.
Неразбрах закакво ползваш Chek_Line.
Smile
Ако има нещо друго питай.
_________________
Нека да си помагаме взаимно. Защото ако не си помогнем ние няма кой да ни помогне.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла
Комбинатор
Опитен потребител
Опитен потребител


Регистриран на: 31 Окт 2007
Мнения: 310

МнениеПуснато на: Пет Фев 29, 2008 13:24    Заглавие: Отговорете с цитат

Това е единственото решение за големи масиви които са извън
рамките на една банка има WRITE в масива и read масива.
Фактически масивите са 3 но се четът и пишат като един.
мисля че друг начин няма
Имаш възможност да наредиш 160 знака
CCS PCM C Compiler, Version 4.065, 55393 29-02-08 14:20

Filename: main.lst

ROM used: 222 words (3%)
Largest free fragment is 2048
RAM used: 192 (52%) at main() level
199 (54%) worst case
Stack: 1 locations

*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 065
0003: NOP
.................... #include "C:\AtTiny26\Example\16F877\main.h"
.................... #include <16F877.h>
.................... //////// Standard Header file for the PIC16F877 device ////////////////
.................... #device PIC16F877
.................... #list
....................
.................... #device adc=8
....................
.................... #FUSES NOWDT //No Watch Dog Timer
.................... #FUSES RC //Resistor/Capacitor Osc with CLKOUT
.................... #FUSES NOPUT //No Power Up Timer
.................... #FUSES NOPROTECT //Code not protected from reading
.................... #FUSES BROWNOUT //Reset when brownout detected
.................... #FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
.................... #FUSES NOCPD //No EE protection
.................... #FUSES NOWRT //Program memory not write protected
.................... #FUSES NODEBUG //No Debug mode for ICD
....................
.................... #use delay(clock=20000000)
....................
....................
....................
.................... #define BUFFSIZE 60
.................... byte buffer1[BUFFSIZE],buffer2[BUFFSIZE],buffer3[BUFFSIZE];
....................
....................
.................... void write_buffer(char * index, char value) {
.................... if(index<BUFFSIZE)
0004: BSF 03.6
0005: MOVF 52,F
0006: BTFSS 03.2
0007: GOTO 015
0008: MOVF 51,W
0009: SUBLW 3B
000A: BTFSS 03.0
000B: GOTO 015
.................... buffer1[index]=value;
000C: MOVLW 20
000D: ADDWF 51,W
000E: MOVWF 04
000F: BCF 03.7
0010: BTFSC 52.0
0011: BSF 03.7
0012: MOVF 53,W
0013: MOVWF 00
.................... else if(index<(BUFFSIZE*2))
0014: GOTO 031
0015: MOVF 52,F
0016: BTFSS 03.2
0017: GOTO 028
0018: MOVF 51,W
0019: SUBLW 77
001A: BTFSS 03.0
001B: GOTO 028
.................... buffer2[index%BUFFSIZE]=value;
001C: MOVWF 54
001D: MOVF 7A,W
001E: MOVWF 55
001F: MOVLW A0
0020: ADDWF 54,W
0021: MOVWF 04
0022: BCF 03.7
0023: BTFSC 55.0
0024: BSF 03.7
0025: MOVF 53,W
0026: MOVWF 00
.................... else
0027: GOTO 031
.................... buffer3[index%BUFFSIZE]=value;
0028: MOVWF 54
0029: MOVF 7A,W
002A: MOVWF 55
002B: MOVLW 10
002C: ADDWF 54,W
002D: MOVWF 04
002E: BSF 03.7
002F: MOVF 53,W
0030: MOVWF 00
.................... }
0031: BCF 03.6
0032: RETLW 00
....................
.................... char read_buffer(char * index) {
.................... if(index<BUFFSIZE)
0033: BSF 03.6
0034: MOVF 52,F
0035: BTFSS 03.2
0036: GOTO 045
0037: MOVF 51,W
0038: SUBLW 3B
0039: BTFSS 03.0
003A: GOTO 045
.................... return(buffer1[index]);
003B: MOVLW 20
003C: ADDWF 51,W
003D: MOVWF 04
003E: BCF 03.7
003F: BTFSC 52.0
0040: BSF 03.7
0041: MOVF 00,W
0042: MOVWF 78
0043: GOTO 063
.................... else if(index<(BUFFSIZE*2))
0044: GOTO 063
0045: MOVF 52,F
0046: BTFSS 03.2
0047: GOTO 059
0048: MOVF 51,W
0049: SUBLW 77
004A: BTFSS 03.0
004B: GOTO 059
.................... return(buffer2[index%BUFFSIZE]);
004C: MOVWF 53
004D: MOVF 7A,W
004E: MOVWF 54
004F: MOVLW A0
0050: ADDWF 53,W
0051: MOVWF 04
0052: BCF 03.7
0053: BTFSC 54.0
0054: BSF 03.7
0055: MOVF 00,W
0056: MOVWF 78
0057: GOTO 063
.................... else
0058: GOTO 063
.................... return(buffer3[index%BUFFSIZE]);
0059: MOVWF 53
005A: MOVF 7A,W
005B: MOVWF 54
005C: MOVLW 10
005D: ADDWF 53,W
005E: MOVWF 04
005F: BSF 03.7
0060: MOVF 00,W
0061: MOVWF 78
0062: GOTO 063
.................... }
0063: BCF 03.6
0064: RETLW 00
....................
....................
....................
....................
....................
....................
....................
.................... void main()
.................... {
0065: CLRF 04
0066: BCF 03.7
0067: MOVLW 1F
0068: ANDWF 03,F
0069: BSF 03.5
006A: BSF 1F.0
006B: BSF 1F.1
006C: BSF 1F.2
006D: BCF 1F.3
.................... char * i;
.................... char c;
.................... setup_adc_ports(NO_ANALOGS);
*
0071: BSF 03.5
0072: BSF 1F.0
0073: BSF 1F.1
0074: BSF 1F.2
0075: BCF 1F.3
.................... setup_adc(ADC_OFF);
0076: BCF 03.5
0077: BCF 1F.0
.................... setup_psp(PSP_DISABLED);
0078: BSF 03.5
0079: BCF 09.4
.................... setup_spi(SPI_SS_DISABLED);
*
006E: MOVLW FF
006F: BCF 03.5
0070: MOVWF 5C
*
007A: BCF 03.5
007B: BCF 14.5
007C: BCF 5C.5
007D: MOVF 5C,W
007E: BSF 03.5
007F: MOVWF 07
0080: BCF 03.5
0081: BSF 5C.4
0082: MOVF 5C,W
0083: BSF 03.5
0084: MOVWF 07
0085: BCF 03.5
0086: BCF 5C.3
0087: MOVF 5C,W
0088: BSF 03.5
0089: MOVWF 07
008A: MOVLW 01
008B: BCF 03.5
008C: MOVWF 14
008D: MOVLW 00
008E: BSF 03.5
008F: MOVWF 14
.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
0090: MOVF 01,W
0091: ANDLW C7
0092: IORLW 08
0093: MOVWF 01
.................... setup_timer_1(T1_DISABLED);
0094: BCF 03.5
0095: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1);
0096: MOVLW 00
0097: MOVWF 78
0098: MOVWF 12
0099: MOVLW 00
009A: BSF 03.5
009B: MOVWF 12
....................
....................
.................... // TODO: USER CODE!!
.................... write_buffer(150,0xAA);
009C: BCF 03.5
009D: BSF 03.6
009E: CLRF 52
009F: MOVLW 96
00A0: MOVWF 51
00A1: MOVLW AA
00A2: MOVWF 53
00A3: BCF 03.6
00A4: CALL 004
.................... c=read_buffer(150);
00A5: BSF 03.6
00A6: CLRF 52
00A7: MOVLW 96
00A8: MOVWF 51
00A9: BCF 03.6
00AA: CALL 033
00AB: MOVF 78,W
00AC: BSF 03.6
00AD: MOVWF 4E
.................... do {
.................... i=0;
00AE: CLRF 4D
00AF: CLRF 4C
....................
.................... c=input_b();
00B0: MOVLW FF
00B1: BSF 03.5
00B2: BCF 03.6
00B3: MOVWF 06
00B4: BCF 03.5
00B5: MOVF 06,W
00B6: BSF 03.6
00B7: MOVWF 4E
.................... write_buffer(i++,c);
00B8: MOVF 4D,W
00B9: MOVWF 7A
00BA: MOVF 4C,W
00BB: INCF 4C,F
00BC: BTFSC 03.2
00BD: INCF 4D,F
00BE: MOVWF 4F
00BF: MOVF 7A,W
00C0: MOVWF 50
00C1: MOVWF 52
00C2: MOVF 4F,W
00C3: MOVWF 51
00C4: MOVF 4E,W
00C5: MOVWF 53
00C6: BCF 03.6
00C7: CALL 004
.................... c=read_buffer(i++);
00C8: BSF 03.6
00C9: MOVF 4D,W
00CA: MOVWF 7A
00CB: MOVF 4C,W
00CC: INCF 4C,F
00CD: BTFSC 03.2
00CE: INCF 4D,F
00CF: MOVWF 4F
00D0: MOVF 7A,W
00D1: MOVWF 50
00D2: MOVWF 52
00D3: MOVF 4F,W
00D4: MOVWF 51
00D5: BCF 03.6
00D6: CALL 033
00D7: MOVF 78,W
00D8: BSF 03.6
00D9: MOVWF 4E
....................
.................... } while(c);
00DA: MOVF 4E,F
00DB: BTFSS 03.2
00DC: GOTO 0AE
.................... }
00DD: SLEEP

Configuration Fuses:
Word 1: 3FFB RC NOWDT NOPUT NOPROTECT BROWNOUT LVP NOCPD NOWRT NODEBUG
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Потърси "Въпрос за банките памет на PIC16F877A" в магазин за електроника Pulsator.bg : БЕЗПЛАТНА ДОСТАВКА над 90 лв.

Покажи мнения от преди:   
Потърси "Въпрос за банките памет на PIC16F877A" в Интернет



Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Общи приказки - Just talking Часовете са според зоната GMT + 2 Часа
Иди на страница Предишна  1, 2, 3, 4, 5  Следваща
Страница 4 от 5

 
Към:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети