Forum: Mikrocontroller und Digitale Elektronik Anfänger braucht Hilfe bei Erstem TWI-Bus


von Michael M. (eos400dman)


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

von andy (Gast)


Lesenswert?

Hallo also mit dieser anleitung

http://www.mikrocontroller.net/articles/AVR_TWI

hats bei mir sofort geklappt.Ist eigentlich sehr einfach.

gruss

andy

von Michael M. (eos400dman)


Lesenswert?

Danke für deine Antwort.
Die Anleitung hab ich auch schon gefunden, ist aber komplett für C und 
nicht für Assembler. Die Grundlagen hab ich mir aber mal durch gelesen.

von andy (Gast)


Lesenswert?

Hallo warum schaltest du eigentlich in der loop dein Display jedesmal 
ein,blinken aus usw?

gruss

andy

von Michael M. (eos400dman)


Lesenswert?

Mach ich gar nicht, da steht nur der falsche Kommentar. Mit $80 springe 
ich zum Anfang der ersten Zeile zurück.

von Thomas (kosmos)


Lesenswert?

lösche mal Bit 7 im MCUCSR-Register um die JTAG Pins auf dem Port C 
freizugeben sonst funktionieren die nicht für normale I/O Sachen.

von andy (Gast)


Lesenswert?

Hallo in der Codesammlung gibts ein Beispiel in asm.Such mal

TWI/I2C einf. MASTER SLAVE Beispiel(Assembler) ATmega8

gruss

andy

von Michael M. (eos400dman)


Lesenswert?

Thomas O. schrieb:
> lösche mal Bit 7 im MCUCSR-Register

Hab ich jetzt gemacht hat aber nichts geändert.

von Michael M. (eos400dman)


Angehängte Dateien:

Lesenswert?

Wollte euch mal kurz fragen ob die Verkabelung des SRF02 so stimmt.

Gruß Michael

von Thomas (kosmos)


Lesenswert?

sorry du musst das Bit7 setzen nicht löschen

von Michael M. (eos400dman)


Angehängte Dateien:

Lesenswert?

Thomas O. schrieb:
> sorry du musst das Bit7 setzen nicht löschen

Das mach ich doch mit dem markiertem Punkt in den Fuses, oder nicht? 
Müsste doch so stimmen.

Gruß Michael

von Thomas (kosmos)


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.

von Markus B. (mbp-bayern)


Angehängte Dateien:

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.

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.