Forum: Mikrocontroller und Digitale Elektronik C18 einzelnen Pin setzen/löschen


von Chris K. (chkome01)


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

von Holger W. (holgerw)


Lesenswert?

Analogeingänge disabled ?

von Chris K. (chkome01)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.