Zmontowałem układ jak w załączniku. Jest to czujnik odległości. W zależności od odległości powinien zapalać odpowiednią ilość diód. Porogramu jeszcze nie napisałem ponieważ zatrzymał mnie poważny problem.
Problem polega na tym, że i2c_start(Device+I2C_READ) zwraca 1, czyli (jak można przeczytać tutaj: http://homepage.hispeed.ch/peterfleury/group__pfleury__ic2master.html#ga2) "failed to access device".
oto mój kod:
ELEMENTY:
Czujnik odległości: Sharp GP2Y0A02YK0F, PDF
Przetwornik A/D: ADS1110 PDF
Dodam że na schemacie te dwa elementy zaznaczone są jako pinheady, a nad nimi znajduje się legenda który pin jest który.
Podsumowując nie wiem z czego wynika błąd. Sprawdzałem czy wszystkie ścieżki są połączone, oraz czy nie ma gdzieś zwarcia. Program też wydaje się być napisany poprawnie. Adres urządzenia też jest chyba dobry - sprawdziłem w dokumentacji (mój przetwornik ma na obudowie ED3).
edit
Po wielu próbach doszedłem do prostego programu, który być może jest bliższy rozwiązania problemu:
Problem polega na tym, że i2c_start(Device+I2C_READ) zwraca 1, czyli (jak można przeczytać tutaj: http://homepage.hispeed.ch/peterfleury/group__pfleury__ic2master.html#ga2) "failed to access device".
oto mój kod:
#include <avr/io.h>
#include <util/delay.h>
#include "i2cmaster.h"
#define Device 0x4B // adres urzadzenia
int main(void)
{
unsigned char ret;
DDRD = 0xff;
i2c_init();
//zapalam jedna diode
PORTD=0x7c;
_delay_ms(1000);
while(1)
{
ret = i2c_start(Device+I2C_READ);
//zwraca 1 jeżeli nie udało sie polaczyc z urzadzeniem
if ( ret )
{
//zapalam wszystkie diody
i2c_stop();
PORTD=0x00;
}
else
{
ret = i2c_readNak();
i2c_stop();
PORTD = ~ret;
}
}
}ELEMENTY:
Czujnik odległości: Sharp GP2Y0A02YK0F, PDF
Przetwornik A/D: ADS1110 PDF
Dodam że na schemacie te dwa elementy zaznaczone są jako pinheady, a nad nimi znajduje się legenda który pin jest który.
Podsumowując nie wiem z czego wynika błąd. Sprawdzałem czy wszystkie ścieżki są połączone, oraz czy nie ma gdzieś zwarcia. Program też wydaje się być napisany poprawnie. Adres urządzenia też jest chyba dobry - sprawdziłem w dokumentacji (mój przetwornik ma na obudowie ED3).
edit
Po wielu próbach doszedłem do prostego programu, który być może jest bliższy rozwiązania problemu:
#include <avr/io.h>
#include <util/delay.h>
#include <compat/twi.h>
int main(void)
{
TWSR = 0;
TWBR = ((1000000/100000)-16)/2;
// wysylanie sekwencji start
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// oczekiwanie na ustawienie flagi TWINT
while(!(TWCR & (1<<TWINT))); // PROGRAM NIE PRZECHODZI DO NASTEPNEJ LINIJKI
return 0;
}