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