Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблеми със състоянието на PORTD при PIC16F874A
http://mcu-bg.com/mcu_site/viewtopic.php?f=2&t=2425
Страница 1 от 2

Автор:  Ugeen [ Пон Май 29, 2006 10:01 am ]
Заглавие:  Проблеми със състоянието на PORTD при PIC16F874A

Колеги,съгласен съм с критиките които прочетох по адрес на PIC-овете,даже и в момента работя по един проект който ми взе здравето.Ползваm PIC16f874A.На D0 и D1 имам закачено софтуерно i2c. Другите изводи на PORTD управляват светодиоди за индикация на разни състояния. Програмата я писах на MikroC.Състоянието на диодите се опреснява на всяко завъртане на програмата,като преди това се чете от DS1307 по i2c.Проблема е ,че диодите ми светят постоянно ,даже и когато не трябва.Когато забраня четенето от часовника,всичко си е наред и диодите си работят както трябва.Опитах се да съхранявам PORTD и TRISD във временни клетки преди да чета часовника по i2c и след четенето да ги възстановя но нищо не се получава.Знам че ако има входове и изходи на един PORT при тези контролери има големи проблеми,но аз нямам избор защото ми е натоварен процесора.Имате ли идеи как да се справя с този проблем.

Автор:  [ Пон Май 29, 2006 11:30 am ]
Заглавие: 

Странен ми се вижда този проблем. Почти никога не съм имал проблем с входове и изходи на един и същи порт, а преди PIC16F874(A) дълго време съм използвал и PIC16C74(A), та се учудвам че едни светодиоди могат да създадат проблем. По логично ми се вижда грешката да е в твоят програма, но без сорс не може да се коментира.

Автор:  milenjs [ Пон Май 29, 2006 12:07 pm ]
Заглавие: 

Или в компилатора... - огледай асм кода за да видиж какво прави с портовете. Аз лично винаги търся грешката първо в програмата си, процесора си е железен едва ли той ти образува нерви...

Автор:  evc [ Пон Май 29, 2006 1:25 pm ]
Заглавие: 

Постни малко код и най-вече тази част, която се обръща към PORTD. Софтуерното i2c сам ли си го писал или използваш библиотеката на MikroC-то?

Автор:  Ugeen [ Пон Май 29, 2006 2:19 pm ]
Заглавие: 

Ползвам готова библиотека на МикроС и много ме съмнява че тя ми порти цялата работа.Иначе i2c-то работи.Като го забраня всичко се оправя и диодите си светят както трябва,а иначе светят постоянно.
този модул е I2C-то.Всъщност I2C-то е на 5 и 6 бит от порта.

void READ_RTC(void)
{
Soft_I2C_Config(&PORTD, 5, 6);
Soft_I2C_Start();
Soft_I2C_Write(0xd0);
Soft_I2C_Write(Address);
Soft_I2C_Start();
Soft_I2C_Write(0xd1);
Data=Soft_I2C_Read(0);
Soft_I2C_Stop();
}
//
//
//
//
// Декодира данните от клетка Event_temp в която е записана информация кои диоди да //светят, ако е съвпаднало времето от часовника с предварително зададен масив от //константи с времена и събития
void Decode(void)
{
TRISD=0xe0 ;
Current_hour=Event_temp&0x07;//current hour
if(PORTB.f7==0) {PORTD.f0=0; PORTD.f1=1; } else {PORTD.f0=1; PORTD.f1=0; }
if(Event_temp.f3==0) PORTD.f2=1; else PORTD.f2=0;//second bell
if(Event_temp.f4==0) PORTD.f3=1; else PORTD.f3=0;//first bell

}
//
//
//
void main(void)
{
PORTA=0x00;
TRISA=0x00;
PORTB=0x00;
TRISB=0x80;
PORTC=0xff;
TRISC=0x00;
TRISD=0xe0;
PORTD=0x00;
PORTE=0x00;
TRISE=0x00;



while (1)
{
Address=0x00;
READ_RTC();
Sec=Data;
Address++;
READ_RTC();
Min=Data;
Address++;
READ_RTC();
Hour=Data;
//
Compare();//Сравнява сек.,мин.и час с предварително зададени константи и ако //има съвпадение записва данни в клетка Event_temp.(Работи коректно не нужно да го описвам и него ,че много стана)
Decode();
}
}





Когато не се изпълнява модула READ_RTC(); и задам на клетките Hour Min и Sec твърди стойности диодите си работят съгласно събитието зададено в Event_temp,иначе светят постоянно.Часовника се чете ,бях сложил и седемсегментна индикация ,която показваше времето и всичко си е точно,не мога да разбера какво става.

Автор:  [ Пон Май 29, 2006 4:09 pm ]
Заглавие: 

Не можеш ли от листинга на асемблера нещо да постнеш ? Така не става ясно какво бърника I2C кода на MikroC .

Автор:  evc [ Пон Май 29, 2006 4:26 pm ]
Заглавие: 

Библиотеките са им компилирани предварително и асемблерския код мисля не може да се види! Но на мен повече ми прилича на омазана комуникация между часовника и процесора. Не се разбират, а не виждам проверки за акнолидж.

Автор:  setoy [ Пон Май 29, 2006 4:46 pm ]
Заглавие: 

Нее... единственото хубаво нещо в тоя компилатор е че произвежда доста четим асемблерски код. Верно че библиотеките са компилирани, но той прави и asm.

Автор:  Ugeen [ Пон Май 29, 2006 5:56 pm ]
Заглавие: 

Не бих казал че асемблера на този компилатор е четим.Много особени подходи има за готовите библиотеки.Опитах се да го погледна но такава каша е генерирало, че се омотах тотално,въпреки че 5 години съм писал на асемблер и то доста по-сложни програми от тази.Веднъж имах подобен проблем с 16F84 .Бях закачил на порта анодите на динамична индикация и в същото време на порта имаше входове.Винаги когато се четеше вход ми нулираше изходите и индикацията гаснеше.Бях намерил писано по този въпрос,но сега не успях да открия това което четох.Не си и спомням как реших проблема тогава,но се сещам че бях се преборил с този проблем и то доста по сложен начин.Сега се обръщам към вас ако някой е патил от това и е намерил по оригинално решение да сподели опита си.

Автор:  evc [ Вто Май 30, 2006 8:43 am ]
Заглавие: 

@setoy, хайде ако не те затруднява, постни асемблерския код на Soft_I2C_Config например!
@ugeen, проблема за който говориш произтича от read performing write метода на обслужване на портовете. Има го описан в дейташийта на всеки процесор. Изразява се в това, че при задаване на ново състояние на порта, процесора първо прочита текущото състояние и ако имаш закачен нискоомен товар (например светодиоди) въпреки, че си задал състоянието на пиновете например "1", той ги прочита като "0" заради светодиодите и по този начин ги гаси. Проблема е решен при 18-та серия с въвеждане на LATH регистри за всеки порт. Но при теб не е това, тъй като по този начин щеше да ти гаси светодиодите, а ти твърдиш, че ги пали.

Автор:  setoy [ Вто Май 30, 2006 9:14 am ]
Заглавие: 

Код:

;  ASM code generated by mikroVirtualMachine for PIC - V. 5.0.0.2
;  Date/Time: 30.5.2006 ã. 09:07:06
;  Info: http://www.mikroelektronika.co.yu


