Guten Abend allerseits!
Kann mich mal einer aufklären, warum bei einer TWI-Übertragung zwischen ATTiny 85 (Slave Sender) und Atmega328 teilweise negative Werte als Ergebnis ankommen?
ATtiny85
int sensorValue;
#include <Wire.h>
void setup() {
pinMode(2, INPUT); // A3 !!!
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
delay(1000);
digitalWrite(4, LOW);
Wire.begin(8); // join i2c bus with address #8
Wire.onRequest(requestEvent); // register event
}
void loop() {
delay(100);
sensorValue = analogRead(A3);
sensorValue = sensorValue / 4;
if (sensorValue > 127) {
digitalWrite(4, HIGH);
}
else {
digitalWrite(4, LOW);
}
}
void requestEvent() {
Wire.write("Hello "); // respond with message of 6 bytes
Wire.write(sensorValue);
// as expected by master
}
Atmega
#include <Wire.h>
int b;
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop() {
byte a=0;
Wire.requestFrom(8, 7); // request 6 bytes from slave device #8
while (Wire.available()) { // slave may send less than requested
char c = Wire.read(); // receive a byte as character
a++;
if(a<7){ Serial.print(c);}
else{b=c;
Serial.print(b);}// print the character
}
Serial.println();
delay(500);
}
Das Hello aus dem ersten Wire.Write kommt richtig an.
Als zweite Ausgabe habe ich erst 0 - 127, die dann in -128 bis -1 übergeht.
PIN2 am ATTiny liest übrigens ein Poti aus.
while (Wire.available()) { // slave may send less than requested
char c = Wire.read(); // receive a byte as character
a++;
if(a<7){ Serial.print(c);}
else{byte b=c;
Serial.print(b);}// print the character
}
So kommt raus was soll. Verstehe ich nicht wirklich, aber nun. Das 'a' im zweiten Script ist übrigens eine Zählvariable um das 7. Byte zu erkennen.
Das habe ich auch länger gesucht.
In der Boarddefinition "ATtiny 25/45/85 (no Bootloader)"
Müsste der " SpenceKonde" sein.
Die Pinzuordnungen sind, nun ja, seltsam:
pinMode(2, INPUT); // ADC3 !!!
pinMode(1, OUTPUT); // PWM Pin6
Mein Tipp zu deinem Projekt:
Baue eine I2C-Verbindung zwischen den Systemen auf, bei der du nur einfache und bekannte Daten überträgst. Sobald das sicher funktioniert, erweitere das zu deinem Projekt.
Beim ATtiny habe ich bisher die Erfahrung gemacht, dass analoge Pins besser mit "Ax" definiert werden. Hängt sicher auch mit dem verwendeten core zusammen.
Die Nummern 1 bis 8 sind die Pinnummern des ICs und haben keine Bedeutung für die Programmierung.
PBn: Port B Pin n; wird so im Datenblatt verwendet und auch digitalWrite(PB4, LOW); ebenso wie analogRead(PB3); ist möglich.
An: Bezeichnung für analogRead(An)
(D n): Pinnummer für digitalRead(n) und digitalWrite(n)
Zur flexiblen Übertragung via I2C eignet sich ein struct eingebettet in ein union. Im struct stehen die zu übertragenen Variablen, während der zweite Zeiger auf den selben Speicherbereich vom Typ byte einzig der byteweisen Übertragung dient. Wichtig ist, ANZAHL muß stimmen, sonst gibt es Murks!