Che naturalmente è uno dei miei titoli un po' ad effetto
ma che io abbia un problema con un attiny e che prima andasse bene è vero
premessa:
sempre con il mio collega inganniere stiamo scrivendo il rogramma per i "satelliti" del sistema di rilevazione temperature distribuite (un 5 gradi a te, 12 a quello la, 7 me lo tengo io)
OPS, sbagliavo: sistema distribuito di rilevazione temperatura
è distribuito il sistema, non la temperatura
comunque, causa errato acquisto sono arrivati degli attiny 45, che sapevo essere insufficenti per i miei scopi, ma almeno ho provato a pezzi le varie funzioni del programma
ecco lo scketch che mi fa dannare:
#include <SoftwareSerial.h>
#define RX 1 // *** D1, Pin 6
#define TX 2 // *** D2, Pin 7
#define LED 4 // *** D4, Pin 3
SoftwareSerial Serial(RX, TX);
unsigned long int tempo;
float temp;
// Librerie termometro
//#include <OneWire.h>
//#include <DallasTemperature.h>
//#define ONE_WIRE_BUS 3 // *** D3, Pin 2
// Su il protocollo onewire
//OneWire oneWire(ONE_WIRE_BUS);
// dichiariamo un termometro sul bus unewire
//DallasTemperature sensors(&oneWire);
#define INDIRIZZO 'A'
#define START '#'
#include <avr/sleep.h>
#include <avr/wdt.h>
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
volatile boolean f_wdt = 1;
void setup()
{
pinMode(4, OUTPUT);
digitalWrite(4, 0);
Serial.begin(9600);
setup_watchdog(9); // 8 secondi
// sensors.begin();
}
void trasmetti()
{
digitalWrite(4, 1);
// al pin 4 un led, per sapere che sta lavorando
Serial.begin(9600);
delay(100);
Serial.write(START);
Serial.write(INDIRIZZO);
Serial.println(1250);
delay(100);
digitalWrite(4, 0);
}
void loop()
{
if (f_wdt == 1)
{
f_wdt = 0;
// digitalWrite(4, 1); // energia al termometro
// delay(100);// per dare il tempo di stabilizzarsi
// leggo
// temp = sensors.getTempCByIndex(0);
// digitalWrite(4, 0);
trasmetti();
system_sleep();
}
}
void system_sleep()
{
cbi(ADCSRA, ADEN); // switch Analog to Digitalconverter OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable();
sleep_mode(); // System sleeps here
sleep_disable(); // System continues execution here when watchdog timed out
sbi(ADCSRA, ADEN); // switch Analog to Digitalconverter ON
}
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
void setup_watchdog(int ii)
{
byte bb;
int ww;
if (ii > 9) ii = 9;
bb = ii & 7;
if (ii > 7) bb |= (1 << 5);
bb |= (1 << WDCE);
ww = bb;
MCUSR &= ~(1 << WDRF);
// start timed sequence
WDTCR |= (1 << WDCE) | (1 << WDE);
// set new watchdog timeout value
WDTCR = bb;
WDTCR |= _BV(WDIE);
}
// Watchdog Interrupt Service / is executed when watchdog timed out
ISR(WDT_vect)
{
f_wdt = 1; // set global flag
}
che ho barbaramente copiato in giro, lo ammetto senza alcuna vergogna (sono uno svergognato, lo so)
il problema?
con una attiny 45 va che è una meraviglia, attraverso un link radio HC12, non perde un colpo, che comunque faro un checksum e una ritrasmissione su errore, dopo
oggi arriva un (1) solo uno, ecceccavolo, mi sembrava di averne ordinati di più, ma tantè
dicevo, arriva un attiny 85
vai che ci do che ci do.....
cambio impostazione del processore, carico il programma e vai bello..............
NON VA
che delusione
avvabbe', devo mettere clock internal 8Mhz, ettipareva
emmipareva sì, NON VA nemmeno con clock 8Mhz, nel terminale seriale arrivano caratteri non stampabili
ad ogni "raffica" di trasmissione mi arrivano 4 caratteri non stampabili, che il terminale non mi mostra, ogni tanto compare una f o una x, così a caso...
ovvio che ho un problema di timing
ma purtroppo sono arrivato più o meno al confine delle mie conoscenze, mi spiace
chi mi da una spinta?