www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega16, Ds1621, Display


Autor: Thorsten B. (thober)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C-Code

Da ich noch der Anfänger in µController bin, habe ich eine Frage zu 
diesem Projekt:

Ich möchte eine Temperatur-Wert des DS1621 über der I2C zum Atmega16 
geben und ihn über das Display ausgeben!

In die Display Ansteuerung habe ich mich schon eingearbeitet, mein 
Problem liegt im bereich des DS1621 und dem I2C.

Gibt es ein deutsches HowToDo, oder eine deutsche I-Net-Seite wo man 
gute Infos bekommt? Über die SuFu habe ich schon geschaut aber ich habe 
nicht gefunden was mir Persönlich weiter geholfen hat.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tip: komm erstmal mit MC im allgemeinen und AVR im speziellen
zurecht (Tutorial!), dann hilft es dir auch über die Suchfunktion
andere Beispiele zu I2C zu verstehen.
Der Rest ergibt sich dann wie von Zauberhand, oder evtl. mit
Nachfragen im Forum.

Es macht keinen Sinn, gleich mit einem Projekt anzufangen, wenn
man noch bei 0 steht. Dazu müsste jemand dir ein Tutorial genau
für dein Projekt schreiben.
Das verlangst du nicht wirklich, oder?

Es gibt hier bereits das eine oder andere Beispiel zu I2C.
Was genau hast du nach aufmerksamem Lesen daran nicht verstanden?

Autor: Thorsten B. (thober)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich habe jetzt die Lib vom Peter Fleury eingebunden.

Ich möchte mir die Temperatur erst mal in ganzen Grad Zahlen anzeigen 
lassen also muss ich mir ja das höherwertige byte anschauen.
Aber leider Zeigt mir mein Display nur 255Grad an.

Bin ich denn Ansatz weise auf dem richtigen Weg?
Ist halt learning by doing bei mir!

#include <avr/io.h>
#include "lcd-routines.h"
#include <stdlib.h>
#include <util/delay.h>
#include "i2cmaster.h"
#include "twimaster.c"
#define F_CPU 16000000L
#endif
#define DS1621_Write  0x90
#define DS1621_Read   0x91

void ds1621_einschalten()
  {
    i2c_init();                              
      i2c_start(DS1621_Write);  
    i2c_write(0xEE);
    i2c_stop();
    i2c_start(DS1621_Read);
      i2c_write(0xAA);
      i2c_stop();
  }
///*******************************************************************/////
int main(void)
{

  ds1621_einschalten();
  uint8_t TempH, TempL;
   _delay_ms(800);      
  i2c_start(DS1621_Read);

         TempH = i2c_readAck();
         TempL = i2c_readNak();
                
    // Initialisierung des LCD
    lcd_init();

  // Die Ausgabemarke in die 2te Zeile setzen
   lcd_setcursor( 0,2 );
 
   // erneut Text ausgeben, aber diesmal komfortabler als String
    lcd_string("Ist Temp");

    // Die Ausgabemarke in die 2te Zeile setzen
   lcd_setcursor( 0,3 );  


  char Buffer[20];
    uint8_t i = TempH;
 
    itoa( i, Buffer, 10 );
    lcd_string( Buffer ); 

  lcd_string("Grad");

while(1)
  {
  }
  return 0;
}

