Hallo, ich versuche seit einigen Tagen erfolglos einen 16 Bit AD Wandler aus dem Hause analog anzusprechen. Ich programmiere in C mit Codevision. Mein Quellcode ist unten. 1. Vermutung: die Slave Adresse ist nicht richtig gesetzt. Laut Datenblatt ist das 1001000. Aber auf ein i2c_write(adress) kommt kein ack. 2. Vielleicht ist es auch ein Hardware Problem, der den ich habe hat leider ein sehr kleines SMD Package, was ich mir zwar mit draht auf einen 8 Pol IC sockel adaptiert habe, aber wer weiß ob da ein Problem ist..ich kann mit dem Oszi kein rechteck auf scl feststellen. liegt das direkt nach init an? Pullup sind drin. Fällt einem noch ein i2c 16Bit AD Wandler mit DIP gehäuse ein? Code: #include <mega16.h> // I2C Bus functions #asm .equ __i2c_port=0x18 .equ __sda_bit=0 .equ __scl_bit=1 #endasm #include <i2c.h> // Standard Input/Output functions #include <stdio.h> #define adress 0b1001000 #define read 0b10111100 void main(void) { unsigned int help=0, data1, data2; // Port B initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTB=0x00; DDRB=0x00; / // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x67; // I2C Bus initialization i2c_init(); while (1) { // Place your code here help=i2c_start(); printf("\n\nStart1 = %u",help); help = i2c_write(adress); printf("\n\nadresse1 = %u",help); help = i2c_write(read); printf("\n\nregister = %u",help); help=i2c_start(); printf("\n\nStart2 = %u",help); help = i2c_write(adress); printf("\n\nRead_adress = %u",help); data1 = i2c_read(1); data2 = i2c_read(0); i2c_stop(); printf("\nData: %u %u",data1, data2); }; }
Hi, hab das Datenblatt und deinen Code nur überflogen. denke deine ansprech routine für den chip stimmt nicht. hier mal mein code: i2c_start(); i2c_write(0x68); //Adresse senden i2c_write(0x61); // Konfigurationsbyte i2c_stop(); i2c_start(); i2c_write(0x69); //Adresse zum lesen senden value = i2c_read(); //Daten lesen value1 = i2c_read(0); //Daten lesen i2c_stop(); so funktioniert das bei mir. ich denke das solte dir helfen. mfg Beginner
Ja, ich habe es ja fast so. nur woher hast du die Adresse 68 und zum lesen 69? ich dachte cavr setzt automatisch ob gelesen oder geschrieben werden soll.. wie hast du die Adressbits am Baustein? ich habe beide log. 0. Danke schonmal, Sven
"ich dachte cavr setzt automatisch..." Wenn man schon schwarze Kistchen aufeinander stapelt, dann sollte man wenigstens auch deren Funktionsbeschreibung lesen und nicht "denken" wie es sein könnte. Ich hege ja eine Abneigung gegen Black-Boxes, da ich nicht glaube, daß sie 100% fehlerfrei programmiert sind (weil ich selber auch mal Fehler mache). Solch einfache Sachen wie I2C programmiere ich daher selber. Peter
Ok. ich würde es vielleicht auch selbst machen. aber hier habe ich nicht ganz soviel zeit. und konnte schon mehrfach lesen das i2c von cavr gut funktioniert. Ich möchte hier auch keine Diskussion ob man alles per hand coden sollte oder nicht. jeder so wie er es mag. Ok, ich gebe es zu, ich habe es gelesen, aber falsch verstanden. manchmal stellt man sich etwas anders vor als es ist. Ich freue mich jedenfalls das ich dieses Forum kenne wo ich konstruktive Beiträge verfassen und hilfreiche Antworten bekommen. Mit freundlichen Gruß, Sven
Hi, ähm, das war jetzt nicht der Code den du benutzen sollst. Das ist der Code wie ich ihn beim PIC benutze! Die Adresse ist für einen anderen Chip. Wie sich der avr verhält weiß ich nicht, da ich ihn nicht kenne. Mfg Beginner
HAllo, ich nochmal.. Kann ihn jetzt ansprechen, es lag an einem Hardwareproblem (schäm..) Der Code ist fast richtig, nur wie schon oben gesagt man muss ihn für schreiben und lesen unterschiedlich adressieren. Das nächste Problem: ich bekomme ja zwei 8 Bit worte zurück. wie packe ich die jetzt in eine Int Zahl? ICh will ja meine Spannung berechnen und laut Datenblatt ist der min Code −32,768 das verstehe ich so dasa das 0V entspricht und 32,767 der Referenzspannung. Ich habe es mit zahl = (upper<<8) | lower; probiert, aber irgendwie kommt das nicht hin.. Was mache ich falsch? Danke schonmal.
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.