; ADDRESS   OPCODE   ASM
; ----------------------------------------------
$0000   $28BD         GOTO   _main
$0004   $   _Delay_1us:
;delays.c,2 ::       void Delay_1us() {
;delays.c,3 ::       Delay_us(1);
$0004   $0000         NOP
$0005   $0000         NOP
;delays.c,4 ::       }
$0006   $0008         RETURN
$0007   $   _Soft_I2C_Start:
$0007   $1303         BCF   STATUS, RP1
$0008   $1283         BCF   STATUS, RP0
$0009   $0820         MOVF   ___porti2c, 0
$000A   $0084         MOVWF   FSR
$000B   $1383         BCF   STATUS, 7
$000C   $1680         BSF   INDF, ____sdai2c
$000D   $2004         CALL   _Delay_1us
$000E   $1700         BSF   INDF, ____scli2c
$000F   $2004         CALL   _Delay_1us
$0010   $1280         BCF   INDF, ____sdai2c
$0011   $2004         CALL   _Delay_1us
$0012   $1300         BCF   INDF, ____scli2c
$0013   $0008         RETURN
$0014   $   _Soft_I2C_Write:
$0014   $3008         MOVLW   8
$0015   $1303         BCF   STATUS, RP1
$0016   $1283         BCF   STATUS, RP0
$0017   $00A4         MOVWF   Soft_I2C_Write_temp_L0
$0018   $01A5         CLRF   Soft_I2C_Write_r_L0, 1
$0019   $0820         MOVF   ___porti2c, 0
$001A   $0084         MOVWF   FSR
$001B   $1383         BCF   STATUS, 7
$001C   $   L_Soft_I2C_Write_0:
$001C   $0824         MOVF   Soft_I2C_Write_temp_L0, 0
$001D   $1903         BTFSC   STATUS, Z
$001E   $2834         GOTO   L_Soft_I2C_Write_1
$001F   $2004         CALL   _Delay_1us
$0020   $2004         CALL   _Delay_1us
$0021   $1300         BCF   INDF, ____scli2c
$0022   $2004         CALL   _Delay_1us
$0023   $0DA3         RLF   FARG_soft_i2c_write+0, F
$0024   $1C03         BTFSS   STATUS, 0
$0025   $2829         GOTO   l_018
$0026   $1784         BSF   FSR, 7
$0027   $1680         BSF   INDF, ____sdai2c
$0028   $282B         GOTO   l_01C
$0029   $   l_018:
$0029   $1784         BSF   FSR, 7
$002A   $1280         BCF   INDF, ____sdai2c
$002B   $   l_01C:
$002B   $0000         NOP
$002C   $2004         CALL   _Delay_1us
$002D   $1700         BSF   INDF, ____scli2c
$002E   $1384         BCF   FSR, 7
$002F   $1F00         BTFSS   INDF, ____scli2c
$0030   $282F         GOTO   $-1
$0031   $1784         BSF   FSR, 7
$0032   $03A4         DECF   Soft_I2C_Write_temp_L0, 1
$0033   $281C         GOTO   L_Soft_I2C_Write_0
$0034   $   L_Soft_I2C_Write_1:
$0034   $01A5         CLRF   Soft_I2C_Write_r_L0, 1
$0035   $2004         CALL   _Delay_1us
$0036   $0000         NOP
$0037   $1300         BCF   INDF, ____scli2c
$0038   $2004         CALL   _Delay_1us
$0039   $1680         BSF   INDF, ____sdai2c
$003A   $2004         CALL   _Delay_1us
$003B   $2004         CALL   _Delay_1us
$003C   $1700         BSF   INDF, ____scli2c
$003D   $1384         BCF   FSR, 7
$003E   $1F00         BTFSS   INDF, ____scli2c
$003F   $283E         GOTO   $-1
$0040   $01A5         CLRF   FLOC_soft_i2c_write+1
$0041   $2004         CALL   _Delay_1us
$0042   $1384         BCF   FSR, 7
$0043   $1A80         BTFSC   INDF, ____sdai2c
$0044   $1425         BSF   FLOC_soft_i2c_write+1, 0
$0045   $2004         CALL   _Delay_1us
$0046   $2004         CALL   _Delay_1us
$0047   $2004         CALL   _Delay_1us
$0048   $2004         CALL   _Delay_1us
$0049   $2004         CALL   _Delay_1us
$004A   $2004         CALL   _Delay_1us
$004B   $2004         CALL   _Delay_1us
$004C   $2004         CALL   _Delay_1us
$004D   $1784         BSF   FSR, 7
$004E   $1300         BCF   INDF, ____scli2c
$004F   $1280         BCF   INDF, ____sdai2c
$0050   $0825         MOVF   Soft_I2C_Write_r_L0, 0
$0051   $00F0         MOVWF   STACK_0
$0052   $0008         RETURN
$0053   $   _Soft_I2C_Read:
$0053   $3008         MOVLW   8
$0054   $1303         BCF   STATUS, RP1
$0055   $1283         BCF   STATUS, RP0
$0056   $00A4         MOVWF   Soft_I2C_Read_temp_L0
$0057   $01A5         CLRF   Soft_I2C_Read_r_L0, 1
$0058   $0820         MOVF   ___porti2c, 0
$0059   $0084         MOVWF   FSR
$005A   $1383         BCF   STATUS, 7
$005B   $   L_Soft_I2C_Read_2:
$005B   $0824         MOVF   Soft_I2C_Read_temp_L0, 0
$005C   $3C00         SUBLW   0
$005D   $1803         BTFSC   STATUS, C
$005E   $2871         GOTO   L_Soft_I2C_Read_3
$005F   $2004         CALL   _Delay_1us
$0060   $0000         NOP
$0061   $1680         BSF   INDF, ____sdai2c
$0062   $2004         CALL   _Delay_1us
$0063   $1700         BSF   INDF, ____scli2c
$0064   $1384         BCF   FSR, 7
$0065   $1F00         BTFSS   INDF, ____scli2c
$0066   $2865         GOTO   $-1
$0067   $1A80         BTFSC   INDF, ____sdai2c
$0068   $1403         BSF   STATUS, C
$0069   $1E80         BTFSS   INDF, ____sdai2c
$006A   $1003         BCF   STATUS, C
$006B   $0DA5         RLF   FLOC_soft_i2c_read+1, F
$006C   $2004         CALL   _Delay_1us
$006D   $1784         BSF   FSR, 7
$006E   $1300         BCF   INDF, ____scli2c
$006F   $03A4         DECF   Soft_I2C_Read_temp_L0, 1
$0070   $285B         GOTO   L_Soft_I2C_Read_2
$0071   $   L_Soft_I2C_Read_3:
$0071   $1680         BSF   INDF, ____sdai2c
$0072   $2004         CALL   _Delay_1us
$0073   $0823         MOVF   FARG_soft_i2c_read+0, W
$0074   $1903         BTFSC   STATUS, 2
$0075   $2877         GOTO   L_07C
$0076   $1280         BCF   INDF, ____sdai2c
$0077   $   L_07C:
$0077   $0000         NOP
$0078   $2004         CALL   _Delay_1us
$0079   $1700         BSF   INDF, ____scli2c
$007A   $1384         BCF   FSR, 7
$007B   $1F00         BTFSS   INDF, ____scli2c
$007C   $287B         GOTO   $-1
$007D   $1784         BSF   FSR, 7
$007E   $2004         CALL   _Delay_1us
$007F   $1300         BCF   INDF, ____scli2c
$0080   $0000         NOP
$0081   $1280         BCF   INDF, ____sdai2c
$0082   $0825         MOVF   Soft_I2C_Read_r_L0, 0
$0083   $00F0         MOVWF   STACK_0
$0084   $0008         RETURN
$0085   $   _Soft_I2C_Stop:
$0085   $1303         BCF   STATUS, RP1
$0086   $1283         BCF   STATUS, RP0
$0087   $0820         MOVF   ___porti2c, 0
$0088   $0084         MOVWF   FSR
$0089   $1383         BCF   STATUS, 7
$008A   $1280         BCF   INDF, ____sdai2c
$008B   $2004         CALL   _Delay_1us
$008C   $1700         BSF   INDF, ____scli2c
$008D   $1384         BCF   FSR, 7
$008E   $1F00         BTFSS   INDF, ____scli2c
$008F   $288E         GOTO   $-1
$0090   $1784         BSF   fsr, 7
$0091   $2004         CALL   _Delay_1us
$0092   $2004         CALL   _Delay_1us
$0093   $2004         CALL   _Delay_1us
$0094   $2004         CALL   _Delay_1us
$0095   $1680         BSF   INDF, ____sdai2c
$0096   $2004         CALL   _Delay_1us
$0097   $0008         RETURN
$0098   $   _Soft_I2C_Init:
$0098   $1303         BCF   STATUS, RP1
$0099   $1283         BCF   STATUS, RP0
$009A   $0823         MOVF   FARG_Soft_I2C_Init+0, 0
$009B   $0084         MOVWF   FSR
$009C   $0180         CLRF   INDF, 1
$009D   $1784         BSF   FSR, 7
$009E   $0804         MOVF   FSR, 0
$009F   $00A0         MOVWF   ___porti2c
$00A0   $1680         BSF   INDF, ____sdai2c
$00A1   $1700         BSF   INDF, ____scli2c
$00A2   $1384         BCF   FSR, 7
$00A3   $1F00         BTFSS   INDF, ____scli2c
$00A4   $28A3         GOTO   $-1
$00A5   $0008         RETURN
$00A6   $   _READ_RTC:
;i2c.c,4 ::       void READ_RTC(void)
;i2c.c,6 ::       Soft_I2C_Config(&PORTD, 5, 6);
$00A6   $3008         MOVLW   PORTD
$00A7   $1303         BCF   STATUS, RP1
$00A8   $1283         BCF   STATUS, RP0
$00A9   $00A3         MOVWF   FARG_Soft_I2C_Init+0
$00AA   $2098         CALL   _Soft_I2C_Init
;i2c.c,7 ::       Soft_I2C_Start();
$00AB   $2007         CALL   _Soft_I2C_Start
;i2c.c,8 ::       Soft_I2C_Write(0xd0);
$00AC   $30D0         MOVLW   208
$00AD   $00A3         MOVWF   FARG_Soft_I2C_Write+0
$00AE   $2014         CALL   _Soft_I2C_Write
;i2c.c,9 ::       Soft_I2C_Write(0xa1);
$00AF   $30A1         MOVLW   161
$00B0   $00A3         MOVWF   FARG_Soft_I2C_Write+0
$00B1   $2014         CALL   _Soft_I2C_Write
;i2c.c,10 ::       Soft_I2C_Start();
$00B2   $2007         CALL   _Soft_I2C_Start
;i2c.c,11 ::       Soft_I2C_Write(0xd1);
$00B3   $30D1         MOVLW   209
$00B4   $00A3         MOVWF   FARG_Soft_I2C_Write+0
$00B5   $2014         CALL   _Soft_I2C_Write
;i2c.c,12 ::       Data=Soft_I2C_Read(0);
$00B6   $01A3         CLRF   FARG_Soft_I2C_Read+0, 1
$00B7   $2053         CALL   _Soft_I2C_Read
$00B8   $0870         MOVF   STACK_0, 0
$00B9   $00A1         MOVWF   _Data
$00BA   $01A2         CLRF   _Data+1
;i2c.c,13 ::       Soft_I2C_Stop();
$00BB   $2085         CALL   _Soft_I2C_Stop
;i2c.c,14 ::       }
$00BC   $0008         RETURN
$00BD   $   _main:
;i2c.c,27 ::       void main(void)
;i2c.c,29 ::       PORTA=0x00;
$00BD   $1303         BCF   STATUS, RP1
$00BE   $1283         BCF   STATUS, RP0
$00BF   $0185         CLRF   PORTA, 1
;i2c.c,30 ::       TRISA=0x00;
$00C0   $1683         BSF   STATUS, RP0
$00C1   $0185         CLRF   TRISA, 1
;i2c.c,31 ::       PORTB=0x00;
$00C2   $1283         BCF   STATUS, RP0
$00C3   $0186         CLRF   PORTB, 1
;i2c.c,32 ::       TRISB=0x80;
$00C4   $3080         MOVLW   128
$00C5   $1683         BSF   STATUS, RP0
$00C6   $0086         MOVWF   TRISB
;i2c.c,33 ::       PORTC=0xff;
$00C7   $30FF         MOVLW   255
$00C8   $1283         BCF   STATUS, RP0
$00C9   $0087         MOVWF   PORTC
;i2c.c,34 ::       TRISC=0x00;
$00CA   $1683         BSF   STATUS, RP0
$00CB   $0187         CLRF   TRISC, 1
;i2c.c,35 ::       TRISD=0xe0;
$00CC   $30E0         MOVLW   224
$00CD   $0088         MOVWF   TRISD
;i2c.c,36 ::       PORTD=0x00;
$00CE   $1283         BCF   STATUS, RP0
$00CF   $0188         CLRF   PORTD, 1
;i2c.c,37 ::       PORTE=0x00;
$00D0   $0189         CLRF   PORTE, 1
;i2c.c,38 ::       TRISE=0x00;
$00D1   $1683         BSF   STATUS, RP0
$00D2   $0189         CLRF   TRISE, 1
;i2c.c,39 ::       READ_RTC();
$00D3   $20A6         CALL   _READ_RTC
;i2c.c,42 ::       while (1)
$00D4   $   L_main_0:
;i2c.c,43 ::       {}
$00D4   $28D4         GOTO   L_main_0
;i2c.c,44 ::       }
$00D5   $28D5         GOTO   $




