Hallo,
In een cursus die ik volg werd als opdracht gegeven om volgende code (https://www.arduino.cc/en/Tutorial/MasterWriter) aan te passen voor met TinyWire zodat een teller die loopt op de ATTiny wordt weergegeven op de seriële monitor van de Nano. Niet bijzonder moeilijk dus mits wat aanpassingen...
Code op de ATTiny:
#include <twi.h>
#include <TinyWire.h>
void setup() {
pinMode(3, OUTPUT);
TinyWire.begin(); // join i2c bus (address optional for master)
}
byte x = 0;
void loop() {
TinyWire.beginTransmission(8 ); // transmit to device #8
TinyWire.send(x); // sends one byte
TinyWire.endTransmission(); // stop transmitting
digitalWrite(3, HIGH);
x++;
delay(500);
}
Code op de Nano:
#include <Wire.h>
void setup() {
Wire.begin(8 ); // join i2c bus with address #8
Wire.onReceive(receiveEvent); // register event
Serial.begin(9600); // start serial for output
}
void loop() {
delay(100);
}
void receiveEvent(int howMany) {
while (Wire.available() > 0) {
byte x = Wire.read();
Serial.println(x, DEC);
}
}
Probleem waar ik nu mee zit is dat de teller er telkens mee ophoudt wanneer hij 127 overschrijdt. Ik kan hier geen enkele logische reden voor bedenken en heb me ondertussen al suf gezocht, zonder resultaat.
Waarschijnlijk iets heel eenvoudig, als iemand weet waarom dit gebeurd?
Omdat je een byte zend en die gaat maar zover.
GijKieken:
Omdat je een byte zend en die gaat maar zover.
Een byte is toch een waarde tussen 0 en 255?
Nope is signed dus -128 ..... +127
Dan moet je er een uint8_t van maken
Van de byte reference page
A byte stores an 8-bit unsigned number, from 0 to 255.
Tenzij het op een ATtiny anders is ge-implementeerd
nicoverduin:
Nope is signed dus -128 ..... +127
Dan moet je er een uint8_t van maken
Code opnieuw aangepast met declaratie uint8_t x ipv byte x...
...zonder resultaat. Ook rechtstreeks de waarde doorsturen als in TinyWire.write(0b10000000) levert geen resultaat.
I just don't get it 
Je zou eens kunnen proberen om ook de available aantal te printen op de Nano. Dan weet je of er iets binnenkomt. Mogelijk gaat her iets mis bij de wire send() vanaf de tiny omdat hij wel iets zeg over bit 7 als die gezet wordt.
Of test eens als je er een 16 bits int van maakt en die dan gaat verzenden.
De Nano kant lijkt niets aan te mankeren dus zit het al aan de tiny kant en dan moet je mogelijk zoeken in TinyWire
Uint16_t levert geen verbetering op... maar het lijkt inderdaad op de Tiny kant te zitten dan want zo gauw hij hoger gaat dan 127 is Write.available() = 0.
Bedoeling is van de opdracht is uiteindelijk een analoge waarde afkomstig van een trimmer (dus tussen 0 en 1023) door te sturen naar de Nano. Dus 2 bytes. Als zelf 1 byte niet lukt wordt het wel een beetje lastig natuurlijk...
Min of meer opgelost - met de Nano als master/ATTiny als slave is het me wel gelukt...
Hopelijk begrijp ik ooit het hoe en waarom...
Eens goed spitten in de data sheet van de tiny,waarschijnlijk werkt ze met char's,alsook de bibliotheek nazien.
Hoewel op het eerste zicht werkt de lib over het algemeen meen met uint8_t.