www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DS1624s mit ATmega128l


Autor: Don Geilo (dongeilo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!
Habe folgendes Problem.

Ich möchte gerne mit einem ATMega128L, über den TWI Bus, die Temperatur 
aus einem DS1624S Temperatursensor auslesen. Leider klappt es nicht so 
wie ich es mir vorstelle. Es wäre schön, wenn Ihr mir helfen könntet. 
Vielen Dank!

Mein Quellcode sieht so aus:

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdio.h>
#include "lcd.h"
#include "twi.h"

#include "atmega128l.h"

#ifndef F_CPU
#define F_CPU 8000000UL
#endif

#define SCL_CLOCK  90000L



void twi_start (void) {
  TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWSTA)|(1<<TWEN);
  while (!(TWCR &(1<<TWINT)));
  }
void twi_stop (void) {
  TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWSTO)|(1<<TWEN);
  while (!(TWCR &(1<<TWINT)));
  }
void twi_write (unsigned char data) {
  TWDR = data;
  TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN);
  while (!(TWCR &(1<<TWINT)));
  }

void twi_init (void) {
  DDRD  = 0x00;     // PD1 (SDA) und PD0 (SCL) auf Input
  PORTD |= (1<<PD1)|(1<<PD0);          // mit Pullups
  TWSR = 0;
  TWBR = 37;//((F_CPU/SCL_CLOCK)-16)/2;
  TWCR = (1<<TWEA)|(1<<TWEN);   // enable TWI
  //Temperaturmessung starten
  twi_start();
  twi_write(0b10010010);  // ID=1001, Addr.=001, Write=0
  twi_write(0xEE); // Start conversion
  twi_stop();
  }

unsigned char twi_read (void) {
  TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN);
  while (!(TWCR &(1<<TWINT)));
  return TWDR;
  }
int ds_read_temp (void) {
  union {unsigned char data[2]; int value;} u;
  twi_start();
  twi_write(0b10010010);  // ID=1001, Addr.=001, Write=0
  twi_write(0xAA);        // Command: Read Temperature
  twi_start();
  twi_write(0b10010011);  // ID=1001, Addr.=001, Read=1
  u.data[1] = twi_read(); // high Byte
  u.data[0] = twi_read(); // low Byte
  twi_stop();
  return u.value/8;
  }





int main()
{


  char buffer[15];
  int temp = 0;

  lcd_init(LCD_DISP_ON);

  twi_init();    //an dieser Stelle bleibt der µC hängen


  while(1)
  {

    lcd_clrscr();

    temp = ds_read_temp();

                //Umwandlung für Display Darstellung

                itoa(temp, buffer, 10);

    lcd_clrscr();
     lcd_gotoxy(0,0);
     lcd_puts("Temperatur");
    lcd_gotoxy(0,1);
    lcd_puts(buffer);
    lcd_gotoxy(4,1);
    lcd_puts("Grad");

    _delay_ms(1000);
  }
}

Autor: Claudio Fos (zunge)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Immer diese while(xxx) schleifen ... auch busywaits genannt ...

probiers doch per interrupt ...
atmel hat da irgendwo ein appnote für twi master und twi slaves

http://www.atmel.com/dyn/resources/prod_documents/...

und die dazugehörige beispielapplikation

http://www.atmel.com/dyn/resources/prod_documents/AVR315.zip

gruss Zunge

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.