Да добавя само - аз този компилатор не го ползвам. Качих го за проба и забравих да го махна;) И като казвам четим asm код, имам предвид точно четим - не разбираем, още по-малко пък оптимален :lol: Но поне регистрите ги означава с имената им, а не с адресите.[/quote]

Автор:  setoy [ Вто Май 30, 2006 9:26 am ]
Заглавие: 

... Значи имам някакъв смътен спомен за подобен проблем. Проблема идваше точно от bsf, bcf инструкциите. Ако не се лъжа, тогава смених bsf portb,5 с {movlw 0010000; iorwf portb) и bcf portb,5 с{movlw 11011111; andwf portb) и се оправи. Тъпото в твоя случай е че това значи да си пишеш собствени софтуерни И2Ц функции :twisted: Ако изровя отнякъде онзи код, мога да ти кажа по-подробно...
Аде успех!

Автор:  evc [ Вто Май 30, 2006 11:41 am ]
Заглавие: 

@setoy, благодаря за кода! Но така като го гледам си е читав отсекъде. Но при него не мисля, че е RPW проблема!

Автор:  bobyk [ Сря Май 31, 2006 2:15 pm ]
Заглавие: 

Абе какво се занимавате с тея Mikro...
Боклук от всякъде, и аз ги ползвах малко и се си общавах че ще ги разкарам от всякъде дето съм ги записал.
Пробвай нещо друго...
Успех.

Автор:  perro_iv [ Сря Май 31, 2006 11:13 pm ]
Заглавие: 

Проверил ли си хардуерно, дали всичко е наред.
В смисъл, тези диоди и часовника на същата платка ли са, и ако не на какво разстояние и каква е връзката между устройствата.

А пък тва да се оплюват пиковете е напълно излишно.
Прилича малко на приказката за ракетата и космоса или разни други такива подобни ...

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/