mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8 mit zwei LM75, nur einer geht


Autor: trooper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Controller Gemeinde,

ich bin gerade dabei zwei LM75 auszulesen über den HW TWI des Atmega8. 
Schreibe in ASM unter AVR Studio4.13.

Habe es mir so gedacht, dass ich zu testzwecken mir eine Vriable 
auswähle, welche die abzufragenden Adressen einfach hochzählt.
beginnend bei 90h bis 94h (Variable WAHL), dann habe ich zwei LM75 
abgefragt und die Schreib und Lese operation durchgeführt. Jeder WErt 
wird gespeichert, wobei ich momentan nur das MSB des jew. LM ins Sram 
sichere.

So, wenn ich die die Abfrage bei 90 (Sensor0) beginne funktioniert 
alles, jumperer ich den LM auf 92 um und beginne das Prog bei 92 kommen 
keine Daten geliefert.

Der Quellcode ist bei weitem noch nicht optimiert. Es geht wiegesagt 
darum, dass ich die Adresse 90/91 abfragen kann, die Adresse 92/93 geht 
nicht(Jumper beim LM gesetzt!).

Also, danke im voraus und hoffe meine Frage ist soweit verständlich :-)

#include "m8def.inc"    ;include description of PORTS
;---------------------------------------------------------------------------
;Reset and Interrupt vector      ;VNr.    Desrciption
  rjmp  main          ;1      Power on Reset
  reti              ;2      Int0-Interrupt
  reti              ;3      Int1-Interrupt
  reti              ;4      TC2 Compare Match
  reti              ;5      TC2 Overflow
  reti              ;6      TC1 Capture
  reti              ;7      TC1 Compare Match A
  reti              ;8      TC1 Compare Match B
  reti              ;9      TC1 Overflow
  reti              ;10      TC0 Overflow
  reti              ;11      SPI,STC Serial Transfer Complete
  reti              ;12      UART Rx Complete
  reti              ;13      UART Data Register Empty
  reti              ;14      UART Tx Complete
  reti              ;15      ADC Conversion Complete
  reti              ;16      EEPROM Ready
  reti              ;17      Analog Comperator
  reti              ;18      TWI (I²C) Serial Interface
  reti              ;19      Store Program Memory Ready
;---------------------------------------------------------------------------
;Start, Power On, Reset
;-----------------------------
;define PORTS, PullUp PullDown, I/O Ports
;---------------------------
;   General Purpose
.def temp    = r16
.def temp1      = r17
.def temp2      = r18
.def temp3      = r19
.def WAHL      = r20    
;---------------------------
.equ XTAL  = 3686400
;Sensoren Adressen
.equ SENSX_Akt = $92
;.equ SENS0_Write = 90
;.equ SENS0_Read  = 91
;.equ SENS1_Write = 92
;.equ SENS1_Read   = 93
;Anzahl der Temperatur Werte
.equ  TEMP_SENS = 2    ;128 Byte = 64 Werte je Sensor
;Code after every Start, REset, Power ON
main:  
;--Stackpointer init
    ldi temp, LOW(RAMEND);
    out SPL, temp;
    ldi temp, HIGH(RAMEND);
    out  SPH, temp;
    sbi  UCSRB, 3;   ;USR=UCSRB=0x0A TXEN=Bit3; Tx activated
    ldi temp, 23  ;load Baudrate 9600
    out UBRRL, temp  ;set Baudreate to register
    ldi WAHL,SENSX_Akt
neue_messung:                  ;Neue Messung einsprung
      ldi     r30,LOW(daten_sensor)          ; den Z-Pointer mit dem Start der OCR Bytes laden
        ldi     r31,HIGH(daten_sensor)
    ldi temp3,TEMP_SENS ;Schleifendurchläufe von mainloop definieren 
;Program begin
mainloop: wdr          ;Reset Watchdog
; *** I2C Start ***
        ldi    temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)    ;Vorbereiten   
        out    TWCR,temp                               ;Start Condition senden
 wait1: in     temp,TWCR                               ;Status holen
        sbrs   temp,TWINT                              ;Kommando ausgef?hrt?
        rjmp   wait1                                   ;nein -> warten
 ; *** LM 75 mit Addr=1 ansprechen ***        
        mov    temp1,WAHL  ;akutelle Adresse verwenden
        out    TWDR,temp1  ;Byte in Ausgaberegister
    ldi   temp,(1<<TWINT)|(1<<TWEN)
        out    TWCR,temp                   ;Byte senden
 
 wait2: in     temp,TWCR   ;Status holen
       sbrs   temp,TWINT  ;Kommando ausgef?hrt?
        rjmp   wait2       ;nein -> warten
 ; *** LM 75 Temperaturregister ansprechen ***
        ldi    temp1,0b00000000        ;Temperaturregister
        out    TWDR,temp1              ;Byte in Ausgaberegister
        ldi    temp,(1<<TWINT)|(1<<TWEN);Vorbereiten
        out    TWCR,temp               ;Byte senden
 
 wait3: in     temp,TWCR               ;Status holen
       sbrs   temp,TWINT              ;Kommando ausgef?hrt?
        rjmp   wait3                   ;nein -> warten

