Hey Leute,
ich weiß langsam nicht mehr weiter und sitz schon seit Tagen an meinem Problem. Ich bin in der Microcontroller-Geschichte noch ziemlich neu und mache gerade versuche mit I2C.
grober Aufbau: Attiny85(tinywireM <- Master) soll Informationen an Attiny85(tinyWireS <-Slave) senden.
Problem: Der Bus funktioniert nicht bzw. die gesendetet Daten werden falsch und unregelmässig umgesetzt vom Slave ..die Anzeige ändert sich alle paar Sekunden bzw. Minuten und dann nicht richtig.
Was soll passieren?
Meine 3 LEDs sollen testweise nacheinander leuchten (kleines Lauflicht).
Setup:
-2x Attiny85 1Mhz
-Aruino Uno as ISP
-Pull-Ups: 10k bzw 5k(2x10k parallel)
-Bibliotheken: TinyWireM und TinyWireS
-bei der TinyWireS hab ich 2 unterschiedliche Versionen probiert jeweils mit und ohne .onreceive Callback
Wenn im Master Loop kein Delay verwendet wurde, hat es mal funktioniert...dann kann ich aber meine funktion nicht umsetzten (bzw. nur den Blinker).
Master-Code:
#include <TinyWireM.h>
//#include <USI_TWI_Master.h>
int num=3;
void setup() {
// put your setup code here, to run once:
TinyWireM.begin();
//delay(3000);
}
void loop() {
// put your main code here, to run repeatedly:
//TinyWireM.beginTransmission(0x1);
//TinyWireM.send(B00000001);
//TinyWireM.endTransmission();
LED3();
delay(500);
LEDoff();
delay(500);
LED4();
delay(500);
LEDoff();
delay(500);
LED5();
delay(500);
LEDoff();
}
void LED3(){
TinyWireM.beginTransmission(0x1);
TinyWireM.send(3);
TinyWireM.endTransmission();
}
void LED4(){
TinyWireM.beginTransmission(0x1);
TinyWireM.send(4);
TinyWireM.endTransmission();
}
void LED5(){
TinyWireM.beginTransmission(0x1);
TinyWireM.send(5);
TinyWireM.endTransmission();
}
void LEDoff(){
TinyWireM.beginTransmission(0x1);
TinyWireM.send(6);
TinyWireM.endTransmission();
}
Slave-Code:
#include <TinyWireS.h>
#define I2C_SLAVE_ADDR 0x1
uint8_t master_data[16];
uint8_t master_bytes;
int DREI = 1;
int VIER = 3;
int FUENF = 4;
byte msg = 0;
void receiveEvent(uint8_t num_bytes)
{
uint8_t i;
uint8_t master_data[16];
master_bytes = num_bytes;
for (i = 0; i < master_bytes; i++)
master_data[i] = TinyWireS.receive();
if (TinyWireS.available()) {
msg = TinyWireS.receive();
if (msg == 1){Blink(DREI,2);}
if (msg == 3) {
digitalWrite(DREI, HIGH);
}
if (msg == 4) {
digitalWrite(VIER, HIGH);
}
if (msg == 5) {
digitalWrite(FUENF, HIGH);
}
if (msg == 6) {
digitalWrite(DREI, LOW);
digitalWrite(VIER, LOW);
digitalWrite(FUENF, LOW);
}
}
}
void setup() {
// put your setup code here, to run once:
pinMode(DREI, OUTPUT);
pinMode(VIER, OUTPUT);
pinMode(FUENF, OUTPUT);
TinyWireS.begin(I2C_SLAVE_ADDR);
TinyWireS.onReceive(receiveEvent);
delay(30);
Blink(DREI,5);
}
void loop() {
if (TinyWireS.available()) {
msg = TinyWireS.receive();
if (msg == 1){Blink(DREI,2);}
if (msg == 3) {
digitalWrite(DREI, HIGH);
}
if (msg == 4) {
digitalWrite(VIER, HIGH);
}
if (msg == 5) {
digitalWrite(FUENF, HIGH);
}
if (msg == 6) {
digitalWrite(DREI, LOW);
digitalWrite(VIER, LOW);
digitalWrite(FUENF, LOW);
}
}
TinyWireS_stop_check();
}
void Blink(byte led, byte times){ // poor man's display
for (byte i=0; i< times; i++){
digitalWrite(led,HIGH);
delay (250);
digitalWrite(led,LOW);
delay (175);
}
}
beim Versuch ohne .onReceive( wäre mir lieber) hab ich meine Auswertung natürlcih im main Loop gemacht.
Wie gesagt ändern sich die Zustände der LEDs so wie sie gerade lustig sind ://
Ich hoffe ihr könnt mir helfen