Forum: Mikrocontroller und Digitale Elektronik PIC16F627A: Probleme mit Schieberegister-Ansteuerung


von Jens (Gast)


Lesenswert?

Hallo Leute,

ich habe mal wieder ein problem, und zwar sende ich acht Bits an ein 
CD4094-Schieberegister, mein uC ist ein PIC16F627A. Ich verwende dazu 
folgenden Code (im Wesentlichen, unwichtige Teile gekürzt):
1
// PIC-Header einbinden
2
#include <pic.h>
3
4
// *************************************************************
5
// Methodenprototypen
6
void sendeWert (uchar Was, uchar Wohin);
7
8
// ************************************************************
9
// Globale Variablen
10
static uchar Sekunden, Minuten, Stunden;
11
static int TimingCounter;
12
13
// *********************************************************
14
// Hauptmethode
15
void main (void) {
16
17
    // ***************************************************
18
  // Konfigurationsbits setzen
19
  __CONFIG(0x3F2A);
20
21
  // ********************************************************
22
  // Portspezifikationen
23
  #define DATA  RA2
24
  #define CLK    RA3
25
  #define DIMMER  RB3
26
  #define STR_MIN  RA0
27
  #define STR_STD  RA1
28
  #define SW_AN  RB0
29
  #define SW_STD  RB2
30
  #define SW_MIN  RB1
31
32
  // Tristate setzen
33
  // CMCON = 0b111;
34
  TRISA = 0b0000;
35
  TRISB0 = 1;
36
  TRISB1 = 1;
37
  TRISB2 = 1;
38
  TRISB3 = 0;
39
40
  // ********************************************************
41
  // Startwerte für Zeitinformationen setzen
42
  Stunden = 12;
43
  Minuten = 0;
44
45
  // ********************************************************
46
  // TIMER setzen
47
  T0CS = 0;
48
  PSA = 1;
49
  PS0 = 1;
50
  PS1 = 1;
51
  PS2 = 1;
52
53
  // Interrupt bei Timer-Überlauf auslösen
54
  T0IE = 1;
55
56
  // Interrupts aktivieren
57
  GIE = 1;
58
59
  // LEDs sollen AN sein
60
  DIMMER = 1;
61
62
63
  // ********************************************************
64
  // Beginn der Hauptschleife
65
  while (true) {
66
67
68
    // *********************************************
69
    // Daten senden
70
    sendeWert (Minuten, 1);
71
    sendeWert (Stunden, 2);
72
73
  }
74
75
}
76
77
78
79
// ***************************************************
80
// Interrupt-Routine
81
static void interrupt isr (void) {
82
83
  if (T0IF) {
84
85
  // [...]
86
87
  T0IF = 0;
88
89
    }
90
91
92
}
93
94
// *********************************************************
95
// Diese Methode sendet einen Wert (binär zerlegt) an ein Schieberegister
96
void sendeWert (uchar Wert, uchar Wohin) {
97
98
  int Index;
99
100
  // Wert senden
101
  for (Index = 8; Index >= 0; Index--) {
102
103
    if (Wert & (1 << Index)) {
104
      DATA = 0;
105
    } else {
106
       DATA = 1;
107
    }
108
    CLK = 1;
109
    CLK = 0;
110
  }
111
112
  // Wert übernehmen
113
  if (Wohin == 1) {
114
    STR_STD = 1;
115
  } else {
116
    STR_MIN = 1;
117
  }
118
  STR_MIN = 0;
119
  STR_STD = 0;
120
121
}

Jetzt hab ich Esel die Hardware aber "falschherum" an den CD4094 gebaut, 
und wollte mir die Bits andersherum senden lassen mit
1
//..
2
  int Index;
3
4
  // Wert senden
5
  for (Index = 0; Index <= 8; Index++) {
6
7
    if (Wert & (1 << Index)) {
8
      DATA = 0;
9
    } else {
10
       DATA = 1;
11
    }
12
    CLK = 1;
13
    CLK = 0;
14
  }
15
//..

Aber das klappt nun nicht mehr, denn auf einmal dauert alles so 
wahnsinnig lange, das programmscheint sich aufzuhängen, und die Ausgabe 
der Sekunden (Testweise, oben nicht zu sehen) hat sich um den Faktor 
vier verlängert. Wo ist das das problem? Ich blick da nicht wirklich 
durch, warum eine einfache Grenzenänderung einer for-Schlaife solche 
probleme mit sich bringt.

Mensch muss dazusagen, dass ich kein wirklicher Profi mit PICs bin ( ;-) 
) aber bis jetzt bin ich immer ganz gut klargekommen, aber hier weiß ich 
echt nicht weiter. Ich würde mich über Antworten sehr freuen.

Viele Grüße
Jens

von Anja (Gast)


Lesenswert?

> for (Index = 0; Index <= 8; Index++)
= 9 Bits / Byte ????

von Jens (Gast)


Lesenswert?

Sorry, das ist ein Typo. Das soll natürlich
1
< 8
 heißen.

Gruß
Jens

von juppi (Gast)


Lesenswert?

C kann ich nicht ,aber schiebst du nicht immer in die Gleiche Richtung.

 if (Wert & (1 << Index)) {

von Jens (Gast)


Lesenswert?

Hallo,

also das Schieben ist schon richtig. Ich scanne ja die Variable Wert 
bitweise ab.

Habe den Fehler aber gefunden: ich habe die Hardware falsch herum 
angeschlossen (d.h. nicht nur invers, sondern auch mit einem Offset von 
2 Bits.) Deshalb habe ich die unteren zwei Bits der Sekunden nicht 
gesehen, und dachte, die Uhr läuft viel langsamer...

Naja, nachher ist man immer schlauer.

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.