; *** erneut I2C Start senden ***
        ldi    temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)     
        out    TWCR,temp                   ;Start Condition senden
 
 wait4: in     temp,TWCR               ;Status holen
      sbrs   temp,TWINT              ;Kommando ausgef?hrt?
        rjmp   wait4                                   ;nein -> warten
; *** LM75 lesen aktivieren ***  
    inc   WAHL          ;für lesen um 1 Adresse erhöhen
        mov    temp1,WAHL                         
      out    TWDR,temp1               ;Byte in Ausgaberegister
        ldi    temp,(1<<TWINT)|(1<<TWEN)
        out    TWCR,temp                ;Byte senden

wait5:  in      temp,TWCR               ;Status holen    
        sbrs   temp,TWINT               ;Kommando ausgef?hrt?
        rjmp   wait5                    ;nein -> warten

        ldi    temp,(1<<TWINT)|(1<<TWEN)|(0<<TWEA)      ; ***1. Byte lesen MSB***
        out    TWCR,temp                                ;Flags setzen

wait6:  in     temp,TWCR                                ;Status holen
        sbrs   temp,TWINT                               ;Kommando ausgef?hrt?
        rjmp   wait6                                   ;nein -> warten
        
      in     temp1,TWDR                              ;Daten sind da MSB

        ldi    temp,(1<<TWINT)|(1<<TWEN)|(1<<TWEA)      ; ***2. Byte lesen LSB***
        out    TWCR,temp                   ;Flags setzen

wait7:  in     temp,TWCR                                ;Status holen
        sbrs   temp,TWINT                    ;Kommando ausgef?hrt?
        rjmp   wait7                       ;nein -> warten
        
      in     temp2,TWDR                              ;Daten sind da LSB

        ldi    temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)     ; ***I2C Stop senden ***
        out    TWCR,temp                                ; Stop Condition senden

      ; mov temp,temp1                                 ; ***senden 1. Byte ?ber UART ***
       
       st      Z+, temp1 ;MSB sichern in Sram
;-------NOCHMAL
;    inc WAHL ;UM Nächsten Sensor Abzufragen 
;    cpi WAHL,$94;  ;Compare ob gleich, wenn ja dann überspringe nächste instruktion wenn WAHL=94
;breq  weiter  
;brne  mainloop;    
;weiter:
  ldi WAHL,SENSX_Akt
  dec temp3;                      ; Duchläufe fertig?
  brne mainloop;                      ;NEIN-> Nochmal durchlaufen die Abfrage

  rcall putChar        ;alle Daten ausgeben  

    
end:   rjmp neue_messung      ;Repeat Program

;-----------------------------------------------
;Subroutines
;-----------------------------------------------
;Putt Characters to Output, UART
putChar:  ldi temp3,TEMP_SENS
      ldi r30,LOW(daten_sensor)          ; den Z-Pointer mit dem Start der SensorDatenBytes laden
          ldi r31,HIGH(daten_sensor)

Fertig:    
      sbis UCSRA,5     ;USR=UCSRA=0x0B UDRE=Bit5
      rjmp Fertig    ;wait until UDR is Ready
      ld   temp, Z+       ; den TempSensor Wert für Uart Nr. i holen und Z-Pointer erhöhen
      out  UDR, temp
      dec temp3  ;128 Durchlüfe erreicht?
      brne Fertig
      ret
;-----------------------------------------------
#include "timing.asm"
;-----------------------------------------------
;Datenspeichereinrichten im SRAM
.DSEG
.org 0x60                ;erste mögliche Adresse angeben
daten_sensor:    .BYTE TEMP_SENS

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nettiquette!!!
Lange Quelltexte als Anhang!

Autor: trooper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,Problem hat sich erledigt. Die Beschriftung meiner Platine != des 
Datenblattes..

mfg

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.