Anfänger braucht Hilfe bei Erstem TWI-Bus

OP #2137942
Lesenswert?

Hallo zusammen,

Ich versuche schon die ganze Woche das Programm zum laufen zu bringen. 
Hab aber noch nicht mit TWI gearbeitet. Im Internet hab ich auch keine 
wirklich gute Anleitung gefunden. Das Programm soll den Messwert eines 
SRF02 auslesen und ein mal pro Sekunde auf dem LCD ausgeben aber das 
funktioniert nicht. Ich kann am SCL Pin auch schon keine Frequenz 
messen. Entweder ist mein Multimeter zu langsam (glaub ich eher nicht) 
oder der Atmega gibt keinen Takt aus. Bestimmt hab ich einen ganz 
banalen Fehler eingebaut.

Gruß Michael
1
.INCLUDE "m32def.inc"    ; Deklarationen
2
// Takt= 4 MHz
3
.def akku    = r16
4
.def temp1    = r21
5
.def temp2    = r22
6
.def temp3    = r23  
7
.def temp    = r24
8
.def wert_h    = r25  
9
.def wert_l    = r26      
10

11
start:                        
12
;STACK initialisieren
13
  ldi temp1, LOW(RAMEND)
14
    out SPL, temp1
15
    ldi temp1, HIGH(RAMEND)
16
    out SPH, temp1
17

18
; PORT C+ D alles AUSGÄNGE  
19
  ldi temp, 0b11111111
20
  out DDRC, temp
21
  out DDRD, temp
22

23
  ldi akku, $10
24
  out TWBR, akku
25

26
  ldi  akku, (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
27
  out TWCR, akku
28
  
29
  ldi  akku, (0 << TWPS1) | (0 << TWPS0) ;
30
  out TWSR, akku
31

32
  rcall lcd_init              ; Display initialisieren
33
    rcall lcd_clear             ; Display löschen
34
 
35
  ldi temp1, 0b00001110    ; Display ein, Courser ein, Blinken aus
36
  rcall lcd_command      ; sende Befehl an LCD
37
  sbi PORTD, 7         ; Beleuchtung ein
38

39
  clr wert_l
40
  clr wert_h
41

42
  rcall i2c_init
43

44
LOOP:
45

46
  ldi  i2cadr,$E0+i2cwr  ; Set device address and write
47
  rcall  i2c_start    ; Send start condition and address
48

49
  ldi  i2cdata,$0    ; Write word address (0x00)
50
  rcall  i2c_do_transfer    ; Execute transfer
51

52
  ldi  i2cdata,$51    ; Set write data to 01010101b
53
  rcall  i2c_do_transfer    ; Execute transfer
54
  
55
  rcall  i2c_stop
56

57
  rcall delay5ms
58

59
  ldi  i2cadr,$E0+i2cwr  ; Set device address and write
60
  rcall  i2c_start    ; Send start condition and address
61

62
  ldi  i2cdata,$02    ; Write word address
63
  rcall  i2c_do_transfer    ; Execute transfer
64

65
  ldi  i2cadr,$E0+i2crd  ; Set device address and read
66
  rcall  i2c_rep_start    ; Send repeated start condition and address
67

68
  sec        ; Set no acknowledge (read is followed by a stop condition)
69
  rcall  i2c_do_transfer    ; Execute transfer (read)
70

71
  rcall  i2c_stop    ; Send stop condition - releases bus
72

73
  mov wert_h, i2cdata
74

75

76
  ldi  i2cadr,$E0+i2cwr  ; Set device address and write
77
  rcall  i2c_start    ; Send start condition and address
78

79
  ldi  i2cdata,$03    ; Write word address
80
  rcall  i2c_do_transfer    ; Execute transfer
81

82
  ldi  i2cadr,$E0+i2crd  ; Set device address and read
83
  rcall  i2c_rep_start    ; Send repeated start condition and address
84

85
  sec        ; Set no acknowledge (read is followed by a stop condition)
86
  rcall  i2c_do_transfer    ; Execute transfer (read)
87

88
  rcall  i2c_stop    ; Send stop condition - releases bus
89

90
  mov wert_l, i2cdata
91

92

93
  ldi temp1, $80    ; Display ein, Courser ein, Blinken aus
94
  rcall lcd_command      ; sende Befehl an LCD
95

96
  mov temp2, wert_h
97
  mov temp3, wert_l  
98
  rcall lcd_number16
99

100
  rcall warte_1s
101

102
  rjmp  loop      ; Loop forewer
103

104
warte_1s:
105
; ============================= 
106
;   Warteschleifen-Generator 
107
;     1000000 Zyklen:
108
; ----------------------------- 
109
; warte 999999 Zyklen:
110
          ldi  R27, $09
111
WGLOOP3:  ldi  R28, $BC
112
WGLOOP4:  ldi  R29, $C4
113
WGLOOP5:  dec  R29
114
          brne WGLOOP5
115
          dec  R28
116
          brne WGLOOP4
117
          dec  R27
118
          brne WGLOOP3
119
; ----------------------------- 
120
; warte 1 Zyklus:
121
          nop
122
; ============================= 
123
ret
124

125
.include "lcd-routines.asm"             ; include routine für LCD
126
.include "avr300.asm"             ; include routine für LCD
#2138818
Lesenswert?

Im Programm hat es den Vorteil, das man es auch wieder ein/ausschalten 
kann. Z.B. programmiert man vor dem eigentlichen Programm eine Abfrage 
wenn Pin X länger als 2 Sekunden gedrückt wurde aktiviere JTAG-Interface 
für Debuggingzwecke. Am besten die JTAG Pins nach Möglichkeit 
Freilassen. So ist es nach jedem Reset deaktiviert aber man könnte es 
mittels Tastendruck wieder einschalten.
#2138905
Lesenswert?

Michael Mayer schrieb:
> Ich versuche schon die ganze Woche das Programm zum laufen zu bringen.
> Hab aber noch nicht mit TWI gearbeitet.

Hallo Michael,

ich habe schon sehr lange TWI im Einsatz - Länger als ich C kann.

Angefangen habe ich mit Software TWI auf einem AT90S2343 in DIL8.
Diese Sourcecodes könnte ich noch ausbuddeln, wenn nötig.

Hier hänge ich nun meine aktuellere Version an.

Der TWI-Teil in diesem Code ist in von mir entwikelten Schaltungen im 
Einsatz und wurde von mir vor Jahren aus den Atmel AN's von C nach ASM 
übertragen.
Damals gabe es LCD und RS232, das LCD fiel irgendwann weg.
Alles also eher hässlich - aber funtionell.

Aus dem Hauptprogramm habe ich nun alles gelöscht,
was nicht zur TWI/RS232 Funktion gehört.
Die TWI-Routinen aber sind unverändert.
Der Code ist danach nicht auf Funktion getestet worden.

Der Controller wurde wissentlich auf 20 MHz übertaktet.
--> UART Baudrate anpassen
--> TWI Prescaler / Baudrate anpassen
(Beides zum 1. Test nicht nötig)

Das Programm sollte beim Start eine Nachricht an TWI-Adresse 0x10 
senden.
Dies ist bei mir ein 2. Controller als Slave.

Slave_Adr Bereich:
0x01-0x7F, das LSB der Adresse ist BIT0!
Der Code schiebt das passend und fügt das R/W-Bit ein.

Danach ist eine Endlos-Schleife für nichts.

Weiter habe ich die TWI-Status-Codes damals in eine editierte ".inc" 
gepackt.
Bei Portierung auf andere Controller muss auch dies beachtet werden.

Für einige Verwunderung könnten zudem unbekannte "Befehle" sorgen.
Es wurde großzügig gebrauch von Makros gemacht.
Deren Ursprung vor Ergänzung soll nicht verheimlicht werden:
; Audio Waveform Monitor R0.1                               Nov 11, 2004 
;
; (C)ChaN, 2004; http://elm-chan.org/

MFG:MBP
Markus.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren