das hier geht noch:
uint8_t x = 0x50;
ohne fehler
die stdint.h ist bereits includiert
ich bin noch nicht so der C profi
Gruß
Mario
Druckbare Version
das hier geht noch:
uint8_t x = 0x50;
ohne fehler
die stdint.h ist bereits includiert
ich bin noch nicht so der C profi
Gruß
Mario
Ich hoffe jetzt hab ich den Fehler:
In C dürfen Befehle nur innerhalb von Funktionen stehen, also in main oder in einer anderen Funktion. Du hast den init-Befehl einfach so in die Landschaft gesetzt, was wohl diese seltsamen Fehler hervorruft. Das ist nur in Assembler erlaubt, dort wird der Code streng Zeile für Zeile ausgeführt. In Basic geht es auch so, aber in C nicht! Hier beginnt die Programmausführung immer am Anfang von main. Daher muss in jdem C-Programm die Funktion main vorhanden sein.
AAußerhalb von Funktionen dürfen nur Deklarationen von globalen Variablen sowie Präprozessor-Anweisungen (alles was mit # anfängt stehen.
Also
und es müsste laufen.Code:#include <avr/interrupt.h>
#include <avr/io.h>
#include "twislave.c"
int main(void)
{
init_twi_slave(0x50);
txbuffer[0]=255;
txbuffer[1]=100;
txbuffer[2]=33;
}
Hallo,
Danke für die Hilfe, da hätte ich auch selbst draufkommen könne, jetzt geht es.
viele Grüße
Mario
Hallo,
Ich versuch jetzt schon seit stunden das twislave.c file in mein avrstudio projekt einzubingen ohne erfolg, wie im wiki beschrieben habe ich den code für twislave.c kopiert, im avrstudio eine twislave.c erstellet und den code eingefügt, jetzt bekomm ich immer diese fehlermeldung beim kompielieren :
Build started 24.4.2007 at 12:14:44
avr-gcc.exe -mmcu=atmega16 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT SlaveExample.o -MF dep/SlaveExample.o.d -c ../SlaveExample.c
avr-gcc.exe -mmcu=atmega16 SlaveExample.o twislave.o -o SlaveExample.elf
twislave.o: In function `init_twi_slave':
../twislave.c:44: multiple definition of `init_twi_slave'
SlaveExample.o:../twislave.c:44: first defined here
twislave.o: In function `__vector_17':
../twislave.c:70: multiple definition of `__vector_17'
SlaveExample.o:../twislave.c:70: first defined here
make: *** [SlaveExample.elf] Error 1
Build succeeded with 0 Warnings...
WAS IST FLASCH, hab es doch 1:1 kopiert =P~
Fängt deine twislave.c mit
#ifndef _TWISLAVE_H
#define _TWISLAVE_H
an? Ansonsten hast du ne veraltete Version. Die Meldung riecht danach, dass die Datei mehrfach eingebunden wird. In der aktuellen Version wird das automatisch verhindert.
Hallo!
Ich versuche aus meinem Mega8 einen TWI Slave zu machen, mit der Lib von uwegw.
Der Slave lässt sich vom Master aus erreichen, jedoch habe ich festgestellt, dass die ISR (TWI_vect) nie aufgerufen wird, wenn ich danach schreibe. Das ließ sich feststellen, da ich am Anfang der Funktion eine Led einschalte, die jedoch nicht angeht...
Kann es sein, dass der Compiler nicht über die Bezeichnung meckert, aber trotzdem ab einer bestimmten WinAVR Version die Bezeichnung ISR nicht mehr funktioniert? Was müsste ich stattdessen schreiben?
MfG rXenon
Edit: Das Problem scheint sich erledigt zu haben. Jedenfalls wird die ISR jetzt aufgerufen! Ich habe einfach eine neue WinAVR Version installiert.
Also lassen sich Daten im beiden Richtungen übertragen? Oder gibt der Slave bloß nen ACK aus, wenn er angesprochen wird?
Wenn sich Daten übertragen lassen, wird die ISR definitiv korrekt aufgerufen.
ISR ist die aktuelle Schreibweise. Welche winavr Version hast du?
Ja ich hatte eine zu alte Version von WinAVR. Jetzt funktioniert zuminest die Übertragung von Master zu Slave und das ist auch erstmal alles was ich brauche. Aber danke für die Antwort!
Dass ISR aktueller ist, habe ich verwundert entdeckt und deshalb gleich eine neue Version installiert.
PS: Danke für die tolle Lib, die auch so gut kommentiert ist, dass man absolut alles nachgucken kann!
Hallo,
ich weiß: "Du sollst keine Threads ausgraben!"
Aber einen neuen aufmachen bringts auch nicht wirklich.
Ich hoffe jemand kann mir hier weiterhelfen, denn es muss sich ja fast zwangsläufig um einen typischen Neulingsfehler handeln.
Ich habe die Atmega8 mit SDA und SCK verbunden und die Leitungen mit zweimal 4,7k auf 5v gezogen.
Dem einen Controller habe ich die testdatei geschickt, dem Anderen eine Modifizierte Version des Masterbeispiels.
von hier.
Ich nehme einmal an i2c-master.c ist im Beispiel anstat *.h gemeint.
Allerdings geht die led trotzdem nicht an, was mache ich falsch?
Könnte mir bitte jemand ein komplettes Beispiel für beide Controller zukommen lassen?
Hier noch mein zusammengemixter code:
Code:#include <avr/interrupt.h>
#include <avr/io.h>
#include "twislave.c"
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse
int main(void)
{
init_twi_slave(0x50);
txbuffer[0]=0xFF;
txbuffer[1]=0xFF;
txbuffer[2]=0xFF;
}
Edit: Ich liefere auch gerne noch mehr Infos nach, weiß blos nicht so recht wo ich anfangen soll.Code:#include <avr/io.h>
#include <util/delay.h>
#include "i2cmaster.h" //I2C-Master-Routinen von Peter Fleury verwenden (siehe http://homepage.hispeed.ch/peterfleu...ware.html#libs)
#define SLAVE_ADRESSE 0x50
void warte (int loop) //loop: wartezeit in ms
{
int i;
for(i=0;i<loop;i++) _delay_ms(1);
}
int main (void)
{
uint8_t byte0;
uint8_t byte1;
uint8_t byte2;
DDRB = 0xFF;
PORTB = 0x00;
while(1){
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?
{
i2c_write(0x00); //Buffer Startadresse zum Auslesen
i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen
byte0= i2c_readAck();
byte1= i2c_readAck();
byte2= i2c_readNak(); //letztes Byte lesen, darum kein ACK
i2c_stop();
if(byte0==0xFF){
PORTB = 0xFF;
}
else{
PORTB = 0x00;
}
}
warte(200);
}
}//Ende main()
Meine IDE ist WINAVR portable V.:20070525.
oops fehler, da war statt 0x00 oben 0xff
Ich schreib ab hier immer wieder etwas dazu wenn mir was einfällt:
Die Atmegas laufen mit 4MHz internem Takt.
Vielen Dank für die gute Biblothek:
Das IC-Beinchen für SCL hatte im Steckbrett keinen Kontakt,
die Verbindung zur Leiste war aber gegeben, so ein dummer Messfehler...
Es funktioniert auf kurze Distanz!
Jetzt muss ich nur noch irgendwie die Geschwindigkeit reduzieren, damit es auch auf einem langen Kabel geht.