atTiny 85 doet me hoofdpijn krijgen
8 berichten
• Pagina 1 van 1
- michel.de.meester
- Berichten: 5
- Geregistreerd: 24 Mei 2021, 20:03
- Woonplaats: Boom, België
atTiny 85 doet me hoofdpijn krijgen
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
Nu de code die niet werkt en waarin ik de led 100ms wil laten oplichten met de functie pulseLed:
attiny85_sketch_v2
Alvast bedankt,
Michel
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
Re: atTiny 85 doet me hoofdpijn krijgen
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
shooter@home.nl
- michel.de.meester
- Berichten: 5
- Geregistreerd: 24 Mei 2021, 20:03
- Woonplaats: Boom, België
Re: atTiny 85 doet me hoofdpijn krijgen
Hallo Shooter,
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
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
Re: atTiny 85 doet me hoofdpijn krijgen
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
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.
Re: atTiny 85 doet me hoofdpijn krijgen
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 ....
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 ....
Re: atTiny 85 doet me hoofdpijn krijgen
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
shooter@home.nl
Re: atTiny 85 doet me hoofdpijn krijgen
Hardware timer "on silicon", die een software interrupt kan genereren.
Waarom weiger je mij te begrijpen?
Waarom weiger je mij te begrijpen?
8 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: enasahumuqu en 37 gasten