De digitale uitgangen RA4 en 5 blijken niet te werken op mijn PIC 16F627A. Ik probeerde ook reeds andere pic's 628A en 648A.
Comporators zijn uitgeschakeld.
In trisa zijn 4 en 5 op 0 (ouput) geset.

Wat kan er nog mis ingesteld zijn?
schema


#include <system.h>
#include "F627A.h"

//internal 4Mhz oscillator
#pragma CLOCK_FREQ 4000000
#pragma DATA _CONFIG, _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _DATA_CP_OFF & _MCLRE_OFF & _LVP_OFF & _PWRTE_ON

void setSegCode(char code){
portb.4=code.0;
portb.3=code.1;
porta.4=code.2;
porta.3=code.3;
porta.2=code.4;
portb.5=code.5;
portb.6=code.6;
}

void main()
{	 

trisa = 00000011b;
trisb = 10000000b;
porta = 0;
portb = 0;	
//option_reg = 01000101b;
//delay_ms(200);

cmcon.0=1;
cmcon.1=1;
cmcon.2=1;

char segcode[10]={0111111b,0000110b,1011011b,1001111b,1100110b,1101101b,1111101b,0000111b,1111111b,1101111b};

portb.2=0;
portb.1=0;
portb.0=0;
porta.5=0;

while(1){

portb.2=0;
portb.1=0;
portb.0=0;
porta.5=1;
setSegCode(segcode[0]);
delay_ms(200);

portb.2=0;
portb.1=0;
portb.0=1;
porta.5=0;
setSegCode(segcode[1]);
delay_ms(200);

portb.2=0;
portb.1=1;
portb.0=0;
porta.5=0;
setSegCode(segcode[2]);
delay_ms(200);

portb.2=1;
portb.1=0;
portb.0=0;
porta.5=0;
setSegCode(segcode[3]);
delay_ms(200);

}//end while true	
}

http://users.pandora.be/k_coopman/avatarCO/DSC00891.JPG

was er niets iets opendrain of in die richting, en de MCRL ofzo?

RA5 komt idd overeen met MCLR, maar die staat af in de fuses zodat die als I/O kan gebruikt worden.

ra4 kan enkel stroom sourcen ofzo

kijk es na in de datasheet

ofwel moet je er een transistorke aanzetten

RA4 of een in die richting kon alleen naar de ground halen, niet stroom leveren. en ik maar denken waarom dat ledje niet brandde;)

GVD, ik lees hier nu idd in de datasheet:
RA4: open drain -> dus enkel stroom sinking
RA5 is input only.

Miljaar die print is nu al gemaakt...

Op 25 december 2006 01:08:53 schreef pol:
GVD, ik lees hier nu idd in de datasheet:
RA4: open drain -> dus enkel stroom sinking
RA5 is input only.

Miljaar die print is nu al gemaakt...

tja ... volgende keer eers op testprint maken en een datasheet erbij halen

Een testprint maken voor 4 van die 7 segment displays lijkt me wel ongeloofelijk veel werk.
Dit type PIC heb ik wel vaker gebruikt, maar 't was blijkbaar al wat langer geleden ditmaal :).

Nu nog een oplossing voor het probleem:
RB7 en RA5 kan ik wel met een draadje wisselen. (Op RB7 zit momenteel een ingang.)

voor de open drain...
er zitten smd npn transistoren op de achterkant van de print. Van een pnp equivalent blijkt te pinout niet te passen.
Als ik de basis van de aangesloten transistor nu eens met een pull up naar Vcc zou halen en RA4 rechtstreeks op de basis aansluiten.

Zou dit kunnen werken?
http://users.pandora.be/k_coopman/avatarCO/co.JPG

De pin wissel is doorgevoerd. Van 3 displays werken alle segmenten.

Ik krijg echter nog geen beweging in mijn eerste display.
Hij is aangesloten zoals hierboven aangegeven: pull-up naar vcc en RA4 naar de basis.

RA4 is dus een open drain output. Als ik goed redeneer kan hij dus enkel stroom sinken of is hij 'high impedance'.
Bij high impedance geleid de transistor doordat de stroom via de pullup loopt.
Bij het sinken van de stroom wordt RA4 ahw naar massa getrokken en spert de transistor.

Klopt deze redenering?

Bij het meten met mijn scoop aan de schakeling blijft de basis continu laag. Er wordt dus blijkbaar continu stroom gesinkt??

Maar blijkbaar schort er nog iets anders aan, want ik krijg geen beweging in pin RA4. Deze pin blijft dus blijbaar continu laag. Hij sinkt voortdurend stroom, mijn transistor blijft sperren. Ik krijg deze pin dus niet in 'high impedance' mode.

Nog andere instellingen van deze poort die ik over het hoofd zie?

Op 25 december 2006 23:35:41 schreef pol:
Maar blijkbaar schort er nog iets anders aan, want ik krijg geen beweging in pin RA4. Deze pin blijft dus blijbaar continu laag. Hij sinkt voortdurend stroom, mijn transistor blijft sperren. Ik krijg deze pin dus niet in 'high impedance' mode.

Nog andere instellingen van deze poort die ik over het hoofd zie?

