atTiny 85 doet me hoofdpijn krijgen

Arduino specifieke Software
Berichten: 5
Geregistreerd: 24 Mei 2021, 20:03
Woonplaats: Boom, België

atTiny 85 doet me hoofdpijn krijgen

Berichtdoor michel.de.meester » 24 Mei 2021, 20:26

Hallo Allemaal,

Ben nieuw op dit forum, heb wel ervaring met RPI in python en vroeger gebruikte ik regelmatig de basic stamp serie.

Wat wil ik doen, een atTiny85 gebruiken als analoge i2c sensor (meet stromen van -25 tot +25 amp d.m.v. een stroomtrafo)
Dit deel heb ik allemaal werkend, de atTiny85 stuurt netjes zijn data naar een Nano in 2 bytes.

Wat me niet lukt is om een ledje gedurende 100ms te laten "flashen" wanneer de i2c request toekomt op de atTiny85 en nadat de data effectief is verzonden.

Ik weet wel dat bij gebruik van de TinyWireS lib je geen Delay() kan gebruiken maar heb dit opgelost met millis().

BTW ik gebruik geen bootloader op de atTiny, programmeer hem met een usbasp.

Hieronder de code die wel werkt, hier maak ik gewoon de output hoog na het ontvangen van de request en terug laag na het verzenden van de data
attiny85_sketch.ino
Code: Alles selecteren
// Code for the ATtiny85

// Michel De Meester, 2021

// After request from the i2c master reads analog input on ADC2 (PIN 3), convert it to a 2 byte array
// and sent it as 2 separate bytes

#include <TinyWireS.h>          // I2C lib for attiny
#include <avr/io.h>             // IO lib for attiny

const byte analogInPin = A2;    // Output of current sensor is connected to ADC2 (PIN 3)
const int ledPin = 3;           // Assign PB3 to the LED (PIN 2)

#define I2C_SLAVE_ADDRESS 0x4   // Address of the slave
 
void setup()
{
  pinMode(ledPin, OUTPUT);
  TinyWireS.begin(I2C_SLAVE_ADDRESS);  // Join i2c network
  TinyWireS.onRequest(requestEvent);   // Routine runs when I2C data is requested
}
 
void loop()
{
  // This needs to be here
  TinyWireS_stop_check();
}
 
// Gets called when the ATtiny receives an i2c request
void requestEvent()
{
  // Turn on the led to see the i2c request arrived
  digitalWrite(ledPin, HIGH);              // turn the LED on
           
  // read the input on analog pin "analogInPin"
  int16_t sensorValue = analogRead(analogInPin);

  // divide "sensorValue" in 2 separate bytes and sent them one by one
  byte byteArray[2];
  byteArray[0] = (sensorValue >> 8) & 0xFF;
  byteArray[1] = sensorValue & 0xFF;
  TinyWireS.send(byteArray[0]);
  TinyWireS.send(byteArray[1]);

  // Turn off the led to see the i2c data was sent   
  digitalWrite(ledPin, LOW);               // turn the LED off
}


Nu de code die niet werkt en waarin ik de led 100ms wil laten oplichten met de functie pulseLed:
attiny85_sketch_v2
Code: Alles selecteren
// Code for the ATtiny85

// Michel De Meester, 2021

// After request from the i2c master read analog input on ADC2 (PIN 3), convert it to a 2 byte array
// and sent it as 2 separate bytes

#include <TinyWireS.h>          // I2C lib for attiny
#include <avr/io.h>             // IO lib for attiny

const byte analogInPin = A2;    // Output of current sensor is connected to ADC2 (PIN 3)
const int ledPin = 3;           // Assign PB3 to the LED (PIN 2)

#define I2C_SLAVE_ADDRESS 0x4   // Address of the slave
 
void setup()
{
    pinMode(ledPin, OUTPUT);
    TinyWireS.begin(I2C_SLAVE_ADDRESS);  // Join i2c network
    TinyWireS.onRequest(requestEvent);   // Routine runs when I2C data is requested
}

void loop()
{
    // This needs to be here
    TinyWireS_stop_check();
}
 
// Gets called when the ATtiny receives an i2c request
void requestEvent()
{
  // Flash the led to see the i2c request arrived
  pulseLed();
 
  // read the input on analog pin "analogInPin"
  int16_t sensorValue = analogRead(analogInPin);

  // divide "sensorValue" in 2 separate bytes and sent them one by one
  byte byteArray[2];
  byteArray[0] = (sensorValue >> 8) & 0xFF;
  byteArray[1] = sensorValue & 0xFF;
  TinyWireS.send(byteArray[0]);
  TinyWireS.send(byteArray[1]);

  // Flash the led to see the i2c data was sent   
  pulseLed();
}


// Pulse the "ledPin" for 100 miliseconds
void pulseLed()
{
  digitalWrite(ledPin, HIGH);              // turn the LED on
  unsigned long currentTime = millis();    // set currentTime to internal timer
   
  while(millis() <= currentTime + 100UL){  // use the UL identifier for Unsigned Long
  // Do nothing, just wait for 100 ms
  }
  digitalWrite(ledPin, LOW);               // turn the LED off
}
 


Alvast bedankt,
Michel

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: atTiny 85 doet me hoofdpijn krijgen

Berichtdoor shooter » 25 Mei 2021, 17:44

die pulseled is prima bedacht echter in de loop moet je kijken of je over de tijd bent en dan moet je dus ledje uit zetten.dus die while wordt een if in de loop. want in jouw geval stopt alles 100 milliseconde en dan gaat i2c in de fout.
paul deelen
shooter@home.nl

Berichten: 5
Geregistreerd: 24 Mei 2021, 20:03
Woonplaats: Boom, België

Re: atTiny 85 doet me hoofdpijn krijgen

Berichtdoor michel.de.meester » 26 Mei 2021, 10:11

Hallo Shooter,

shooter schreef:in de loop moet je kijken of je over de tijd bent en dan moet je dus ledje uit zetten.dus die while wordt een if in de loop. want in jouw geval stopt alles 100 milliseconde en dan gaat i2c in de fout.



Ben even niet mee wat je wil zeggen met "die while wordt een if"

Ik moet sowieso een "loopje" maken dat 100ms duurt, dit kan met delay(), met while, met if - then etc.

Ik had ook al het vermoeden dat die 100 ms "blocking software" het i2c protocol deed struikelen.
Het beste zou eigenlijk zijn om die 100ms flash volledig uit de onRequest ISR te halen maar ik heb geen idee hoe dat te doen.

Alvast bedankt voor het meedenken.

Michel

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: atTiny 85 doet me hoofdpijn krijgen

Berichtdoor ctunes » 26 Mei 2021, 21:01

Paul heeft gelijk.

Wat je hier zou moeten doen is gebruik maken van de hardware-timers die je gewoon ter beschikking staan
Hier is een mooi voorbeeld:
https://circuitdigest.com/microcontroller-projects/arduino-timer-tutorial
Laatst gewijzigd door ctunes op 26 Mei 2021, 21:04, in totaal 1 keer gewijzigd.

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: atTiny 85 doet me hoofdpijn krijgen

Berichtdoor ctunes » 26 Mei 2021, 21:03

PS
Je kunt de timer triggeren op een moment dat jij kiest, een zgn one-shot timer.

(zie ook de documentatie van de atmega328/168)

OH wacht! Niet goed gelezen.

ATTiny ....


Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: atTiny 85 doet me hoofdpijn krijgen

Berichtdoor shooter » 26 Mei 2021, 21:24

ctunes: leuk idee, maar de atiny is wat ingewikkeld als je een hardware timer wilt want er zitten wat weinig pinnen op
paul deelen
shooter@home.nl

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: atTiny 85 doet me hoofdpijn krijgen

Berichtdoor ctunes » 26 Mei 2021, 23:05

Hardware timer "on silicon", die een software interrupt kan genereren.

Waarom weiger je mij te begrijpen?

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 20 gasten