Go Down

Topic: Lettura pin attiny85 (Read 406 times) previous topic - next topic

erpomata

Salve ho 2 sketch dove leggo lo stato dei pin di un attiny85 e lo invio via seriale.
Il problema è che il primo sketch funziona regolarmente il secondo (dove leggo i pin tutti insieme attraverso la portb) non funziona e da valori a caso, ogni tanto trova uno stato alto quando non dovrebbe e viceversa e sembra essere più lento ad inviare le informazioni via seriale.
Ovviamente il collegamento elettrico è lo stesso.

Premetto che con arduino funziona regolarmente.

Allego gli sketch.

Dove sbaglio?
Grazie

Code: [Select]
#include <SoftwareSerial.h>
#include <avr/power.h>

const byte rx=3;
const byte tx=4;  //Pin 3
SoftwareSerial mySerial(rx, tx); // RX, TX
const byte x = 0;
const byte y = 1;
const byte z = 2;

void setup() 
{
  power_adc_disable();

  // set the data rate for the SoftwareSerial port
  mySerial.begin(57600);
  pinMode(x, INPUT);
  pinMode(y, INPUT);
  pinMode(z, INPUT);
}

void loop() // run over and over

  // definizione della struttura
  union RTX_b
  {
    unsigned char toSendByte;
    struct PinStato
    {
unsigned char x:
      1;
unsigned char z:
      1;
unsigned char y:
      1;
unsigned char Bit4:
      1;
unsigned char Bit5:
      1;
unsigned char Bit6:
      1;
unsigned char Bit7:
      1;
unsigned char Bit8:
      1;
    }
    Bits;
  }
  RTX_data;


  RTX_data.Bits.x = digitalRead(x);
  RTX_data.Bits.z = digitalRead(z);
  RTX_data.Bits.y = digitalRead(y);

  mySerial.write(RTX_data.toSendByte);
}





Code: [Select]
#include <SoftwareSerial.h>
#include <avr/power.h>

const byte rx=3;
const byte tx=4;  //Pin 3
SoftwareSerial mySerial(rx, tx); // RX, TX

void setup()  
{
 power_adc_disable();

 // set the data rate for the SoftwareSerial port
 mySerial.begin(57600);
 DDRB = B00010000; // Pin 4 come output, il primo pin a x è l'0
}

void loop() // run over and over
{  
 // definizione della struttura
 union RTX_b
 {
   unsigned char toSendByte;
   struct PinStato
   {
unsigned char x:
     1;
unsigned char z:
     1;
unsigned char y:
     1;
unsigned char Bit4:
     1;
unsigned char Bit5:
     1;
unsigned char Bit6:
     1;
unsigned char Bit7:
     1;
unsigned char Bit8:
     1;
   }
   Bits;
 }
 RTX_data;
 RTX_data.toSendByte=0;

 RTX_data.toSendByte = PINB & B00000111;
 
 mySerial.write(RTX_data.toSendByte);
}

http://www.paologiammarco.it
http://www.valentinamagni.it

erpomata

Da quello che ho potuto capire l'ide di arduino non gestisce bene la lettura/scrittura della porta portb di attiny85.
Con le classiche digitaRead/digitalWrite non ho problemi.

Se ne sapete di più.
http://www.paologiammarco.it
http://www.valentinamagni.it

leo72

Non ho mai usato la manipolazione diretta delle porte sui Tiny85 ma come cosa mi suona un po' strana.
Hai provato a fare un semplice Blink impostato su HIGH e LOW un pin mediante i registri, per vedere se è come dici tu oppure no? Se la cosa fosse confermata, sarebbe un bug non da poco (riguarderebbe avr-gcc). Alquanto improbabile ma non impossibile.

erpomata

:smiley-roll-blue: Bell'idea domani ci provo.

http://www.paologiammarco.it
http://www.valentinamagni.it

erpomata

Contrordine l'errore era tutto mio.

Risolto. Grazie.

Per la cronaca il test del blink l'ho fatto e funziona regolarmente.
http://www.paologiammarco.it
http://www.valentinamagni.it

leo72

Gli errori capitano a tutti  ;)

Go Up