PIC 16F688, nejde nastavit alebo znulovat port C4 prikazom

Ahojte, myslim ze z nadpisu je vsetko jasne. Netusim kde je problem, pripajam aj jednoduchy kod, na ktorom ten mcu odladujem. Cely port blika, C4 nie. Pokial to robim sposobom MOVLW -> MOVWF PORTC, tak funguje ako ma. Fakt netusim kde moze byt problem. Dakuejem za pomoc.

[code]LIST p=16F688
#include <p16f688.inc>

__CONFIG _CP_OFF & _CPD_OFF & _BOD_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _FCMEN_OFF & _IESO_OFF

C1 EQU 20h
C2 EQU 21h
C3 EQU 22h
CNT EQU 23h

ORG 0
GOTO START

ORG 4
GOTO START

START

BANKSEL OSCCON

MOVLW B’01110100’
MOVWF OSCCON

BANKSEL PORTC
CLRF PORTC

BANKSEL CMCON0
MOVLW B’00000111’
MOVWF CMCON0

BANKSEL ANSEL
CLRF ANSEL

BANKSEL TRISA
MOVLW B’00001000’
MOVWF TRISA
MOVLW B’00000000’
MOVWF TRISC

CLRF STATUS

CLRF PORTA
CLRF PORTC

PROGRAM

BSF PORTC,0
BSF PORTC,1
BSF PORTC,2
BSF PORTC,3
BSF PORTC,4
BSF PORTC,5
CALL CAKAJ
BCF PORTC,0
BCF PORTC,1
BCF PORTC,2
BCF PORTC,3
BCF PORTC,4
BCF PORTC,5
CALL CAKAJ

GOTO PROGRAM

CAKAJ
MOVLW .5
MOVWF C3
MOVLW .255
MOVWF C2
MOVWF C1
DECFSZ C1
GOTO $-1
DECFSZ C2
GOTO $-4
DECFSZ C3
GOTO $-7
RETURN

CAK2
MOVLW .30
MOVWF C2
MOVWF C1
DECFSZ C1
GOTO $-1
DECFSZ C2
GOTO $-4
RETURN

END

[/code]

Řekl bych, že je to naprosto typický problém Read - Modify - Write, alespoň podle tvého nejasného popisu. Ten je ovšem už tak profláklej, že ho zde nebudu rozepisovat. Už se to tu nepochybně řešilo a na webu najdeš vysvětlení také.

Aha, no skusim pogooglovat, snad sa mi posatasti. Bol si prosim ochotny poukazat na nedostatky v mojom popise, aby som sa pre buducnost mohol vyvarovat chyb ?
PS.: som stastny, ze som konecne napisal nazov temy tak, aby si ho nemusel menit :slight_smile:

//edit
A este jedna zaujimava vec, ze v MPLAB SIM sa mi ten port nastavuje a nuluje ako ma, tak neviem,… zatial som na nete nic prakticke nenasiel.

RMW je klasicky “chytak” s ktorym sa zacinajuci stretavaju. Je o tom vsade dost popisane, napriklad druhy, treti a stvrty odkaz v googli:
marcansoft.com/uploads/readmodifywrite.pdf
piclist.com/techref/readmodwrite.htm
cornerstonerobotics.org/curr … roblem.pdf

Vyvarovat sa tomu da tak, ze sa instrukcie, ktore su RMW nepouzivaju na portoch, ak clovek presne nevie co robi, da sa vytvorit a pouzit shadow register alebo pouzivat PIC, ktore tymto netrpi, napriklad PIC18.

Simulator tento problem tiez nepozna, pretoze simulator nesimuluje fyziku okolo portov, hlavne ich zataz, ci uz ohmickeho alebo kapacitneho charakteru, ktora je hlavnym problemom pri pouzivani RMW instrukcii na portoch.

V tom prvom linku to je super vysvetlene, dakujem ti. Toto je prvy mcu zo 16-tkovej rady pri ktorom som sa stretol s tymto problemom. Dufam ze to je aj posledny. Len nerozumiem preco problem pretrvava aj ked som za instrukciu BSF PORTC,4 pridal 30 NOP a znizil takt procesora z 8MHz na 1MHz. Kondenzator spominany v tom prvom linku by sa uz mal stihnut nabit a pri citani portu by sa mal portc 4 precitat ako nastaveny. Nerozumiem kde to viazne. On ten port aj na chvliku blikne ale potom zhasne. Ked som zmenil poradie prikazov, tak sa zas C5 nezapali.
tak to vyzera ze nad 688 bude vyneseny verdikt :smiley:

