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); } }
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/doc2564.pdf und die dazugehörige beispielapplikation http://www.atmel.com/dyn/resources/prod_documents/AVR315.zip gruss Zunge
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.