PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AT MEGA 8 - TWI - Master und Slave - Programmbeispiel



jojo.glaser
23.09.2007, 17:19
Hi,

Ich möchte eine Verbindung zwischen 2 ATMEGA8s über TWI aufbauen.

Im einigen Foren gibt es beispiele wie man z.b. eine TWI-Verbindung zu nem EEPROM aufbaut...
Ich habe mal versucht einige Programmbeispiele so abzuändern, dass ich daten zwischen 2 ATMEGA8ts austauschen kann. Ist mir leider nicht gelungen.

Könnt ihr mir ein Programmbeispiel geben, indem ein AVR(Master) irgend welche Werte von einem anderen AVR(Slave) ausliest?

Danke!

Gruß Jo

MartinFunk
23.09.2007, 18:32
Hi,
für den master würde ich die I2C library von P. Fluery nehmen:
http://homepage.hispeed.ch/peterfleury/avr-software.html#libs

und für den Slave die Aplication Note 311 von Atmel verwenden.

MfG Martin

jojo.glaser
23.09.2007, 18:46
Hi,

Ich brauche noch die I2C-Master.c die ist im Paket von Peter Fleury nur als Assembler code enthalten.

Kannst du mir die AN311 hier rein posten?

Danke!

Gruß jo!

MartinFunk
23.09.2007, 18:56
nein in dem pakte ist eine I2C_master.c enthalten die i2c_master.S ist nur für software i2c!

Im anhang befindet sich die abgeänderte AN311 mit einem beispiel programm!

MfG Martin

jojo.glaser
23.09.2007, 19:21
Hi,

Danke für diene Antwort.

In welchem Anhang ist die AN311?

Gruß Jo

jojo.glaser
23.09.2007, 19:22
ah gefunden Danke! :-)

jojo.glaser
23.09.2007, 19:33
Hi, eine Frage hätt ich noch:
Er zeigt beim Compillern:
../main.c:23:19: ioavr.h: No such file or directory
../main.c:24:19: inavr.h: No such file or directory
../main.c: In function `TWI_Act_On_Failure_In_Last_Transmission':
aber die ioavr müsste er doch finden oder?

MartinFunk
23.09.2007, 20:09
ups hab da vergessen was zu ändern.

akutuelle version im anhang!

MfG Martin

jojo.glaser
23.09.2007, 20:44
Gieng immer noch nich, hab es mal so abgeäündert.
#include <avr/io.h>
#include <avr/interrupt.h>
#include "TWI_Slave.h"


Bis auf 3errors lässt sichs compillern.
Build started 23.9.2007 at 20:43:06
avr-gcc.exe -mmcu=atmega8 main.o TWI_slave.o -o main.elf
main.o: In function `main':
../main.c:60: undefined reference to `__enable_interrupt'
../main.c:107: undefined reference to `__no_operation'
../main.c:123: undefined reference to `__no_operation'
make: *** [main.elf] Error 1
Build failed with 3 errors and 0 warnings...

Was muss ich noch abändern?

Danke für diene Hilfe! Gruß Jo!

MartinFunk
24.09.2007, 18:10
Du musst die beiden befehle auskommentieren oder löschen!
Das sind nur platzhalter!

und enable_interrupt durch "sei();" ersetzen!

MfG Martin

jojo.glaser
25.09.2007, 20:19
Hi Martin!

Der Slave läuft!

Beim Master werden mir noch folgende fehler angezeigt:

rm -rf main.o main.elf dep/* main.hex main.eep
Build succeeded with 0 Warnings...
avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT main.o -MF dep/main.o.d -c ../main.c
avr-gcc.exe -mmcu=atmega8 main.o -o main.elf
main.o: In function `main':
../main.c:29: undefined reference to `i2c_init'
../main.c:32: undefined reference to `i2c_start'
../main.c:35: undefined reference to `i2c_stop'
../main.c:39: undefined reference to `i2c_write'
../main.c:40: undefined reference to `i2c_write'
../main.c:41: undefined reference to `i2c_stop'
../main.c:45: undefined reference to `i2c_start_wait'
../main.c:46: undefined reference to `i2c_write'
../main.c:47: undefined reference to `i2c_rep_start'
../main.c:48: undefined reference to `i2c_readNak'
../main.c:49: undefined reference to `i2c_stop'
../main.c:55: undefined reference to `i2c_start_wait'
../main.c:56: undefined reference to `i2c_write'
../main.c:57: undefined reference to `i2c_write'
../main.c:58: undefined reference to `i2c_write'
../main.c:59: undefined reference to `i2c_write'
../main.c:60: undefined reference to `i2c_write'
../main.c:61: undefined reference to `i2c_stop'
../main.c:65: undefined reference to `i2c_start_wait'
../main.c:66: undefined reference to `i2c_write'
../main.c:67: undefined reference to `i2c_rep_start'
../main.c:68: undefined reference to `i2c_readAck'
../main.c:69: undefined reference to `i2c_readAck'
../main.c:70: undefined reference to `i2c_readAck'
../main.c:71: undefined reference to `i2c_readNak'
../main.c:72: undefined reference to `i2c_stop'
make: *** [main.elf] Error 1
Build failed with 26 errors and 0 warnings...

in der i2cmaster.h steht fast nichts nur von irgend welchen externen funktionen oder so, verstehe nicht ganz was damit gemeint ist und für was die i2cmaster.h gut ist. Is kaum code drin...

Gruß Jo!

MartinFunk
25.09.2007, 20:27
du musst die i2c_master.c ins make file includen

jojo.glaser
25.09.2007, 20:45
Hm.. hab ich gemacht.. also in der liste links vom AVR studio ist es unter header eingetragen... Aber is rot durchgestrichen, weis net was des bedeudet...

MartinFunk
25.09.2007, 21:08
du musste den unter source files rein tun!

MfG Martin

jojo.glaser
25.09.2007, 21:17
Grrrrr... :-) Danke, dass du mir hilfst, würd des allein nie hinbekommten!

rm -rf main.o i2cmaster.o main.elf dep/* main.hex main.eep
Build succeeded with 0 Warnings...
avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT main.o -MF dep/main.o.d -c ../main.c
make: *** No rule to make target `i2cmaster.o', needed by `main.elf'. Stop.
Build failed with 1 errors and 0 warnings...

mefiX
28.09.2007, 17:32
Hi Leute, bin durch Zufall hier vorbeigestolpert.
Ich benutze die TWI-Lib auch in meinem Projekt.
Wie ist das mit "twimaster.c" vs "i2c_master.S"?
Dachte die Assembler-Implementierung (.S) sei zu bevorzugen, da Hardwarenah???

linux_80
28.09.2007, 22:01
Hallo,

@mefiX
das ist genau andersrum, TWI ist die Hardware,
der Assemblerteil für die Softwarelösung.

Mit Assembler ist die Programmierung Hardwarenah, aber nicht das I2C :-)

jojo.glaser
29.09.2007, 12:18
Hallo,

Mein Compiller zeigt noch folgende Meldung:

rm -rf main.o i2cmaster.o main.elf dep/* main.hex main.eep
Build succeeded with 0 Warnings...
avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT main.o -MF dep/main.o.d -c ../main.c
make: *** No rule to make target `i2cmaster.o', needed by `main.elf'. Stop.
Build failed with 1 errors and 0 warnings...

Was hab ich falsch gemacht?

Gruß Jo

MartinFunk
29.09.2007, 14:32
Irgent was stimmt mit deinem make file nicht!

MfG Martin

oberallgeier
21.03.2008, 11:21
Hallo MartinFunk,


Hi,
für den master würde ich die I2C library von P. Fluery nehmen: http://homepage.hispeed.ch/peterfleury/avr-software.html#libs
und für den Slave die Aplication Note 311 von Atmel verwenden.
MfG Martin
Hättest Du bitte auch einen Ratschlag für mich? Ich will einen mega168 als Master (eigene Flash- und Experimentierplatine) und einen m16 als Slave (auf der RNControl) betreiben. Später sollen es zwei m168 sein. Ziel ist ein Austausch von ein paar Steuerdaten und Messwerten zwischen den beiden (m168: Master + Steuerdaten an m16, m16 Messwerte an m168; m168 schickt später auch Stausmeldungen an die RS232.
Dazu habe ich mir vor ein paar Tagen die beiden App´s 311 und 315 geholt, den Code dazu und einfach übersetzt. Leider finde ich nirgendwo die beiden headerfiles ioavr.h und inavr.h und steh nun etwas auf dem sprichwörtlichen Schlauch. Hättest Du bitte einen Tip?
Ich verwende ansonsten AVRStudio 4.13.557 Service Pack 1 GUI Version , 13, 0, 557 und WinAVR 2007 0525.

Danke im Voraus

MartinFunk
21.03.2008, 14:35
hi,
im post vom 23.09.2007, 19:09 hab ich eine angepasste version der AN311 angehängt!

MfG Martin

oberallgeier
21.03.2008, 15:17
Danke Martin, besonders danke für die schnelle Antwort, das hatte ich gesehen - ich hatte die twi_master.h bei mir referenziert (#include "TWI_Master.h"), trotzdem:


Build started 21.3.2008 at 15:09:03
avr-gcc.exe -mmcu=atmega168 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT DME_I2Cm-1.o -MF dep/DME_I2Cm-1.o.d -c ../DME_I2Cm-1.c
In file included from ../TWI_Master-modif.c:30,
from ../DME_I2Cm-1.c:127:
../TWI_Master.h:39: error: redefinition of 'union TWI_statusReg'
../DME_I2Cm-1.c:158: warning: return type of 'main' is not 'int'
../DME_I2Cm-1.c: In function 'main':
../DME_I2Cm-1.c:171: warning: implicit declaration of function '__enable_interrupt'
../DME_I2Cm-1.c:283: warning: implicit declaration of function '__no_operation'
make: *** [DME_I2Cm-1.o] Error 1
Build failed with 1 errors and 3 warnings...

wobei der Fehler hier auftritt:
************************************************** **************************/

union TWI_statusReg // Status byte holding flags.
{
unsigned char all;
struct
{
unsigned char lastTransOK:1;
unsigned char unusedBits:7;
};
};

extern union TWI_statusReg TWI_statusReg;

/************************************************** **************************

Aber ich bin gerade dran mit der library von PFleury - da habe ich bisher für den Master (m)einen ersten Erfolg. Da wird zwar im Beispiel erstmal ein Eprom beschrieben, aber die Änderung werd ich wohl hinkriegen. Jedenfalls schön, dass ich Deinen Hinweis habe - so etwas hilft ja immer.

Danke, schöne Feiertage . .

MartinFunk
21.03.2008, 16:12
Hi,
hast du die *.c in das makefile eingebunden?

Martin

oberallgeier
21.03.2008, 17:39
Hallo, martin,

hmmmm - das makefile ist (bei meinen bisherigen C Programmen, meine C-Erfahrung ist etwa drei, vier Monate alt, aber es gibt das eine oder andere lauffähige Controllerprogramm von mir (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=355675#355675)) etwas, das der Compiler "hervorzaubert" - sprich - ich bin darin total unbewandert. Das gehört (auch noch) zu den Dingen die ich nicht kann.

Sprich - ich habe am makefile GARNIX gemacht.
################################################## #############################
# Makefile for the project test_I2Cs-1
################################################## #############################

## General Flags
PROJECT = test_I2Cs-1
MCU = atmega168
TARGET = test_I2Cs-1.elf
CC = avr-gcc.exe

## Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)

## Compile options common for all C compilation units.
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d

## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += $(CFLAGS)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS += -Wl,-Map=test_I2Cs-1.map


## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom

HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings


## Objects that must be built in order to link
OBJECTS = test_I2Cs-1.o

## Objects explicitly added by the user
LINKONLYOBJECTS =

## Build
all: $(TARGET) test_I2Cs-1.hex test_I2Cs-1.eep test_I2Cs-1.lss size

## Compile
test_I2Cs-1.o: ../test_I2Cs-1.c
$(CC) $(INCLUDES) $(CFLAGS) -c $<

##Link
$(TARGET): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)

%.hex: $(TARGET)
avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@

%.eep: $(TARGET)
-avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0

%.lss: $(TARGET)
avr-objdump -h -S $< > $@

size: ${TARGET}
@echo
@avr-size -C --mcu=${MCU} ${TARGET}

## Clean target
.PHONY: clean
clean:
-rm -rf $(OBJECTS) test_I2Cs-1.elf dep/* test_I2Cs-1.hex test_I2Cs-1.eep test_I2Cs-1.lss test_I2Cs-1.map


## Other dependencies
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)


Leider. Ich habe etwas gepfuscht und das "TWI_Slave.c" als "#include" eingesetzt. Da liegt wohl ein Hund begraben. Und jetzt kommt bei (m)/Deinem Slave-programm wieder dieser error: "../TWI_slave.h:35: error: redefinition of 'union TWI_statusReg' ".

Build started 21.3.2008 at 17:27:18
avr-gcc.exe -mmcu=atmega168 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT test_I2Cs-1.o -MF dep/test_I2Cs-1.o.d -c ../test_I2Cs-1.c
In file included from ../TWI_Slave.c:27,
from ../test_I2Cs-1.c:32:
../TWI_slave.h:35: error: redefinition of 'union TWI_statusReg'
../test_I2Cs-1.c:53: warning: return type of 'main' is not 'int'
../test_I2Cs-1.c: In function 'main':
../test_I2Cs-1.c:67: warning: implicit declaration of function '__enable_interrupt'
../test_I2Cs-1.c:114: warning: implicit declaration of function '__no_operation'
../test_I2Cs-1.c:55: warning: unused variable 'temp'
make: *** [test_I2Cs-1.o] Error 1
Build failed with 1 errors and 4 warnings...


Ich muss mich wohl mit dem makefile beschäftigen :(.

MartinFunk
22.03.2008, 10:13
hi,
wenn ich richtig gelesen habe arbeitest du mit AVR-Studio.
In AVR-Studio brauchst du dich NICHT mit dem Makefiles herumschlagen, da das alles das AVR-Studio macht.

So wen du jetzt eine lib einbinden willst musst du das *.c file ins makefile einbinden und die *.h datei in dein Programm includen.

Das *.c file bindet man in AVR-Studio so ein:
Du machst einen rechtsklick links im projektbaum auf "Source Files" dann machst du "Add existing source files" da wählst du dann dein *.c file aus.

MfG Martin

oberallgeier
24.03.2008, 15:59
Hallo Martin,

... In AVR-Studio brauchst du dich NICHT mit dem Makefiles herumschlagen, da das alles das AVR-Studio macht... Das *.c file bindet man in AVR-Studio so ein:
Du machst einen rechtsklick ...
Mal ein ganz herzliches Danke für Deinen Hinweis, den ich im Moment gelesen hatte. Du hast völlig recht, ich habe AVRStudio, mit C beschäftige ich mich erst seit etwa vier Monaten - und es ist Cäh. Ich hatte zum Einbinden der *.c´s schon ne ganze Weile die SuFu vergeblich bemüht. Beim Lesen Deines posts fiel mir ein Stein vom Herzen - weil ich so präzise Hinweise liebe, die im Prinzip sagen: " Du musst fast nix tun ... ". Im Moment bin ich (Feiertagsfrieden im Wohnzimmer - nix PC rumstehen) am Notebook, aber ich werde das bald probieren. Das #include..." mit den *.h-files kenne ich schon, danke.

Nochmal herzlichen Dank