C18 einzelnen Pin setzen/löschen

OP #2812066
Lesenswert?

PIC18F45k20
auf PICkit 44-Pin Demoboard
C18 Compiler
MPLAB IDE v8.85
PICkit3


Hallo zusammen,

ich verstehe gerade die Welt nicht mehr.

Ich versuche mit meinem Controller ein 16bit Schieberegister (Par->Ser) 
auszulesen.
Um das zu machen muss die Pins Mode und Clk ein wenig hin und 
hertoggeln.

Mit diesem Code funktioniert alles einwandfrei:

#define SR_MODE   LATAbits.LATA0  // LTG 5
#define SR_CLK    LATAbits.LATA1  // LTG 6
#define SR_SER    PORTAbits.RA2    // LTG 7

#define bitset(var,bitno) (var|=1<<bitno)
#define bitclr(var,bitno) (var&=~(1<<bitno))

(...)

TRISAbits.RA0 = 0;
TRISAbits.RA1 = 0;
TRISAbits.RA2 = 1;

(...)

SR_MODE=0;
SR_CLK=0;

(...)

// LOAD
PORTA = 0b00000001;  // CLK 0 MODE 1
Delay10KTCYx(t);
PORTA = 0b00000011;  // CLK 1 MODE 1
Delay10KTCYx(t);
PORTA = 0b00000001;  // CLK 0 MODE 1  // falling edge - load
Delay10KTCYx(t);

for ( i = 3; i>=0; i--)  // fetch forth digit
    {  // Shifter shifts reverse 0 1 2 3 4 ... 14 15

Delay10KTCYx(t);
SR_CLK = 1;    // Shift the bit

if (SR_SER == 1)      bitset(Forth,i); // Output high set bit high

else                  bitclr(Forth,i); // Output low set bit low

Delay10KTCYx(t);

SR_CLK = 0;
(die for Schleife wiederholt sich dann noch 3 mal)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



Da ich aber nun  auch die anderen Pins von PORTA brauche, habe ich das 
Laden folgendermaßen abgeändert:

SR_MODE = 1;    // CLK 0 MODE 1
Delay10KTCYx(t);
SR_CLK = 1;    // CLK 1 MODE 1
Delay10KTCYx(t);
SR_CLK = 0;    // CLK 0 MODE 1  // falling edge - load
Delay10KTCYx(t);


Und plötzlich geht es nicht mehr...?!

Auch wenn ich ein direktes bitset und bitclear, aus den LATCH PORTS 
mache, alle anderen nicht verwendeten PORTApins auf Eingang (high oder 
low) oder Ausgang setze oder mehr Zeit gebe. NiX?!

Hat jemand Rat?


Viele Grüße Chris
OP #2813743
Lesenswert?

Holger W. schrieb:
> Analogeingänge disabled ?

Hallo Holger,
die ANs sind mit ANSEL = 0; alle deaktiviert
Danke


Das Problem hat sich anscheinend erledigt...

habe das Laden nochmal umgeschrieben


  SR_CLK = 0;     // CLK 0 MODE 0
  Delay10KTCYx(t);
  SR_CLK = 1;     // CLK 1 MODE 0
  Delay10KTCYx(t);
  SR_MODE = 1;       // CLK 1 MODE 1
  Delay10KTCYx(t);
  SR_CLK = 0;        // CLK 0 MODE 1  // falling edge - load
  Delay10KTCYx(t);


Anscheinend braucht das Schieberegister erst die CLK 1 und dann die MODE 
1 :-/
Aber erstmal mit dem µC schimpfen.... so kennt man das :-D

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren