PIC16F690: zahadne spravanie sa portu RA2

Zdravim vas,
jedna sa o riadenie HD44780 pre jednoduchost v tomto priklade 8-bitove. Program prestal fungovat po cca roku (nahodne necakane). Po dlhom patrani som zistil ze problem je PORTA,2 na ktorom je pripojeny RS pin. Najprv uryvok programu, potom popis problemu.
Hned na zaciatku mam:#DEFINE EN PORTA,0 #DEFINE RS PORTA,2
Zapis dat vyzera takto (data su vo W):

ZAPIS_DATA
    BSF RS ;RS = 1 -> posielam do displeja data
    BSF EN
    MOVWF PORTC
    BCF EN
    MOVLW D'255'
    CALL DELAY
    BSF EN
RETURN

A potom volanie v hlavnom programe:

        CALL LCD_INIT
        MOVLW A'a'
        CALL ZAPIS_DATA

No a problem je ze RS (PORTA,2) je pocas celeho vykonavania programu v log 0 (napriek instrukcii BSF RS v procedure ZAPIS_DATA // otestovane LED diodou i osciloskopom na vystupe. Aj bez pripojeneho LCD), takze namiesto dat sa do displeja posielaju stale len instrukcie. LCD_IINT zbehne bez problemov. Podozrenie na chybny RA2 som vylucil vlozenim instrukcie

BSF RS
CALL DELAY
BCF RS

priamo do hlavneho programu mimo proceduru ZAPIS_DATA kedy LED na vystupe blikla.
Uz len dodam ze:

  1. program v simulatore funguje a v minulosti fungoval aj na LCD
  2. ak hodim RS na iny port, napr #DEFINE RS PORTB,6 vsetko funguje ako ma
  3. vymena LCD a ani vymena PIC nepomohla
  4. OPTION_REG ma hodnotu 0xFF (nemenim nic) a vsetky piny su OUT.

Napada niekomu nejaka teoria tohto chovania pls?
Dakujem.

Musíš vložit vždycky celej program, ne jenom úryvky. Z tohohle se nedá poznat jak máš co zkonfigurovaný, RA2 je T0CKI a těch věcí ke kontrole je tak poměrně dost.

“Program prestal fungovat po cca roku (nahodne necakane)”

tak asi nebude problém v zdrojáku, ale asi vplyvom EMI niečo na procáku odišlo. Načo analyzovať zdroják, ktorého preklad (HEX) bol dlho funkčný?
Čo si od analýzy zdrojáku sľubuješ?

Martin: V podstate suhlasim, takto som tiez uvazoval a preto som kupil novy PIC a problem pretrvaval, preto hladam chybu inde.
Mahoney: Nepriamo si ma naviedol k rieseniu, tentokrat pomohlo pridat CLRF ANSEL CLRF ANSELH
a problem sa vyriesil, no co ma rochu matie je, ze druhy zdrojak napisany v C stale nefunguje a tam mam nastavenie pre ANSEL. Zajtra sa na to este pozrem a ked tak sa ozvem a poslem aj zdrojak.

Zatim dik,

PS: vieme na zaklade akej logiky PIC rozhoduje ktory port bude digital a ktory analog v pripade ze to pouzivatel nenastavi?

Nerozhoduje podle žádné logiky. V datasheetu je u všech SFR registrů uvedeno výchozí nastavení po startu či restartu, pokud na něj nesáhneš, zůstane ve stavu po initu. Některé registry nemusí procházet interním initem, stejně tak GPR registry mají zpravidla náhodné hodnoty (proto je vhodné při deklaraci proměnných tyto zároveň inicializovat).

Tak či tak, jednou za čas je vhodné v programu obnovit požadované hodnoty ve všech používaných registrech, obzvláště pokud se jedná o zařízení, která běží delší dobu a/nebo v zarušeném prostředí. O vhodnosti takového opatření jsi se právě sám přesvědčil a jsem si jist, že si toto bezpečně zapamatuješ - vlastní zkušenosti bývají nejcennější (a zdaleka nejsi sám koho vypekly ANSELx registry, taky patřím “k členům tohoto klubu” :smiley: )

Jinak samozřejmě není zač :wink: Jsem rád že tě to navedlo k řešení.