Forum: Mikrocontroller und Digitale Elektronik Schieberegister mit Pic ansteuern


von alphi h. (sada)


Angehängte Dateien:

Lesenswert?

hallo miteinander

ich wollte mit hilfe von MPLABX und dem XC8 compiler meinen Pic16f877a 
dazu bringen, dass das Schieberegister ein einfaches muster herausgibt. 
an den Q's des Schieberegister sind  LED's angeschlossen.
den uC programmiere ich über den Brenner 8P von Sprut via ICSP.
das programm ist ziemlich einfach in C realisiert. Wenn der uC auf run 
ist scheint das SR wie tot. wenn der uC auf stop ist ( um ein Programm 
rüberzuladen) flackern alle led's unontrolliert. das wäre mir noch egal 
aber sobald er auf run geht sollte sich das SR füllen und mein gewähltes 
muster ausgeben. Ihr könnt mir sicher helfen. im anhang befindet sich 
ein photo und das schema.

das programm sieht so aus.

/** I N C L U D E S *******************************************/
#include <htc.h>
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>

// PIC16F877A Configuration Bit Settings

// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (XT 
oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT 
disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT 
disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR 
enabled)
#pragma config LVP = ON         // Low-Voltage (Single-Supply) 
In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; 
low-voltage programming enabled)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection 
bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable 
bits (Write protection off; all program memory may be written to by 
EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Prot


#ifndef _XTAL_FREQ
#define _XTAL_F REQ 4000000L // (4mhz)
#endif

#define clk RA1
#define data RA0

void clock(void);

/** H A U P T P R O G R A M M *********************************/
void main(void)
{
/** D E F I N E S *********************************************/
    TRISD = 0x00;
    TRISA = 0x00;



  while(1) {          //Hauptschleife
            data =1;
            clock();
            data =0;
            clock();
             data =1;
            clock();
            data =0;
            clock();
             data =1;
            clock();
            data =0;
            clock();
             data =1;
            clock();
            data =0;
            clock();
  }
}


void clock(void)
{
    clk=0;
    NOP();
    clk=1;
   NOP();
    clk=0;
}

von Teo D. (teoderix)


Lesenswert?

Da sollte nichts "zappeln" wen Du den µC Programmierst. Da haste Dich 
wohl bei den kabeln verstöpselt :)
Wo steckt eigentlich der Prozessor drin?
Dein 4094 würde sich auch sicher über einen Abblockkondensator freuen!

von Karl H. (kbuchegg)


Lesenswert?

Und zur Not kann man immer noch nach jedem clock() (oder besser gleich 
in der Funktion) noch eine zusätzliche Wartezeit von sagen wir mal 2 
Sekunden einlegen. Das hat dann den Vorteil, dass man an die beiden 
µC-Pins noch zusätzliche LED anhängen kann und mithilfe der LED sehen 
kann, ob und wenn ja was sich an den beiden Pins tut.

Dem Schieberegister ists wurscht wie langsam du taktest.


Blöde Frage. Aber du hast schon kontrolliert, ob dein µC grundsätzlich 
läuft? So mit einfach nur eine LEd an einen Portpin hängen und die 
gezielt ein/aus schalten bzw. auch mal blinken lassen.

von Jens M. (Gast)


Lesenswert?

Schau mal ob die nicht besser die analogen Eingange abschaltest 
(ANSELx)? Die sind m.W. und aus guten Gründen nach dem Reset 
bevorrechtigt. Gilt aber wohl nur für Eingänge.

Das nächste sind die Fuse bits. Reicht es das du deinem compiler das 
pragma übergibst oder programmiert der die extra?

und wo sit eigentlich der Quartz Oszillator nebst Zubehör vom Schaltplan 
auf dem Steckbrett? Wenn das so aufgebaut ist wie der rest wird das 
vielelicht nicht anschwingen. Besser vielleicht erstmal einen PIC mit 
internen OSC zu nehmen.

von alphi h. (sada)


Lesenswert?

Also dem schieberegister könnte ich noch ein Kondi verpassen. Wegen den 
fuses weiss ich nicht.  Ich probiers mal mit anderen Pins RB1 und RB2. 
Melde mich wieder. Mal gucken ob die LEDs am Ausgang blinken. SR habe 
ich schon mehrmals ausgetauscht.

von Jens M. (Gast)


Lesenswert?

danilo S. schrieb:
> SR habe ich schon mehrmals ausgetauscht.

Mach das ganze langsamer. Dein clock aus Nops ist bei den Leitungslängen 
und der Verdrahtung dann doch arg kurz.

Karl Heinz Buchegger schrieb:
> Blöde Frage. Aber du hast schon kontrolliert, ob dein µC grundsätzlich
> läuft? So mit einfach nur eine LEd an einen Portpin hängen und die
> gezielt ein/aus schalten bzw. auch mal blinken lassen.

Die Frage ist sehr naheliegend, würde ich als erstes mal testen.

von Teo D. (teoderix)


Lesenswert?

Mach mal n Foto von dem "Prozessor-Board",da mit die Raterrei deswegen 
ein ende hat!

von Sunny (Gast)


Lesenswert?

Total falsches programm.

von alphi h. (sada)


Angehängte Dateien:

Lesenswert?

letzte nacht wurde bei uns in der gemeinde das internet gekappt.
im anhang befindet sich ein foto des prozessorboards.
ich probiere es nun weiter aus

Sunny schrieb:
> Total falsches programm.

was ist den so falsch daran?

von alphi h. (sada)


Lesenswert?

Ich habe zwei neue ausgänge genommen. RD3 und RD2(unten rechts am uC)
wenn ich nun zwei led's anhänge blinken die genau so wie ich will. D.h 
am anschluss Data und CLK des SR kommt alles richtige an. aber ich will 
ja ein muster ausgeben.  mit diesem programm soll ja die eine LED 
leuchten und die nächste nicht usw. aber bei mir leuchtet die erste geht 
weiter zur nächsten und so weiter bis sie an Q7 angekommen ist, und dann 
scheint das SR wie tot, obwohl es in einer endlosschleife ist.

von Sunny (Gast)


Lesenswert?

Ich kann dir ein Beispiel zeigen aber in anderer Sprache.
1
-- pin defines
2
-- Any other  I/O pin could be used  
3
var volatile bit  CLK  is  pin_b0      -- Clock pin3
4
var volatile bit  D  is  pin_b1        -- Data pin2
5
var volatile bit  STR  is  pin_b2      -- Strobe pin1
6
var volatile bit  OE  is  pin_b3      -- Output Enable pin15
7
8
var volatile bit CLK_dir is pin_b0_direction
9
var volatile bit D_dir is pin_b1_direction
10
var volatile bit STR_dir is pin_b2_direction
11
var volatile bit OE_dir  is pin_b3_direction
12
13
  CLK_dir = output
14
  D_dir = output
15
  STR_dir = output
16
  OE_dir = output
17
18
-- load a byte into the '4094
19
procedure 4094_send(byte in ib) is
20
  var byte stemp
21
  stemp = ib
22
  OE = low
23
  STR = low
24
  for 8 loop
25
    D = low
26
    if ((stemp & 128) != 0) then
27
    D = high
28
    end if
29
    CLK = high
30
    asm nop
31
    CLK = low
32
    stemp = stemp << 1
33
  end loop
34
   OE = high
35
   STR = high
36
37
end procedure

von pic (Gast)


Lesenswert?

Nach main solltest du sowas haben:

CMCON |=7;  // disable comparators
ADCON1 = 6; // disable adc

weiters wäre es nicht schlecht, die nop() durch dly() zu ersetzten,
zumindest für den Debug.
#define dly() clk4(62) // ca 4HZ bei optimierenden Compiler.

void clk4(unsigned char count) { do CLRWDT(); while(count--); }

Dann kannst du auch mittels einer Led + Widerstand die Impulse 
verifizieren,
und bei Bedarf schneller werden.
oder für deinen Aufbau zumindest clk4(0) anstelle clk4(62) .
Eventuell kannst du immer noch ein
#define dly() NOP()
machen, für den Endgültigen Code.

Und natürlich nach dem letzten clock() ein clk4(250) machen, für ca 
1Sek.
Ansonsten zappelt es immer, da du mit 400khz deine Daten kontinuierlich 
reinschiebst und die Leds dann nie zum Stillstand kommen und einfach nur 
flackern.

von pic (Gast)


Lesenswert?

Ansonsten, in C solltest du eher sowas machen:


void ShiftOut(unsigned char value)
{
    unsigned char cnt=8;
    do {
        clk=0;
        dat=value&1;
        value>>=1;
        clk=1;
   } while(--cnt);
}


und in main nach dem Init anstelle des while:

  ShiftOut(0xAA);
  for(;;);


So wird ca alle 9ms das bitpattern 10101010 ausgegeben.

von pic (Gast)


Lesenswert?

Sorry, ca alle 9ms bei WDT=ON , ansonsten nur einmal .

von alphi h. (sada)


Lesenswert?

Oke vielen dank.  Mit dem PIC16F627A funktioniert es tadellos aber mit 
dem pic16f877a spinnt es wie wild. Wahrscheinlich liegt es wohl an der 
Hardware.

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.