Go Down

Topic: Lettura pin attiny85 (Read 424 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy