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


von trooper (Gast)


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 :-)

1
#include "m8def.inc"    ;include description of PORTS
2
;---------------------------------------------------------------------------
3
;Reset and Interrupt vector      ;VNr.    Desrciption
4
  rjmp  main          ;1      Power on Reset
5
  reti              ;2      Int0-Interrupt
6
  reti              ;3      Int1-Interrupt
7
  reti              ;4      TC2 Compare Match
8
  reti              ;5      TC2 Overflow
9
  reti              ;6      TC1 Capture
10
  reti              ;7      TC1 Compare Match A
11
  reti              ;8      TC1 Compare Match B
12
  reti              ;9      TC1 Overflow
13
  reti              ;10      TC0 Overflow
14
  reti              ;11      SPI,STC Serial Transfer Complete
15
  reti              ;12      UART Rx Complete
16
  reti              ;13      UART Data Register Empty
17
  reti              ;14      UART Tx Complete
18
  reti              ;15      ADC Conversion Complete
19
  reti              ;16      EEPROM Ready
20
  reti              ;17      Analog Comperator
21
  reti              ;18      TWI (I²C) Serial Interface
22
  reti              ;19      Store Program Memory Ready
23
;---------------------------------------------------------------------------
24
;Start, Power On, Reset
25
;-----------------------------
26
;define PORTS, PullUp PullDown, I/O Ports
27
;---------------------------
28
;   General Purpose
29
.def temp    = r16
30
.def temp1      = r17
31
.def temp2      = r18
32
.def temp3      = r19
33
.def WAHL      = r20    
34
;---------------------------
35
.equ XTAL  = 3686400
36
;Sensoren Adressen
37
.equ SENSX_Akt = $92
38
;.equ SENS0_Write = 90
39
;.equ SENS0_Read  = 91
40
;.equ SENS1_Write = 92
41
;.equ SENS1_Read   = 93
42
;Anzahl der Temperatur Werte
43
.equ  TEMP_SENS = 2    ;128 Byte = 64 Werte je Sensor
44
;Code after every Start, REset, Power ON
45
main:  
46
;--Stackpointer init
47
    ldi temp, LOW(RAMEND);
48
    out SPL, temp;
49
    ldi temp, HIGH(RAMEND);
50
    out  SPH, temp;
51
    sbi  UCSRB, 3;   ;USR=UCSRB=0x0A TXEN=Bit3; Tx activated
52
    ldi temp, 23  ;load Baudrate 9600
53
    out UBRRL, temp  ;set Baudreate to register
54
    ldi WAHL,SENSX_Akt
55
neue_messung:                  ;Neue Messung einsprung
56
      ldi     r30,LOW(daten_sensor)          ; den Z-Pointer mit dem Start der OCR Bytes laden
57
        ldi     r31,HIGH(daten_sensor)
58
    ldi temp3,TEMP_SENS ;Schleifendurchläufe von mainloop definieren 
59
;Program begin
60
mainloop: wdr          ;Reset Watchdog
61
; *** I2C Start ***
62
        ldi    temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)    ;Vorbereiten   
63
        out    TWCR,temp                               ;Start Condition senden
64
 wait1: in     temp,TWCR                               ;Status holen
65
        sbrs   temp,TWINT                              ;Kommando ausgef?hrt?
66
        rjmp   wait1                                   ;nein -> warten
67
 ; *** LM 75 mit Addr=1 ansprechen ***        
68
        mov    temp1,WAHL  ;akutelle Adresse verwenden
69
        out    TWDR,temp1  ;Byte in Ausgaberegister
70
    ldi   temp,(1<<TWINT)|(1<<TWEN)
71
        out    TWCR,temp                   ;Byte senden
72
 
73
 wait2: in     temp,TWCR   ;Status holen
74
       sbrs   temp,TWINT  ;Kommando ausgef?hrt?
75
        rjmp   wait2       ;nein -> warten
76
 ; *** LM 75 Temperaturregister ansprechen ***
77
        ldi    temp1,0b00000000        ;Temperaturregister
78
        out    TWDR,temp1              ;Byte in Ausgaberegister
79
        ldi    temp,(1<<TWINT)|(1<<TWEN);Vorbereiten
80
        out    TWCR,temp               ;Byte senden
81
 
82
 wait3: in     temp,TWCR               ;Status holen
83
       sbrs   temp,TWINT              ;Kommando ausgef?hrt?
