PIC16F627A: Probleme mit Schieberegister-Ansteuerung

Gast #1511379
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
Gast #1511502
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.