de pin is ofwel zwevend of nul ,dacht ik

Ja tuurlijk dat zei ik ook net. Zwevend== high impedance en nul == enkel stroom sinken.

Maar hiermee is het probleem nog niet opgelost. Ik krijg die pin niet 'zwevend'. Hij blijft continu stroom sinken(of 'nul') waardoor mijn transistor niet in geleiding komt.

Meet eens met een voltmeter wat RA4 precies doet.
Het kan zijn dat je R13 te klein hebt waardoor de RA4-poort niet laag genoeg wordt om je tor te doen sperren.

EDIT: Oeps, niet goed gelezen 't is dus precies andersom...

Ik zie nergens bankwissels in je progje, dat is wel nodig bij tris-instructies. Wordt dat in je compiler geregeld ofzo? Ben gewend in assembler :P te programmeren.

[Bericht gewijzigd door Zonnepaneeltje op ]

Op 26 december 2006 13:09:57 schreef Zonnepaneeltje:
Meet eens met een voltmeter wat RA4 precies doet.
Het kan zijn dat je R13 te klein hebt waardoor de RA4-poort niet laag genoeg wordt om je tor te doen sperren.

EDIT: Oeps, niet goed gelezen 't is dus precies andersom...

Ik zie nergens bankwissels in je progje, dat is wel nodig bij tris-instructies. Wordt dat in je compiler geregeld ofzo? Ben gewend in assembler :P te programmeren.

De bankwissel wordt idd door de compiler geregeld.

Even met mijn scoop gemeten op: RA4= 0V.
De basis vd transistor hangt met een pullup van 10k naar 5V.

Geen kortsluiting op je print tussen RA4 en GND?

Nee, juist getest. Ik meet wel een diodeovergang tss RA4 en gnd, maar dit is de BE junctie van de transistor.

edit:
Volgens de datasheet zijn enkel volgende registers associated met PORTA: portA,trisA,CMCON en VRCON.
dus trisa.4=0; uitgang setten.
in cmcon comporatoren uitzetten (CM2:CM0 =111);
in Vrcon ?? (bit7 0setten vref disablen, ik zal dit nog eens testen. Vref disabled helpt dus ook niet...)

[Bericht gewijzigd door pol op ]

Als je de uitgang high-impedance wil, moet je het betreffende tris-bit 1 maken.

huh, dan maak je er toch een input van?

Dus in porta kan ik niet schakelen tussen gnd en high impedance?

edit:
Pin RA4 is alive!!
Een pin op deze manier schakelen is toch totaal niet logisch...
Vind je dit ergens terug in de datasheet? Welke pagina??

Alvast bedankt, hier zat ik dus echt ettelijke uren op te zoeken, als je ooit in België passeert trakteer ik je een pint :) .

[Bericht gewijzigd door pol op ]

Een input heeft van zichzelf een zeer hoge impedantie.
Als je hem op high-impedance zet wordt het in feite een input, je gebruikt hem alleen niet als zodanig.

EDIT: Hoera! Daar hou ik je aan ;)

[Bericht gewijzigd door Zonnepaneeltje op ]

Ja ok, maar ze beschrijven RA4 in de datasheet wel als een open drain output. Daaronder versta ik dan dat je de pin naar massa kunt schakelen (activeren met '1') en de drain open laten (high impedance) met een logische '0' in portA.
Net zoals je een tri-state uitgang hebt van logische IC's (maar dan zonder de 'hoog' staat.)

Ik snap je redenering.
Je kunt in de datasheet in het hoofdstuk over de IO-ports echter het volgende lezen:
'TRISA controls the direction of the RA pins', dus 0 = output, 1 = input.
En verder geeft het block diagram over RA4 de nodige extra informatie. Het lijkt erop dat specifiek voor deze pin een 1 er naartoe sturen tot gevolg heeft dat de FET niet langer geleidt, en de uitgang hoogimpedant wordt......dat geeft dus bij deze pin hetzelfde resultaat als de tris 1 maken.
Ik vermijd dus systematisch om RA3 en RA4 te gebruiken in m'n PICjes. Je snapt waarom...

Toch vind ik de datasheet hierover niet duidelijk genoeg.
Met RA3 had ik dit probleem niet.
En de pin niet gebruiken was in dit geval niet mogelijk. Ik heb elke pin van de controller nodig.

Ja, ik noemde RA3 omdat deze vaak 'input only' is.
Heb je al geprobeert een 1 naar RA4 te sturen met de tris=0 ? Dat zou ook moeten werken, misschien makkelijker in je programma.

Dit is wat ik de hele tijd probeerde. Trisa.4=0 als output en dan in porta.4 tussen '0' en '1' schakelen. Dit werkt dus niet... bizar.

Het juiste display selecteren ziet er nu zo uit


//juiste display selecteren
void selectDisp(char nr){
//alles displays off
trisa.4=0;
portb.0=0;
portb.1=0;
portb.2=0;
if (nr==1)
	trisa.4=1;
if (nr==2)
	portb.0=1;
if (nr==3)
	portb.1=1;
if (nr==4)
	portb.2=1;
}

vanaf dat ik trisa.4 op output zet schakelt ie blijkbaar ook al naar GND.