84
        rjmp   wait3                   ;nein -> warten
85
86
; *** erneut I2C Start senden ***
87
        ldi    temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)     
88
        out    TWCR,temp                   ;Start Condition senden
89
 
90
 wait4: in     temp,TWCR               ;Status holen
91
      sbrs   temp,TWINT              ;Kommando ausgef?hrt?
92
        rjmp   wait4                                   ;nein -> warten
93
; *** LM75 lesen aktivieren ***  
94
    inc   WAHL          ;für lesen um 1 Adresse erhöhen
95
        mov    temp1,WAHL                         
96
      out    TWDR,temp1               ;Byte in Ausgaberegister
97
        ldi    temp,(1<<TWINT)|(1<<TWEN)
98
        out    TWCR,temp                ;Byte senden
99
100
wait5:  in      temp,TWCR               ;Status holen    
101
        sbrs   temp,TWINT               ;Kommando ausgef?hrt?
102
        rjmp   wait5                    ;nein -> warten
103
104
        ldi    temp,(1<<TWINT)|(1<<TWEN)|(0<<TWEA)      ; ***1. Byte lesen MSB***
105
        out    TWCR,temp                                ;Flags setzen
106
107
wait6:  in     temp,TWCR                                ;Status holen
108
        sbrs   temp,TWINT                               ;Kommando ausgef?hrt?
109
        rjmp   wait6                                   ;nein -> warten
110
        
111
      in     temp1,TWDR                              ;Daten sind da MSB
112
113
        ldi    temp,(1<<TWINT)|(1<<TWEN)|(1<<TWEA)      ; ***2. Byte lesen LSB***
114
        out    TWCR,temp                   ;Flags setzen
115
116
wait7:  in     temp,TWCR                                ;Status holen
117
        sbrs   temp,TWINT                    ;Kommando ausgef?hrt?
118
        rjmp   wait7                       ;nein -> warten
119
        
120
      in     temp2,TWDR                              ;Daten sind da LSB
121
122
        ldi    temp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)     ; ***I2C Stop senden ***
123
        out    TWCR,temp                                ; Stop Condition senden
124
125
      ; mov temp,temp1                                 ; ***senden 1. Byte ?ber UART ***
126
       
127
       st      Z+, temp1 ;MSB sichern in Sram
128
;-------NOCHMAL
129
;    inc WAHL ;UM Nächsten Sensor Abzufragen 
130
;    cpi WAHL,$94;  ;Compare ob gleich, wenn ja dann überspringe nächste instruktion wenn WAHL=94
131
;breq  weiter  
132
;brne  mainloop;    
133
;weiter:
134
  ldi WAHL,SENSX_Akt
135
  dec temp3;                      ; Duchläufe fertig?
136
  brne mainloop;                      ;NEIN-> Nochmal durchlaufen die Abfrage
137
138
  rcall putChar        ;alle Daten ausgeben  
139
140
    
141
end:   rjmp neue_messung      ;Repeat Program
142
143
;-----------------------------------------------
144
;Subroutines
145
;-----------------------------------------------
146
;Putt Characters to Output, UART
147
putChar:  ldi temp3,TEMP_SENS
148
      ldi r30,LOW(daten_sensor)          ; den Z-Pointer mit dem Start der SensorDatenBytes laden
149
          ldi r31,HIGH(daten_sensor)
150
151
Fertig:    
152
      sbis UCSRA,5     ;USR=UCSRA=0x0B UDRE=Bit5
153
      rjmp Fertig    ;wait until UDR is Ready
154
      ld   temp, Z+       ; den TempSensor Wert für Uart Nr. i holen und Z-Pointer erhöhen
155
      out  UDR, temp
156
      dec temp3  ;128 Durchlüfe erreicht?
157
      brne Fertig
158
      ret
159
;-----------------------------------------------
160
#include "timing.asm"
161
;-----------------------------------------------
162
;Datenspeichereinrichten im SRAM
163
.DSEG
164
.org 0x60                ;erste mögliche Adresse angeben
165
daten_sensor:    .BYTE TEMP_SENS

von Falk B. (falk)


Lesenswert?

Nettiquette!!!
Lange Quelltexte als Anhang!

von trooper (Gast)


Lesenswert?

Danke,Problem hat sich erledigt. Die Beschriftung meiner Platine != des 
Datenblattes..

mfg

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
Noch kein Account? Hier anmelden.