- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 28

Thema: I2C Adressen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    Hallo Ihr Beiden,
    habt recht vielen Dank für die für mich recht viel erklärenden Zeilen.
    Zuerst habe ich mal dem Sch...AdobeReader vom PC geschmissen, der hat mit den datenblättern alles gemacht nur nicht das was ich gern hätte. Nun kann ich auch mit dem schon immer installierten Foxid-Reader die Datenblätter besser und auch vollständig(!!!) lesen und vorallen lesegerecht ausdrucken. Weiss auch nicht wie dieser Softwareekel von Adobe sich da eingenistet hatte.
    ich werde meine Code auf meinen Webspace veröffendlichen zur Begutachtung um das Forum hier nicht so zu belasten. es wäre nett wenn Ihr Euch das dann mal anschauen würdet.
    Aber nun "studiere" ich nochmals die Datenblätter und schreib den Code danach in meine main und headerdateien..

    Eine Frage habe ich noch, obwohl sie ja allgemeiner Art vielleicht ist, finde ich irgendwo eine Erklärung zu den Funktionen der Standart AVR Libs , hier zBsp die TWI.h und den daraus ergebenden Funktionen wie TWI_Write, TWI_Read oder so ?
    Da sehe ich noch gar nicht recht durch, ja ich bin vielleicht vom Arduino noch etwas angeschlagen, wo jede Standart Lib detailiert erklärt wurde..

    Danke Euch nochmals, war/ist echt ne Hife was da geschrieben wurde !

    Gerhard
    Geändert von oderlachs (14.06.2013 um 12:47 Uhr)
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Hey,

    schau mal ob dir das hier hilft:

    http://www.atmel.com/Images/doc2565.pdf
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    Ja Kampi das habe ich schon gelesen, na ja nicht alles noch nicht verstanden...
    Nun noch eine Frage was ich nicht kapiere, bzw sicherheitshalber nachfrage ich habe die DS1307 Adresse definiert:
    Code:
    #define DS1307      0x68  // Hex
    #define...
    will ich dieses Adresse jetzt an die write funktion übergeben muss ich sie erst noch umwandeln so wie hier:
    Code:
    adresse = (DS1307 << 1)
    twi_write(adresse,wr)  // wr 0 für write , 1 für read
    {...
    if (wr) adresse |= 1; //wr =1 für lesen
    TWDR = adresse ;
    TWCR= (1<< TWEN) | (1<< TWINT); 
    while (!(TWCR & (1 << TWINT)));  // warte bis fertig
    ...}
    wie habe ich das zu verstehen und muss ich die Register Adressen auch shiften ?? : adresse = (reg_adress << 1)

    Ich weiss ich nerve mit saudummen Fragen, abver irgendwann muss ich ja mal das kapieren, die Grundsätze wenigstens..

    Danke

    Gerhard

    Nachtrag : kampi habe mir eben das PDF doku ausgrdruckt, denke das ich da was von verstehe und anwenden kann....
    Geändert von oderlachs (14.06.2013 um 14:51 Uhr)
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Hey,

    naja so sau dumm ist die Frage nicht
    Die Adresse die im Datenblatt steht (in deinem Fall die 0x68 ) ist die Grundadresse, sprich OHNE Read/Write Bit.
    Das heißt für eine komplette Adresse musst du das Read/Write Bit noch anhängen und das ist ja immer unterschiedlich, je nachdem ob du Lesen oder Schreiben willst.
    Ergo wird das Bitmuster für die 0x68 um eine Stelle nach links geschoben.
    Dadurch wird das Read/Write Bit automatisch mit einer 0 gefüllt und du musst es im Falle eines schreibenden Zugriffs nur noch auf 1 setzen (das machst du, indem du die Adresse mit einer 0x01 verODERst).
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    Also , ich habe kapituliert vorerst und weil es drängte mit der Zeit, erstmal eine Bascom Software geschrieben(holprigerweise). Da klappt es wunderbar mit dem Auslesen der Zeit.
    Ich kann's einfach nicht begreifen.
    Die Adressenzuordnung stimmt schon , aber ich bekomme einfach nicht die Zeit ausgelesen vom DS1307.
    Ich schreibe die I2C Adr + 1 für Lesen,dann die Registeradresse, und überneme dann die Daten vom Datenregister als Datenwert...aber nix sinnvolles kommt dabei raus.
    Natürlich Wird auch noch TWI_INIT, TWI_START,TWI_STOP entsprechend durchgeführt.

    Gerhard, mit hängendem Kopfe..

    Nachtrag: Ich habe mir dieses Beispiel als Vorlage genommen zum Test, ohne das Setzen der UHR (Auskommentiert) wollte nur sec,min,hr auswerten. Das RTC ist mit aktueller Zeit versorgt
    Geändert von oderlachs (16.06.2013 um 08:46 Uhr)
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von oderlachs Beitrag anzeigen
    Ich schreibe die I2C Adr + 1 für Lesen,dann die Registeradresse, und überneme dann die Daten vom Datenregister als Datenwert...aber nix sinnvolles kommt dabei raus.
    Ich hab Dir das schon mal geschrieben und auch wenn Du's nicht gerne hörst: Wenn Du Dir von einer Diskussion mehr erwartest, dann müsstest Du mehr darauf eingehen.
    Hier z.B. Deinen Bascom-Code und Deinen C-Code zeigen, dann kann man sagen, was Du falsch machst.
    Natürlich Wird auch noch TWI_INIT, TWI_START,TWI_STOP entsprechend durchgeführt.
    Ein Beschreibung eines Codes, sei's Prosa oder nicht, taugt nichts. Nur der Code selbst taugt.
    Nachtrag: Ich habe mir dieses Beispiel als Vorlage genommen zum Test, ohne das Setzen der UHR (Auskommentiert) wollte nur sec,min,hr auswerten.
    Wieso nimmst Du ein Beispiel, dass erklärtermaßen seitens des TE dort nicht funktioniert? Er schreibt, dass er den Code erfolgreich compiliert hat, er schreibt auch dass er nicht läuft.

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    Hallo MagicWSmoke !
    Im Posting 12 also genau vor Deiner Antwort ist ein Link zu dem Beispiel, das ich nutze und hier nochmals in wiederholter Form:
    Nachtrag: Ich habe mir dieses Beispiel als Vorlage genommen zum Test, ohne das Setzen der UHR (Auskommentiert) wollte nur sec,min,hr auswerten. Das RTC ist mit aktueller Zeit versorgt
    Nur ist ein Unterschied, das bei mir der PortB.0 bei HR= 8 und MIN = 30 von HIGH zu LOW wechseln ...
    also:
    Code:
    HR_D = BCD2DEC(hr);    // Zeit von BCD Code in Dezimal umwandeln
    MIN_D = BCD2DEC(min); // Zeit von BCD Code in Dezimal umwandeln
     if ((HR_D == 0x08)  &&  (MIN_D  == 0x1E)) PORTB =0xFE
    else PORTB = 0xFF;
    if ((HR_D == 0x08) && (MIN_D  == 0x1F)) PORTB =0xFD;
    else PORTB = 0xFF;
    Mein Code zur Auswertung mal angedeutet, ohne die aber vorhandenen(!!!) Funktionen BCD2DEC dargestellt, also da kann ich nix auswerten. Es sei denn ich initialisiere selber die Zeitvariablen mit dem entsprechenden wert, dann geht es.
    Ich hoffe das reicht nun zur Erklärung...

    Nachtrag: Um allem gerecht zu werden hier nun der komplette Code den ich verwende und der nicht geht, d.h. keine Auswertung an PortB0,PortB1 möglich...
    Code:
    /* ========================================================================== */
    /*                                                                            */
    /*   zeitauswertung DS1307 / ATMEGA16 an PortB Pin B0 + B1                    */
    /*                                                                            */
    /* ========================================================================== */
    
    #define F_CPU 1600000UL
    
    #include<avr/io.h>
    #include<util/delay.h>
    
    
    void rtc_init(void)
    {
    TWSR=0x00;
    TWBR=0x98;
    TWCR=0x04;
    
    }
    
    void rtc_start(void)
    {
    // sende START Bedingungen
        TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    
        // warte bis fertig...
        while(!(TWCR & (1<<TWINT)));
    }
    
    
    
    unsigned char rtc_read(void)
    {
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR & (1<<TWINT)));
    return(TWDR);
    }
    
    void rtc_write(unsigned char data)
    {
    TWDR=data;// sending address
    TWCR=(1<<TWINT)|(1<<TWEN);
    // warte bis fertig...
        while(!(TWCR & (1<<TWINT)));}
    
    void rtc_stop()
    {
    TWCR=(1<<TWINT)|(TWSTO)|(1<<TWEN);
    // warte bis fertig...
        while(!(TWCR & (1<<TWINT)));
    }
    /* ========================================================================== */
    /*                                                                            */
    /*                          DEZIMAL ZU BCD // Uhr Stellen                     */
    /*                                                                            */
    /* ========================================================================== */
    char dez_to_bcd(char num)
    {
    return ((num/10 * 16) + (num % 10));
    }
    /* ========================================================================== */
    /*                                                                            */
    /*                          BCD zu DEZIMAL // UHR LESEN                       */
    /*                                                                            */
    /* ========================================================================== */
    char bcd_to_dez(char num)
    {
    return ((num/16 * 10) + (num % 16));
    }
    /* ========================================================================== */
    /*                                                                            */
    /*                                                                            */
    /*                                                                            */
    /* ========================================================================== */
    int main(void)
    {
    unsigned char sec,min,hr,HR_D,MIN_D;
    
    DDRB=0xFF;
    
    
    rtc_init();
    _delay_ms(1000);
    
    rtc_start();
    /// Zeit zum Test auf 0,5 min vor Schaltvorgang setzen
    rtc_write(0b11010000);   // 1101000=adress of ds1307 and bit 0= write   
    rtc_write(0x00);  // pointing address location 00 i.e seconds
    rtc_write(0x1E);// set sec=30
    rtc_write(0x1D);// set min=29
    rtc_write(0x08);// set hr=8
    
    rtc_stop();
    
    
    while(1)
    {
    
    rtc_start();
    rtc_write(0b11010001);   // 1101000=adress of ds1307 and bit 1= read   
    rtc_write(0x00);  // pointing address location 00 i.e seconds
    sec=rtc_read();
    rtc_stop();
    _delay_ms(50);           // etwas warten
    
    rtc_start();
    rtc_write(0b11010001);   // 1101000=adress of ds1307 and bit 1= read   
    rtc_write(0x01);         // pointing address location 01 i.e minute
    min=rtc_read();
    rtc_stop();
    _delay_ms(50);           // etwas warten
    
    rtc_start();
    rtc_write(0b11010001);   // 1101000=adress of ds1307 and bit 1= read   
    rtc_write(0x02);         // pointing address location 02 i.e hours
    hr=rtc_read();
    rtc_stop();
    _delay_ms(50); // etwas warten
    
    // Zeit decodieren und auswerten
    HR_D  = bcd_to_dez(hr);    // Zeit von BCD Code in Dezimal umwandeln
    MIN_D = bcd_to_dez(min); // Zeit von BCD Code in Dezimal umwandeln
     if ((HR_D == 0x08)  &&  (MIN_D  == 0x1E)) PORTB =0xFE;
    else PORTB = 0xFF;
    if ((HR_D == 0x08) && (MIN_D  == 0x1F)) PORTB =0xFD;
    else PORTB = 0xFF;
    }
    }
    Woher das Grundgerüst ist , findet man unter den oben erwähnten Link.
    Gerhard
    Geändert von oderlachs (16.06.2013 um 16:14 Uhr)
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

Ähnliche Themen

  1. [ERLEDIGT] PCA 8574 M-Unit findet zwei I2C-Adressen am China LCD ????
    Von meistervolker im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 3
    Letzter Beitrag: 29.07.2011, 18:21
  2. Cortex M3 Programcounter Adressen
    Von Siro im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 2
    Letzter Beitrag: 11.06.2010, 15:39
  3. #define und adressen setzten in asm30 - dspic
    Von Pitt1986 im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 10.06.2008, 20:13
  4. Bootloader Adressen
    Von geronet im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 10.02.2007, 21:27
  5. Adressen im hex file
    Von MAXXX im Forum PIC Controller
    Antworten: 3
    Letzter Beitrag: 21.08.2005, 20:01

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen