Die Funktion read_pcf8591_adc erwartet als Parameter den A/D Kanal (0..3) und gibt den entsprechenden A/D Wert zurück.
Hier noch der Link zur Schaltung und zum Programm:
http://www.asurowiki.de/pmwiki/pmwik...orterweiterung
Hallo ich habe auf der "asurowiki" Seite ein paar Informationen zu der Analogen Porterweiterung gefunden und wollte hier mal anfragen was das Unterprogramm, welches auf der genannten Seite steht zurückgibt? Von welchem Eingang gibt mir dieses Programm die Daten?
Die Funktion read_pcf8591_adc erwartet als Parameter den A/D Kanal (0..3) und gibt den entsprechenden A/D Wert zurück.
Hier noch der Link zur Schaltung und zum Programm:
http://www.asurowiki.de/pmwiki/pmwik...orterweiterung
Ok das hilft mir schon mal weiter. Aber ich bekomme immer Fehlermeldungen beim erstellen meiner Datei.
Code:>Session Environment Variables: AF_AVRDIR=C:\WinAVR AF_PROJECT=test AF_SOURCE_FILES=test.c i2c.c AF_ASM_SRC_FILES= AF_PRGDIR=C:\Programme\AsuroFlash AF_PRJDIR=C:\AsuroFlash\asuro-lib\examples\US AF_ASURO_LIB_PATH=C:\AsuroFlash\asuro-lib\lib File test.c saved. >Default make_all.cmd file created. >Default makefile created. Make C:\AsuroFlash\asuro-lib\examples\US>C:\WinAVR\utils\bin\make.exe all set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst -IC:\Programme\AsuroFlash\include test.c \ | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \ [ -s test.d ] || rm -f test.d -------- begin -------- avr-gcc --version avr-gcc (WinAVR 20090313) 4.3.2 Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Size before: test.elf : section size addr .text 714 0 .bss 17 8388704 .stab 888 0 .stabstr 95 0 .debug_aranges 128 0 .debug_pubnames 335 0 .debug_info 1165 0 .debug_abbrev 592 0 .debug_line 1025 0 .debug_frame 240 0 .debug_str 502 0 .debug_loc 106 0 Total 5807 avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst -IC:\Programme\AsuroFlash\include test.c -o test.o test.c: In function 'read_pcf8591_adc': test.c:12: warning: passing argument 1 of 'StartI2C' makes integer from pointer without a cast test.c:18: warning: passing argument 1 of 'StartI2C' makes integer from pointer without a cast test.c: In function 'main': test.c:42: warning: passing argument 1 of 'SerWrite' makes pointer from integer without a cast avr-gcc -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o -IC:\Programme\AsuroFlash\include test.o i2c.o --output test.elf -Wl,-Map=test.map,--cref -IC:\Programme\AsuroFlash\lib -lm test.o: In function `read_pcf8591_adc': C:\AsuroFlash\asuro-lib\examples\US/test.c:17: undefined reference to `Sleep' test.o: In function `main': C:\AsuroFlash\asuro-lib\examples\US/test.c:35: undefined reference to `Init' C:\AsuroFlash\asuro-lib\examples\US/test.c:37: undefined reference to `FrontLED' C:\AsuroFlash\asuro-lib\examples\US/test.c:42: undefined reference to `SerWrite' make: *** [test.elf] Error 1 ExitCode 2 >Ready.
Hier mal das Programm. Es soll den Wert von dem ersten Eingang vom PCF8591 über die serielle Schnittstelle senden.
Code:#include "asuro.h" #include "i2c.h" #define pcf8591_address 0x90 // I2C Adresse des PCF8574 //liest einen ADC Wert vom PCF8591 unsigned char read_pcf8591_adc(unsigned char adc) { unsigned char ret; unsigned char byte = 0; ret = StartI2C(pcf8591_address+WriteI2C); // Sende Start Condition if (ret == 0) ret = WriteI2C(adc); // Senden des Control Bytes startet die A/D Wandlung StopI2C(); // Sende Stop Condition, Bus freigeben Sleep(10); // Warten bis A/D Wandlung benedet (mind. 90µs) ret = StartI2C(pcf8591_address+ReadI2C); // Sende Start Condition if (ret == 0) { // Mehrmaliges Lesen um alte A/D Werte zu ignorieren byte = ReadI2C(1); // Lese Byte + acknowledge byte = ReadI2C(0); // Lese Byte + no acknowledge } else ret = 3; StopI2C(); // Sende Stop Condition, Bus freigeben return byte; } int main(void) { unsigned char rled; unsigned char port; Init(); InitI2C(); FrontLED(ON); while(1) { port=0; rled = read_pcf8591_adc(port); SerWrite(rled,4); } return 0; }
Da fehlt zumindest noch die asuro.c in deinem Projekt. Die Asuro-Lib selbst scheint aber auch zu fehlen. Eigentlich sollte das schon durch das Makefile Template vom AsuroFlash Tool eingebunden werden.
Das ist seltsam, hast du die Templates geändert? Welche AsuroFlash Version verwendest du?
Ich verwende die Version 1.4.6.56. Ich habe jetzt nochmal etwas geändert und bekomme aber folgende Fehlermeldung
Code:>Session Environment Variables: AF_AVRDIR=C:\WinAVR AF_PROJECT=Project1 AF_SOURCE_FILES=test.c AF_ASM_SRC_FILES= AF_PRGDIR=C:\Programme\AsuroFlash AF_PRJDIR=C:\ASURO_SRC\programm\us AF_ASURO_LIB_PATH=C:\ASURO_SRC\AsuroLib\lib File test.c saved. >Default make_all.cmd file created. >Default makefile created. Make C:\ASURO_SRC\programm\us>C:\WinAVR\utils\bin\make.exe all set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=i2c.lst i2c.c \ | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > i2c.d; \ [ -s i2c.d ] || rm -f i2c.d set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c \ | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \ [ -s asuro.d ] || rm -f asuro.d set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \ | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \ [ -s test.d ] || rm -f test.d -------- begin -------- avr-gcc --version avr-gcc (WinAVR 20090313) 4.3.2 Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. avr-gcc -c -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o test.c: In function 'read_pcf8591_adc': test.c:12: warning: passing argument 1 of 'StartI2C' makes integer from pointer without a cast test.c:18: warning: passing argument 1 of 'StartI2C' makes integer from pointer without a cast test.c: In function 'main': test.c:42: warning: passing argument 1 of 'SerWrite' makes pointer from integer without a cast avr-gcc -c -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c -o asuro.o avr-gcc -c -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=i2c.lst i2c.c -o i2c.o avr-gcc -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o test.o asuro.o i2c.o --output test.elf -Wl,-Map=test.map,--cref -L../../lib -lm -lasuro c:/winavr/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: cannot find -lasuro make: *** [test.elf] Error 1 ExitCode 2 >Ready.
ok hab den Fehler selbst gefunden.
Muss ich an die SDA und SCL Leitung einen Widerstand anschließen?
Laut I2C Spezifikation ist dies doch notwendig?
Weil laut Plan der oben genanten Seite muss man nichts anschließen. Und in dem Video funktioniert diese Schaltung ja. Oder wurde da etwas auf der Hauptplatine geändert?
An die SCL und SDA Leitungen müssen Widerstände sein. Oft verwendet man die internen Pullupwiderstände des µC. Für höhere Frequenzen bzw längere Leitungen sollte man aber externe Widerstände verwenden.
MfG Hannes
So wenn ich die Bauteile zur Linienverfolgung an die analogen Eingänge des PCF8591 anschliese benötige ich ja auch wieder Pulldown Widerstände. Sollte ich da die gleichen verwenden wie original( 20k Ohm) oder sind da auch andere möglich?
Du solltest schon die gleivhen Widerstände verwenden.
Stimmt, in der Schaltung fehlen die I2C PullUp Widerstände (4,7k nach VCC)
So habe alles aufgebaut. Aber es will einfach nicht funktionieren. Ich habe den rechten Liniensensor auf den ersten und den linken Sensor auf den zweiten Eingang gelegt, aber ich bekomme keinen vernünftigen Werte über mein Programm. Ich habe mit einem Multimeter nachgemessen und habe festgestellt das sich die Spannung am den Eingängen ändert. Hat jemand ne idee wie ich die Werte in mein Programm bekomme?
Lesezeichen