www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Projekt: Temperaturanzeige


Autor: Franz F. (celsiusw370)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich spiele schon eine ganze weile mit Microcontroller herum. Zuerst mit 
der Arduino-Plattform, die meine Lust auf mehr weckte und jetzt mit 
"selbsgebastelten" Boards mit AVR-Controller. Nun habe ich ein Board 
entwickelt und bereits aufgebaut, dass die Temperatur mit einen 
digitalen Temp.-Sensor misst und über zwei 7-Segment-Anzeigen ausgeben 
soll. Die Siebensegment-Anzeigen werden jeweils über 2 M74HC5981 
Schieberegiester angesteuert.

Nun habe ich das Problem das ich es momentan nicht hinbekomme die 
Schieberegiester anzusteuern. Habe das Datenblatt ausführlich gelesen. 
Welche PINs High, welche LOW sein müssen, wo der Impuls von LOW -> HIGH
angelegt werden muss.

Als Controller verwende ich einen AVR Attiny 2313.

Es soll Software-SPI werden, da ich die PINs für Hardware SPI irgendwie 
nicht direkt finden konnte.(Außerdem unterstütz der 2313 doch kein 
Hardware SPI sondern "nur" USI?)

Der Schaltplan ist jetzt nicht so schön aber er müsste lesbar sein! (=

Der Code sieht momtentan so aus:
#include <avr/io.h>
#include <avr/delay.h>

#define F_CPU 8000000 /** MAX: _delay_ms(32,76) **/
#define MAX_DELAY 32.76

#define SCLR     3
#define SI       2
#define RCK      1
#define SCK      0
#define SHIFTPort   PORTB
#define SHIFTReg  DDRB

uint8_t BIT;


inline void NoEndLoop();

inline void initSHIFTRegister();
inline void Schiebe_1Bit();


int main(){

  DDRA  = 0b101; 
  PORTA = 0b010; /** Signal LED einschalten **/

  initSHIFTRegister();

  NoEndLoop();
  /**

  Wird Nie erreicht!

  **/
return 0;
}

inline void NoEndLoop(){

  BIT = 1;

  while(1)
  {

    
      Schiebe_1Bit();
      Schiebe_1Bit();
      Schiebe_1Bit();
      Schiebe_1Bit();
        Schiebe_1Bit();
      Schiebe_1Bit();
      Schiebe_1Bit();
      Schiebe_1Bit();
        Schiebe_1Bit();
      Schiebe_1Bit();
      Schiebe_1Bit();
      Schiebe_1Bit();
        Schiebe_1Bit();
      Schiebe_1Bit();
      Schiebe_1Bit();
      Schiebe_1Bit();
  
    //Alle LEDs einschalten
    
    SHIFTPort |= (0 << RCK);
    _delay_ms(MAX_DELAY);
    SHIFTPort |= (1 << RCK);
    _delay_ms(MAX_DELAY);

  }
}

/******************************************************************************************************************************************************************************/

inline void initSHIFTRegister(){

  SHIFTReg = 0xFF;
  SHIFTPort = 0b00001000;  // SCLR Port auf High schalten um Werte setzen zu können

}

inline void Schiebe_1Bit(){

  SHIFTPort |= (BIT << SI);
  _delay_ms(MAX_DELAY);
  SHIFTPort |= (0 << SCK);
  _delay_ms(MAX_DELAY);
  SHIFTPort |= (1 << SCK);
  _delay_ms(MAX_DELAY);

}


Es kann sein das die PINs im Code nicht mit der Skizze übereinstimmen, 
da ich die Skizze ziemlich schnell gemacht habe! (=


Schonmal Danke für euere Hilfe!!


Gruß
Franz

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Franz Fries schrieb:

> inline void Schiebe_1Bit(){
>
>   SHIFTPort |= (BIT << SI);
>   _delay_ms(MAX_DELAY);
>   SHIFTPort |= (0 << SCK);


Ähm.
So löscht man aber kein Bit

    SHIFTPort &= ~(1 << SCK );

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke nicht, dass das hier

> inline void Schiebe_1Bit(){
>
>   SHIFTPort |= (BIT << SI);

das macht, was du willst.

   if( BIT )
     SHIFTPort |= ( 1 << SI );
   else
     SHIFTPort &= ~( 1 << SI );

Und an dieser Stelle darf das auszugebende Bit ruhig Funktionsargument 
sein und muss keine globale Variable sein. Die Aufrufe der Funktion und 
ob da jetzt eine 1 oder eine 0 ausgegeben werden soll, wird dann um 
einiges klarer
inline void Schiebe_1Bit( uint8_t Bit ){

   if( Bit )
     SHIFTPort |= ( 1 << SI );
   else
     SHIFTPort &= ~( 1 << SI );

  _delay_ms(MAX_DELAY);

  SHIFTPort &= ~(1 << SCK);
  _delay_ms(MAX_DELAY);
  SHIFTPort |= (1 << SCK);
  _delay_ms(MAX_DELAY);
}

Die Aufrufe sehen dann so aus:
  while(1)
  {
      Schiebe_1Bit( 1 );
      Schiebe_1Bit( 1 );
      Schiebe_1Bit( 0 );
      Schiebe_1Bit( 1 );
      Schiebe_1Bit( 0 );
      Schiebe_1Bit( 1 );
      Schiebe_1Bit( 0 );

      ...

und du musst in Gedanken nicht mehr mitverfolgen, wie jetzt gerade BIT 
steht um zu wissen, ob da jetzt ein 1 Bit oder ein 0 Bit ausgegeben 
wird.


PS: Beim RCK musst du natürlich das 0-setzen auch ändern.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf deinem Schaltplan stimmt was nicht.
Das obere SR hat 2 SI Eingänge. Das kann nicht sein. Bei 2 kaskadierten 
SR können niemals alle 4 Steuerleitungen einfach komplett parallel zur 
ansteuernden Schaltung laufen.

Autor: Franz Fries (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja der Schaltplan hat einen Fehler bitte einfach ignorieren!!(Das ist 
nicht wirklich so angeschlossen!)



Danke

Werde es mal ausprobieren!!!

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du dir in Zukunft etwas Arbeit und Platz auf der Platine
sparen willst. es gibt auch Widerstandsnetzwerke, z.B.
http://such001.reichelt.de/?SID=28iKqAZawQARwAACXH...

Autor: Franz F. (celsiusw370)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

jetzt habe ich den Code umgebaut. Es funktioniert leider trotzdem nicht!

Irgendwas sehe ich einfach nicht!

Vll. sieht einer meinen Fehler. Habe mal die Wahrheitstabelle 
hochgeladen.
#include <avr/io.h>
#include <avr/delay.h>

#define MAX_DELAY 32.76

#define SCLR     3
#define SI       2
#define RCK      1
#define SCK      0
#define SHIFTPort   PORTB
#define SHIFTReg  DDRB


void NoEndLoop();

void initSHIFTRegister();
void Schiebe_1Bit( uint8_t Bit );


int main(){

  DDRA  = 0b101; 
  PORTA = 0b010; /** Signal LED einschalten **/

  initSHIFTRegister();

  NoEndLoop();
  /**

  Wird Nie erreicht!

  **/
return 0;
}

void NoEndLoop(){
  while(1)
  {
    SHIFTPort &= ~(1 << SCLR); 
    _delay_ms(MAX_DELAY);
    SHIFTPort |= (1 << SCLR);
    _delay_ms(MAX_DELAY);


   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);
   Schiebe_1Bit(1);

  _delay_ms(MAX_DELAY);

  SHIFTPort &= ~(1 << RCK);
  _delay_ms(MAX_DELAY);
  SHIFTPort |= (1 << RCK);
  _delay_ms(MAX_DELAY);

  }
}

/******************************************************************************************************************************************************************************/

void initSHIFTRegister(){

  SHIFTReg = 0xFF;
  SHIFTPort = 0b00001000;  // SCLR Port auf High schalten um Werte setzen zu können

}

void Schiebe_1Bit( uint8_t Bit ){

   if( Bit )
     SHIFTPort |= ( 1 << SI );
   else
     SHIFTPort &= ~( 1 << SI );

  _delay_ms(MAX_DELAY);

  SHIFTPort &= ~(1 << SCK);
  _delay_ms(MAX_DELAY);
  SHIFTPort |= (1 << SCK);
  _delay_ms(MAX_DELAY);

}



Gruß
Franz


P.S. Das mit den Widerstandsnetzwerke ist ein guter Tipp hate leider 
keine Daheim und wollte nicht nur wegen Wiederständen beim Reichelt 
einkaufen

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.