Witam! Na forum zawsze znajdowałem odpowiedzi i drążyłem każdy temat samodzielnie w myśl zasady jednego z moich wykładowców "świat dzieli się na samouków i nieuków"... lecz tym razem rozłożyłem ręce po 3-dniowej walce z TWI/i2c (w między czasie wypiłem tylko 2 bro) i postanowiłem nieśmiało założyć temat (chyba mój inauguracyjny...).
Przeczytałem regulamin oczywiście i przewertowałem forum (z którego wziąłem wzory kodów), noty aplikacyjne (na których się opierałem odn. teorii), znalazłem mnóstwo artykułów (wszystkie zarchiwizowane już mam więc są pod ręką)...
Jestem może nie początkującym jeśli idzie o uP, ale na pewno dosyć oporny na wiedzę z tym tematem i jej przyswajanie postępuje niestety powoli, więc sorka za niedobór jakiejś części wiedzy.
Do rzeczy, bo może uda się szybko zamknąć temat. Potrzebuję skomunikować narazie 2 tytułowe AT8, by nauczyć się w praktyce działania i2c (docelowo mają komunikować się w niewolniczym trybie wysyłającym i odbierającym z robotami mobilnymi opartymi o Basic Atom Pro i/lub Basic Stamp przez medium bezprzewodowe- dzięki modułom rfm12, przy czym komunikacja bezp. już jest wykonana). Jedną chce mieć jako Master a 2gą jako Slave (w jakich trybach to się okaże). Chcę tak jakby zasymulować (w ramach edukacji) np. układ pcf8574, by zwierając jakiś pin na niewolniku wywołać odpowiedni stan na tym samym układzie, oczywiście sterując go masterem.
Zasadniczy problem z TWI: czy da się w AvrStudio 4 tak zasymulować pracę przykładowego programu, by wyzerować bit (wpisać 1) TWINT w rejestrze TWCR, czy trzeba go "wymusić" np. kliknięciem myszką? Jak nazwa wskazuje jest to przerwanie, a choć robiłem jakieś zegarki dawno temu, trochę nie rozumiem go w tym miejscu. Może symulator AS4 nie ustawi go i trzeba to fizycznie wykonać przez skomunikowanie procków?
Nie mam fizycznego debuggera, więc tylko na tym się opieram. Programowałem i sprawdzałem czy sekwencja startu przeszła przez zgaszenie diody na płytce testowej(klawisz załącza pierwszy krok startu, po nim powinna zgasnąć diodka), ale ta dalej się świeci.
problem podobny jak w temacie
ATMEGA32 - Problem z TWI
ale tam kolega rozwiązał go przez ustawienie TWINT...
Może coś w AvrStudio4 mam źle ustawione? Jakieś biblioteki nie takie?
Więc tak, kod wygooglowany/elektrodowany wygląda następująco (najważniejsze jego części):
Oczywiście to część kodu przy której się zawiesza, a jest on wszędzie opisywany, np http://radzio.dxp.pl/twi/ albo http://ds5.agh.edu.pl/~czaro/naukowo/soft/avr_twiobsluga.pdf
Wywołuję funkcję u2c_start w części głównej (tylko kilka linijek, by sprawdzić czy działa):
Oczywiście program zapętla się przy TWINT, a powinien iść dalej, gdyby flaga się ustawiła zgodnie z linijką
Pewnie czegoś z przerwaniami nie dostrzegam/nie rozumiem... albo mam fizycznie połączyć te At8? Choć wydawałoby się to dziwne- powinien zwrócić kod błędu program gdy nie jest slave dostępny, czy mylę się?
Proszę o wskazanie błędu lub o nakierowanie nad czym się zastanowić i co dokładniej doczytać (no i o wyrozumiałość (= )
Przeczytałem regulamin oczywiście i przewertowałem forum (z którego wziąłem wzory kodów), noty aplikacyjne (na których się opierałem odn. teorii), znalazłem mnóstwo artykułów (wszystkie zarchiwizowane już mam więc są pod ręką)...
Jestem może nie początkującym jeśli idzie o uP, ale na pewno dosyć oporny na wiedzę z tym tematem i jej przyswajanie postępuje niestety powoli, więc sorka za niedobór jakiejś części wiedzy.
Do rzeczy, bo może uda się szybko zamknąć temat. Potrzebuję skomunikować narazie 2 tytułowe AT8, by nauczyć się w praktyce działania i2c (docelowo mają komunikować się w niewolniczym trybie wysyłającym i odbierającym z robotami mobilnymi opartymi o Basic Atom Pro i/lub Basic Stamp przez medium bezprzewodowe- dzięki modułom rfm12, przy czym komunikacja bezp. już jest wykonana). Jedną chce mieć jako Master a 2gą jako Slave (w jakich trybach to się okaże). Chcę tak jakby zasymulować (w ramach edukacji) np. układ pcf8574, by zwierając jakiś pin na niewolniku wywołać odpowiedni stan na tym samym układzie, oczywiście sterując go masterem.
Zasadniczy problem z TWI: czy da się w AvrStudio 4 tak zasymulować pracę przykładowego programu, by wyzerować bit (wpisać 1) TWINT w rejestrze TWCR, czy trzeba go "wymusić" np. kliknięciem myszką? Jak nazwa wskazuje jest to przerwanie, a choć robiłem jakieś zegarki dawno temu, trochę nie rozumiem go w tym miejscu. Może symulator AS4 nie ustawi go i trzeba to fizycznie wykonać przez skomunikowanie procków?
Nie mam fizycznego debuggera, więc tylko na tym się opieram. Programowałem i sprawdzałem czy sekwencja startu przeszła przez zgaszenie diody na płytce testowej(klawisz załącza pierwszy krok startu, po nim powinna zgasnąć diodka), ale ta dalej się świeci.
problem podobny jak w temacie
ATMEGA32 - Problem z TWI
ale tam kolega rozwiązał go przez ustawienie TWINT...
Może coś w AvrStudio4 mam źle ustawione? Jakieś biblioteki nie takie?
Więc tak, kod wygooglowany/elektrodowany wygląda następująco (najważniejsze jego części):
#include <inttypes.h>
#include <avr/interrupt.h>
//#include <avr/signal.h>
#include <C:\WinAVR-20090313\avr\include\compat\twi.h>
#include <avr/io.h>
#include <util/delay.h>
//Definicja czestotliwosci taktowania zegara
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
//Czestotliwosc magistrali I2C
#define SCL_CLOCK 100000L
//Inicjalizacja magistrali I2C
void i2c_init(void)
{
//Czestotliwosc TWI 100 KHz TWPS = 0 => preskaler = 1
TWSR = 0; //brak preskalera
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
}
/*Wysyla sygnal start na magistrale,
adresuje urzadzenie oraz okresla kierunek transmisji
zwraca 0 jezeli urzadzenie jest dostepne, 1 gdy wystapil blad*/
unsigned char i2c_start(unsigned char address)
{
uint8_t twst; // typ zmiennej unsigned integer o dł. słowa 8b (=
//START
TWBR=32;
TWSR &= ~0x03;
TWCR = (1<<TWIE);
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// czekaj na zakonczenie transmisji
while(!(TWCR & (1<<TWINT)));
// Sprawdz rejestr statusu
twst = TW_STATUS & 0xF8;
//wystapil blad, zwroc 1
if ( (twst != TW_START) && (twst != TW_REP_START))Oczywiście to część kodu przy której się zawiesza, a jest on wszędzie opisywany, np http://radzio.dxp.pl/twi/ albo http://ds5.agh.edu.pl/~czaro/naukowo/soft/avr_twiobsluga.pdf
Wywołuję funkcję u2c_start w części głównej (tylko kilka linijek, by sprawdzić czy działa):
int main (void)
{
int j; // zmienna j by coś było w rejestrze TWDR jako dana
j = 0xCC;
while (1)
{
i2c_init(); // ustawienie preskalera
TWDR = j; // dana do TWDR
i2c_start(0x2); // byle jaki adres
}
}Oczywiście program zapętla się przy TWINT, a powinien iść dalej, gdyby flaga się ustawiła zgodnie z linijką
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);Pewnie czegoś z przerwaniami nie dostrzegam/nie rozumiem... albo mam fizycznie połączyć te At8? Choć wydawałoby się to dziwne- powinien zwrócić kod błędu program gdy nie jest slave dostępny, czy mylę się?
Proszę o wskazanie błędu lub o nakierowanie nad czym się zastanowić i co dokładniej doczytać (no i o wyrozumiałość (= )
