• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
i2c i błędne dane.
#1
Cześć,
Miałem problemy z nieco większym programem wykorzystującym komunikację przez i2c dlatego napisałem sobie prosty program do testów i niewiem w czym problem. Program napisany w arduino, wykorzystuje komunikację przez i2c do wysyłania dwóch bajtów danych między dwoma procesorami. Program wysyła 2x 0 (zero), niby bardzo proste i przy połączeniu ze sobą dwóch arduino niema problemu bo program działa. Problem pojawia się po wgraniu programu na ATmega32. Wtedy jeden bajt jest wysyłany prawidłowo a drugi przyjmuje wartość 11111111 (255). Jakieś pomysły czym może to być spowodowane? Dodane rezystory podciągające 4,7k. Dodaję program nadajnika, odbiornika.
Master:
Kod:
#include <Wire.h>
int suma = 0;
void setup() {
 Wire.begin();        
 Serial.begin(9600);  
}

void loop() {
 Wire.requestFrom(8, 2);    

 while (Wire.available()) {
   Wire.write(0);
   delay(200);
   int c = Wire.read();
   delay(200);
   int d = Wire.read();
  // Serial.println("c");
   Serial.println(c, BIN);
  // Serial.println("d");
   Serial.println(d, BIN);

suma = CharNaInt(d, c);
Serial.print(suma);
Serial.println("mA");

 }
 delay(500);
}

uint16_t CharNaInt(uint8_t LByte, uint8_t HByte) {
return ((HByte << 8) + LByte);
}
Slave:
Kod:
#include <Wire.h>
void setup() {
 Wire.begin(8);                  
 Wire.onRequest(requestEvent);  
}
void loop() {}

void requestEvent() {    
 // przerwanie do wysłania danych po i2c
 Wire.write(50);

 Wire.write(0);
}


Załączone pliki
.pdf   sch.pdf (Rozmiar: 64.94 KB / Pobrań: 0)
 
Odpowiedź
#2
Widziałem wiele skopanych bibliotek I2C na Arduino. Musisz szukać innych, może będą działać albo napisać swoje.
 
Odpowiedź
#3
Wysyłam bajty pojedynczo i niema problemu. Chyba faktycznie biblioteka niedopracowana, ale dziwne, że między dwoma Arduino ten sam program działa bez zarzutów.
 
Odpowiedź
#4
W Arduino nic mnie nie dziwi. Błędów więcej niz w Windows.
Arduino może jest dobre na start, do prób, testów zabawy. Nic poważnego na Arduino zrobić sie nie da, bo z bibliotek Arduino niewiele zostanie. Kolejny problem to brak debugera.
Odezwą się głosy, że kiedyś nie używało się debugerów bo były bardzo drogie (bez 1000$ nie podchodź). Ale to były czasy 8051, Z8, które miały kilka/kilkanaście rejestrów IO. Programy pisało sie w ASM, bo C był drogi i pamięciożerny a uC miały od 512bajtów do 4kb pamięci programu. Teraz jest inaczej. Nie wyobrażam sobie sensownej pracy z np ARM bez debugera. Nie to, że się nie da, ale program zamiast pisać tydzień pisałbym kilka lat.
 
Odpowiedź
#5
Biblioteka nie jest z pakietu Arduino. Jak się przyjrzysz co wypluwa konsola, to jest to biblioteka z pakietu, dzięki któremu w ogóle jest możliwa zabawa Atmega32 w środowisku Arduino.   U mnie jest AppData\Local\Arduino15\packages\MightyCore\hardware\avr\1.0.8\libraries\Wire , "arduinowa" z ostrzeniami, ale kompiluje się z funkcją do wysyłania całego pakietu danych:
Kod:
void I2CWrite( void *data, int len) {
       Wire.write((byte *) data, len);
}
a ta z mightycore po ostrzeżeniach każe spadać.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#6
Faktycznie Smile, podmieniłem bibliotekę na oryginalną i wszystko działa jak należy.
Dzięki za pomoc!
 
Odpowiedź
#7
Haha, no zupełnie nie o to mi chodziło. Te procki Atmega 32A i 328P są podobne, ale mają pewne różnice w rejestrach. To ślepy traf, że akurat I2C jest konfigurowane w obu tak samo - dlatego zadziałała. Z UART na ten przykład by to nie przeszło. Jak już robisz takie podmiany to w przyszłości otwórz pliki h (tu to jest akurat twi.h w katalogu głębiej), zobacz jakie rejestry są zdefiniowane, otwórz kartę katalogową obu procków i porównaj co jest inaczej, co trzeba pozmieniać. Czasami są biblioteki, które np. obsługują pamięci tylko 1 producenta (wiadomo dlaczego), wystarczy zakomentować jedną linijkę, która to sprawdza i voila, jest uniwersalna.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#8
(27-06-2018, 08:44)kaczakat napisał(a): To ślepy traf, że akurat I2C jest konfigurowane w obu tak samo - dlatego zadziałała.
Akurat w AVR Mega I2C jest we wszystkich (przynajmniej ma moją wiedzę) obsługiwane tak samo. Inna obsługa I2C jest w Tiny, starych tiny, bo w nazewnictwie uC, po przejęciu Atmela przez Microchip, zaszły pewne zmiany. Kiedyś Mega88 teraz Tiny88.
Co do USART to fakt, są spore różnice. Najbardziej można sie sparzyć gdy uC ma jeden rejestr podzielnika UBRH gdzie młodsza połówka do USART 0, starsza USART 1.
W Timerach to dopiero jest bałagan, bez noty katalogowej lepiej nie robić. W wyjściach PWM (Mega128 a Mega1281) też.
Pomiędzy, nadal popularnym Mega8P a Mega8A (może B) też sa pewne różnice.

Słuszna jest więc uwaga o tym, aby czytać noty katalogowe i sprawdzać czy biblioteka poprawnie obsługuje układy peryferyjne.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości