- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: Welches Kabel für TWI (I2C) verwenden? Hilfe bei TWI Routine

  1. #11
    Gast
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hm, verstehe das Problem.

    die Antwort darauf findest du nur im Datenblatt des Sensors. Der TWI hat auch unterschiedliche Modi. Es ist zB. möglich fortlaufend Pakete zu übertragen, nach der Startadresse wird dann vermutlich automatisch hochgezählt. Ist aber nur geraten, ich hatte das Problem noch nicht, will da aber in Kürze auch hin

    Ich hab es im Moment genau anders herum, ich hab eine 16 bit Adresse. Das zumindest ist kein Problem. Wenn du die Antwort im Datenblatt nichtfindest sehe ich Montag selber mal rein, mal sehen ob ich schlau werde.

    So absolut aus dem Bauch heraus würde ich sagen...du sendest Adresse, schaltest auf Lesen -legst ein leeres TWDR auf den Bus, liest mit IN die Daten ein, speicherst ab, legst wieder ein leeres TWDR auf den Bus, liest wieder ein und bekommst damit die zweite Hälfte.
    Ist aber auch nur geraten, muß morgen erst mal einen Blick ins Datenblatt werfen.
    wie gut ist der LM75 eigentlich, ich bräuchte eventuell irgendwann was mit unter 1/10 °C Auflösung, von ca 15 - 40°C.

    byPö

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    13.07.2004
    Beiträge
    19
    Ok, hab das mal durchgesehen. Also ich bin ganz ehrlich, ich durchblick das auch nicht 100%.

    Ich denke mir mal es soll so funktionieren:

    1. Devicedresse schicken. Normalerweise bekommt die hinten ein WRITE Bit, in diesem Fall würde ich aber vermuten das sie ein READBit bekommt.
    2. Dann müßtest du theoretisch die Speicheradresse senden. Das kann wegfallen wenn der Pointer bereits auf 0 steht - wie es meistens gebraucht wird. Statt dessen sendet der LM75 wegen dem vorhergehenden READ Bit die D15-D8. Das Ack-Bit wird nicht LOW, dem System ist also irgendwie klar das es noch weitergeht.
    An der Stelle mußt du vermutlich ein STOP senden, um erst mal anzuhalten und das Datenregister auszulesen, danach legst du ein leeres Byte auf den Bus, der LM "füllt" das mit D7-D0 und dasAck Bit wird LOW als Zeichen das der Vorgang gegessen ist.

    Ich denke mir mal so das es bei diesem Auslesen günstiger wäre mit den interruptbasierten Hardware TWI zu benutzen,, in zweiter Priorität den Hardware TWI mit Polling und eher notfalls den Software TWI. Bin aber da nicht so der große Ahnungshaber, kenne nur Software TWI und Hardware Polling.

    Mich wundert allerdings das es dafür keinen fertigen Code gibt, hast du mal gesucht?

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    13.07.2004
    Beiträge
    19
    Ich bin ja auch doof, ich hab doch das Buch von Trampert da, da ist ein komplettes eräutertes Beispiel vom LM75 mit dem AT908515. Alles als Software TWI. Besord dir dasam besten mal, gibts auch CDdazu ( Bilbliothek?).

    Ist Im prinzip so ähnlich wie vermutet, du fragst ab, setzt kein AcK-bit, speicherst, und fragst nochmal ab.

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72
    Also ich hab schon viel gehört von dem Buch. Manche sagen es ist in Ordnung und andere sagen es ist einfach nur das Datnblatt ins Deutsche übersetzt. Welche Controller behandelt das Buch denn?

    Also ich hab mich jetzt nur mit dem Hardware TWI beschäftigt.
    Laut LM75 Datenblatt muss der Master ein Ack zwischen den beiden Byte's senden (Seite 12 und 10)

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72
    Also ich hab mal versucht eine Routine zu erstellen aber irgendwie bleib ich in der "Wait1"-Schleife hängen.
    Ich hab auch nicht so ganz bei den Voreinstellungen (Bit Rate, Prescaler) durchgeblickt.
    Deshalb hab ich den TWBR auf 10 und den Presccaler auf 4 gestellt (siehe ersten vier Zeilen)
    Ich habe mich nach dem MR Mode gerichtet (Seite 188 Datenblatt). Es kann sein das auch noch andere Fehler sich darin befinden.


    Code:
    	ldi temp1, 0b00001010	
    			out TWBR, temp1
    
    			ldi temp1, 0b00000001
    			out TWSR, temp1
    
    			ldi temp1, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)	;Start Befehl
    			out TWCR, temp1
    
    wait1:		in temp1,TWCR								;Wenn TWINT gesetzt ist, wurde Start übermittelt
    			sbrs temp1,TWINT
    			rjmp wait1
    			
    			in temp1,TWSR
    			andi temp1, 0xF8
    			cpi temp1, 0x08
    			brne loop
    
    			ldi temp1, 0b10010001						;Adresse des Tempsensors (SLA_R)
    			out TWDR, temp1
    			ldi temp1, 0b10000100
    			out TWCR, temp1
    			
    wait2:		in temp1, TWCR
    			sbrs temp1, TWINT
    			rjmp loop
    
    			in temp1,TWSR
    			andi temp1, 0xF8
    			cpi temp1, 0x40
    			brne loop
    			
    			in temp2, TWDR
    
    			ldi temp1, 0b11000100
    			out TWCR, temp1
    
    			in temp1,TWSR
    			andi temp1, 0xF8
    			cpi temp1, 0x40
    			brne loop
    
    			in temp3, TWDR
    
    			ldi temp1, 0b10010100
    			out TWCR, temp1
    
    			mov temp1, temp2 
    			rcall lcd_data
    
    loop:			rjmp loop

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72
    Also ich habe jetzt 3,9k Widerstände als Pull-Up's des TWI genommen. Ist das in Ordnung?

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72
    oh, ich hab mich verschrieben. Ich meine natürlich Pull-Down! (Masse)

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72
    Ah, da hab ich schon einen Fehler gefunden, ich muss den Bus über die Widerstände auf Ub legen! Also doch Pull-Up
    Sorry für die vielen posts!

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    13.07.2004
    Beiträge
    19
    ja , Wiederstände an +UBb! ic hhab 4,7k, 3,9k sollte aber auch ok sein.
    code hab ich noch nicht durch , hab immoment nur Datenblatt mega163 da, dachte die sind identisch, aber da ist TWSR völlig anders ...morgen...

    Fierabend....

  10. #20
    Benutzer Stammmitglied
    Registriert seit
    17.05.2004
    Ort
    Darmstadt
    Beiträge
    72
    Hast du schon den TWI zum laufen gebracht?
    Ich hab auf dieser Seite http://www.sprut.de/electronic/pic/g....htm#allgemein gelesen das mindestens 3mA über den Bus fliessen muss, d.h. die Widerstände 1,8k gross sein sollen.

    Noch ein paar Hinweise zu der Routine:

    Ich habe das Label ERROR durch loop ersetzt.
    Zu Testen gebe ich das erste empfangene Byte über ein Display aus, nur um zu wissen ob die Übermittliung geklappt hat.

    Um den Fehler weiter einzuschränken ersetze ich die Sprungbefehle zu loop, durch ein anderes Label. Das bedeutet wenn der µC zu dem Label springen will, springt er nicht zu loop sondern zu einem kleinen Unterprogramm das mir ein Wort auf dem LCD ausgibt. So fang ich bei dem ersten loop (Zeile 13) an und ersetze es, spiele das Programm auf den µC beobachte was passiert. Bekomme ich keine Anzeige weiss ich dass das Programm weitergelaufen ist. Dann ersetze ich denn nächsten Sprungbefehl loop und das Spiel beginnt von neuen.

    Leider hab ich den Fehler noch nicht gefunden.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad