www.mikrocontroller.net

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


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
// PIC-Header einbinden
#include <pic.h>

// *************************************************************
// Methodenprototypen
void sendeWert (uchar Was, uchar Wohin);

// ************************************************************
// Globale Variablen
static uchar Sekunden, Minuten, Stunden;
static int TimingCounter;

// *********************************************************
// Hauptmethode
void main (void) {

    // ***************************************************
  // Konfigurationsbits setzen
  __CONFIG(0x3F2A);

  // ********************************************************
  // Portspezifikationen
  #define DATA  RA2
  #define CLK    RA3
  #define DIMMER  RB3
  #define STR_MIN  RA0
  #define STR_STD  RA1
  #define SW_AN  RB0
  #define SW_STD  RB2
  #define SW_MIN  RB1

  // Tristate setzen
  // CMCON = 0b111;
  TRISA = 0b0000;
  TRISB0 = 1;
  TRISB1 = 1;
  TRISB2 = 1;
  TRISB3 = 0;

  // ********************************************************
  // Startwerte für Zeitinformationen setzen
  Stunden = 12;
  Minuten = 0;

  // ********************************************************
  // TIMER setzen
  T0CS = 0;
  PSA = 1;
  PS0 = 1;
  PS1 = 1;
  PS2 = 1;

  // Interrupt bei Timer-Überlauf auslösen
  T0IE = 1;

  // Interrupts aktivieren
  GIE = 1;

  // LEDs sollen AN sein
  DIMMER = 1;


  // ********************************************************
  // Beginn der Hauptschleife
  while (true) {


    // *********************************************
    // Daten senden
    sendeWert (Minuten, 1);
    sendeWert (Stunden, 2);

  }

}



// ***************************************************
// Interrupt-Routine
static void interrupt isr (void) {

  if (T0IF) {

  // [...]

  T0IF = 0;

    }


}

// *********************************************************
// Diese Methode sendet einen Wert (binär zerlegt) an ein Schieberegister
void sendeWert (uchar Wert, uchar Wohin) {

  int Index;

  // Wert senden
  for (Index = 8; Index >= 0; Index--) {

    if (Wert & (1 << Index)) {
      DATA = 0;
    } else {
       DATA = 1;
    }
    CLK = 1;
    CLK = 0;
  }

  // Wert übernehmen
  if (Wohin == 1) {
    STR_STD = 1;
  } else {
    STR_MIN = 1;
  }
  STR_MIN = 0;
  STR_STD = 0;

}

Jetzt hab ich Esel die Hardware aber "falschherum" an den CD4094 gebaut, 
und wollte mir die Bits andersherum senden lassen mit
//..
  int Index;

  // Wert senden
  for (Index = 0; Index <= 8; Index++) {

    if (Wert & (1 << Index)) {
      DATA = 0;
    } else {
       DATA = 1;
    }
    CLK = 1;
    CLK = 0;
  }
//..

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

Autor: Anja (Gast)
Datum:

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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, das ist ein Typo. Das soll natürlich
< 8
 heißen.

Gruß
Jens

Autor: juppi (Gast)
Datum:

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

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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.