//edit
Siceee, stavalo sa mi to pri nulovani na 88micke myslim.
Ale da sa to tomu procesoru vtlct do hlavy :smiley:

BSF PORTC,4 BSF PORTC,5 BSF PORTC,4 BSF PORTC,5
bruteforce ? :smiley:

Pouzivaj tienovy register, nieco ako

bsf PORTC_SHADOW,1
movf PORTC_SHADOW,W
movwf PORTC
bsf PORTC_SHADOW,2
movf PORTC_SHADOW,W
movwf PORTC
bsf PORTC_SHADOW,3
movf PORTC_SHADOW,W
movwf PORTC
bsf PORTC_SHADOW,4
movf PORTC_SHADOW,W
movwf PORTC

Tym vlastne vytvaras nieco ako LAT register u PIC18, ale softwarovou cestou.

Tamtie veci okolo “brute-force” su mozno srandovne, ale nie pouzitelne :slight_smile:

Jo a este jedna vec - nechcelo sa mi kontrolovat datasheet, ale nula sa z portu precita nielen vtedy (a teda robi problem s RMW instrukciami), ak sa nestihne nabit kapacita na porte, ale aj vtedy ak port nema zapnutu digitalnu funkciu kvoli komparatoru alebo ADC - toto nie je tvoj pripad?[/code]

Ne ne, v tom som hladal pricinu najprv, ci ten port nie je ovladany nejakou funkciou. Je digitalny a vsetky ostatne zalezitosti mam vypnute.

Upravená řada PIC16F1xxx tímto problémem už netrpí. Bez problémů funguje nastavování jednotlivých bitů v PORTx a kdyby to náhodou nešlo, tak je tam registr LATx.

Aj upravena rada PIC16F1xxx trpi RMW problemom pri nastavovani jednotlivych bitov PORTx. Jediny sposob, ako to vyriesit je nastavovanie bitov LATx, ci uz u PIC16F1xxx, alebo PIC18 a vyssich PIC.

Nejako som sa stym nestretol vy tvrdite ze toto nebude fungovat
BCF 0x6, 0x5
BCF 0x6, 0x4
BSF 0x6, 0x3
BSF 0x6, 0x2

ani toto nebude fungovat
BSF 0x6, 0x5
BCF 0x6, 0x4
BCF 0x6, 0x3
BCF 0x6, 0x2

Akosi som nepochopil kde ma byt problem…

Presne to v tech dokumentech pisou. Da se rici, ze cim vetsi kapacita na vystupu, tim spise se tohoto problemu dotkne. Muze na to mit vliv treba spatny navrh plosneho spoje (dlouha cesta blizko nejakeho potencialu) s velkým odporem vuci tomuto potencialu. Pokud ale nebudes provadet tyto RWM operace rychle za sebou, opet by nemel byt problem. Proste zalezi na situaci a je treba takto an tento problem pohlizet…
Osobne jsem se ale nastesti s problemem nesetkal.

ved anii ja preto mi je to divne… a ceckovy prekladac to normalne takto vygeneroval…

Atlan:
1, To ze si sa s tym problemom nestretol, neznamena ze neexistuje,
2, To, ze C-ckovy kompilator vygeneruje nejaky kod este neznamena, ze ten kod je spravny.
Konieckoncov ten kompilator robi len to, co mu povie uzivatel.

O RMW probleme som nepisal, ale dal som sem tri linky, povodny tazatel (INKOGNITO) si ich precital a pochopil - je to tam dost jasne napisane.
Co sa tyka postupnosti viacerych bsf/bcf instrukcii za sebou a RMW problemu z nich vyplyvajucich, nikde nie je napisane, ze to nikdy nebude fungovat. Naopak, je vela pripadov, kde to fungovat bude, ale je dobre vediet o probleme, ktory sa moze vyskytnut - presne tak ako sa to stalo INKOGNITO-vi, lebo jeho problem je jasny RMW pripad.