: Bearbeitet durch Moderator
Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Quellcode ist so nicht übersetzbar (Fehler: #ifndef F_CPU fehlt)

Ansonsten vgl. (Atmega8, DS1621) 
http://www.mikrocontroller.net/articles/Pollin_Fun...

Hardware richtig angeschlossen (Schaltplan)?
# Dein Quellcode setzt zwei externe Pull-up Widerstände am I2C-Bus 
voraus.
# Die I2C-Adresse des DS1621 setzt voraus: A0, A1 und A2 des DS1621 mit 
GND verbunden

// Atmega16 @ 16 MHz
#include <avr/io.h>
#include <stdlib.h>

#ifndef F_CPU
#define F_CPU 16000000L // vor #include <util/delay.h>
#endif
#include <util/delay.h>

#include "i2cmaster.h"
#include "lcd-routines.h"

// besser: Als Quelldatei ins Projekt aufnehmen 
#include "twimaster.c"

// Hardware: A0, A1 und A2 am DS1621 mit GND verbunden
#define DS1621_Write  0x90
#define DS1621_Read   0x91

void ds1621_einschalten(void)
{
  i2c_init();
  i2c_start(DS1621_Write);
  i2c_write(0xEE);
  i2c_stop();
  i2c_start(DS1621_Write); // <== nicht Read!
  i2c_write(0xAA);
  i2c_stop();
  _delay_ms(200); // <== Gerätespezifisch, deshalb hier
}

int main(void)
{
  // Initialisierung des LCD
   _delay_ms(800); // <== Notwendig?
  lcd_init();

  // Die Ausgabemarke in die 2te Zeile setzen
  lcd_setcursor( 0,2 );
  // erneut Text ausgeben, aber diesmal komfortabler als String
  lcd_string("Ist Temp");

  ds1621_einschalten();

  while(1)
  {
    int16_t temperatur;
    
    // Temperatur von DS1621 abfragen
    i2c_start(DS1621_Read);
    temperatur = i2c_readAck(); // <== int16_t Rückgabewert
    i2c_readNak();
    i2c_stop(); // <==

    // Temperatur ausgeben
    lcd_setcursor( 0,3 ); // Ausgabemarke auf 3. Zeile
    {
      char Buffer[20];
      itoa( temperatur, Buffer, 10 );
      lcd_string( Buffer );
    }
    lcd_string(" Grad");
  }
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anm.: Bei der Abfrage habe ich vielleicht einen Bock drin! i2c_readAck() 
der Fleury-Library liefert einen 8-Bit Rückgabewert.
http://homepage.hispeed.ch/peterfleury/group__pfle...

Ob der 8-Bit Rückgabewert auf 16-Bit erweitert direkt der Temperatur 
entspricht (so wie in deinem Quellcode und im verlinkten 
Pollin-Beispiel), müsste ich mir erst wieder im Datenblatt des DS1621 
ansehen. Zu lange her...

EDIT 1: Beitrag "Re: Problem beim auslesen den IIC"
EDIT 2: In der while() Schleife moch eine Wartefunktion (_delay_ms()) 
einbauen, um den Sensor nur in gewissen Zeitabständen abzufragen.

Autor: Thorsten B. (thober)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke schon mal für die Antwort,

A1 A2 A3 vom DS1621 liegen an Masse,
Pull up Widerstände sind drin siehe Schaltplan.

den MAX 485 wir erstmal vernachlässigt!

Als Anlage mal den Schaltplan und mein Projekt!

Autor: Thorsten B. (thober)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So mit dem jetzigen Code Zeigt er 123 Grad an!

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

Bewertung
0 lesenswert
nicht lesenswert
Thorsten B. schrieb:
> So mit dem jetzigen Code Zeigt er 123 Grad an!

Und was ist dein jetziger Code?

Um 14:20 hattest du diesen Fehler noch im Code
void ds1621_einschalten(void)
{
  i2c_init();                              

  i2c_start(DS1621_Write);  
  i2c_write(0xEE);
  i2c_stop();

  i2c_start(DS1621_Read);
  i2c_write(0xAA);
  i2c_stop();

  _delay_ms(200);
}

Die 2.te Sequenz muss ebenfalls ein Write sein und kein Read.

Autor: Thorsten B. (thober)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die 2.te Sequenz muss ebenfalls ein Write sein und kein Read.


Ja, vielen vielen Dank!!!

Es Klappt!

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

Bewertung
0 lesenswert
nicht lesenswert
Thorsten B. schrieb:
>> Die 2.te Sequenz muss ebenfalls ein Write sein und kein Read.
>
>
> Ja, vielen vielen Dank!!!

Ich hab nicht mehr dazu getan, als Stafans Antworten zu lesen und das 
Programm zu studieren, das er für dich korrigiert hat
Beitrag "Re: Atmega16, Ds1621, Display"

Autor: Thorsten B. (thober)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich auch besten Dank an Stefan er hatte ja die Lösung geschrieben 
aber das "WRITE" hatte ich übersehen!

Schön das Ihr die Gedult habt, einen Anfänger hier so zu unterstüzen!
Echt vielen Dank!!

Autor: T. F. (n3ssaja)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bin gerade auch dabei den Temperatursensor DS1621 an meinen ATMega 
128 anzuschließen. Auch ich habe dafür die Libary von Peter Fleury 
eingebunden und die main Funktion wie oben dargestellt.

Leider buggt mein Programm bereits nach diesem Befehl:
 i2c_start(DS1621_Write);  

denn die Funktion gibt eine 1 zurück. Hardwaretechnisch habe ich die 
Adresspins alle auf Masse gelegt.

Folgende Fragen stellen sich mir jetzt:

1) Bei dem ATMega 128 liegt SCL an PD0 und SDA an PD1. Wie muss ich das 
DDRD konfigurieren? Als Eingang oder Ausgang? Muss ich sonst noch was 
für PortD beachten?

2) Der ATMega 128 hat ein Systemtakt von 16MHz. Was genau muss ich dann 
bei der Initialisierung des I2C Bus beachten?

Kann mir da jemand weiterhelfen?

Schonmal Danke vorab.

Autor: Manuel X. (scratliner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
genau zu diesem Baustein hab ich eine Frage.
Wie erstelle ich im LCD 2. Zeile links einen "min" Wert, in der mitte 
den aktuellen wert und rechts den max wert?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. kapert man nicht fremde Threads
2. solltest du auch sagebn, welchen der hier vokommenden Bausteine du 
brauchst
3. steht doch alles in Beispielen und im Tutorial.

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.