Forum: Mikrocontroller und Digitale Elektronik nanite841, ATiny841


von Axel S. (axelac)


Angehängte Dateien:

Lesenswert?

Bei Watterott gib es ein sehr kleines Arduino IDE kompatibles Board 
(Wattuino Nanite 841). Es ist bestückt mit dem ATtiny841, Dieser Tiny 
ist für kleine Anwendungen mit Batteriebetrieb hervorragend 
ausgestattet.
Neben AD Konverter, SPI und I2C Interface sind auch  2 Hardware UARTS 
vorhanden.
Im ATtiny ist bereits ein USB Bootloader (Micronucleus)  integriert, dh. 
dieses Miniboard kann direkt über USB programmiert werden.
Die normale Arduino IDE 1.6.5 kann über den Boardmanager auf das Nanite 
Board ergänzt werden.
Dafür muss in den Voreinstellungen das Feld "Additional Boards Manager 
URL" um 
https://github.com/watterott/wattuino/raw/master/software/Arduino/package_watterott_index.json 
ergänzt werden, dann tauchen im Boardmanger (Menu Platine, Boards 
Manager...) unten in der Liste "Watterotts AVR Boards" auf, nach 
Installation kann die IDE auf das Board mit dem ATtiny841  eingestellt 
werden. Weiterhin müssen je nach PC Betriebssystem für den Micronucleus 
Bootloader noch die USB Treiber installiert werden (Windows) bzw. bei 
Linux die USB Rules in rules.d ergänzt werden.
Dann sollte das  Board von der IDE erkannt werden und der Compiler 
durchlaufen. In der IDE kann unter Menu Programmer eine beliebige 
Auswahl stehen (zB. USBasp), da die IDE direkt über USB mit dem 
Micronucleus Bootloader kommuniziert.
Die Standard Compiler Libs sind noch nicht optimal auf denn ATtiny841 
abgestimmt, so wird zB. in  pinMode(pin,INPUT_PULLUP) der Inputpin ohne 
Pullup geschaltet. Daher braucht man doch externe Pullup Widerstände. 
Ein angepasster Arduino Core ist aber auch schon unter 
https://github.com/SpenceKonde/arduino-tiny-841 verfügbar.

Das kleine Board lässt sich perfekt auf ein Minibreadboard stecken und 
mit exterenen Komponenten ergänzen. Ich habe eine kleine 
Beispielanwendung geschrieben, die einen ALPS Drehencoder ausliest und 
die ermittelten Zählerwerte auf drei LEDs binaer ausgibt und zusätzlich 
über die serielle
Schnittstelle ausgibt. Die können mit einem USB-Seriell Wandler am PC im 
seriellen Fenster der IDE angezeigt werden.
Das Programm benötigt insgesamt 2670 Byte und damit 41% des verfügbaren 
8K Flash Programmspeichers.

[c]
/*
  Read rotary encoder and display count binary with 3 leds
  and send count value through UART
  A.Schnell  Sept. 2015
 */

// pin numbers:
const int encbutton = 5;    // Drehencoder Pushbutton PA5
const int d1 = 7;           // Drehencoder switch1 PA6
const int d2 = 6;           // Drehencoder switch2 PA7

const int blueled = 8;      // on Board Led PB2
const int led1  = 0;        // red led1 PA0
const int led2  = 3;        // red led2 PA3
const int led3 =  4;        // red led3 PA4
// D1 - TX,  D2 - RX  for serial predefined PA1, PA2

// variables:
int buttonState = LOW;      // button status
int counter;
const char graytab[] = { 0,1,-1,0, -1,0,0,1, 1,0,0,-1, 0,-1,1,0 };
unsigned char graycode = 0;
unsigned char encoderin,sw1,sw2;

void setup() {
  Serial.begin(9600);
  // initialize the LED pins as an output:
  pinMode(blueled, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  // initialize the encoder pins as an input:
  pinMode(encbutton, INPUT_PULLUP);
  pinMode(d1, INPUT_PULLUP);
  pinMode(d2, INPUT_PULLUP);
}

void loop() {

  buttonState = digitalRead(encbutton);
  digitalWrite(blueled, !buttonState);  //show state of encbutton on 
blueled

  sw1 = digitalRead(d1);
  sw2 = digitalRead(d2);

  encoderin = sw1*32 + sw2*16;   // encoder state to bit 4 and 5
  graycode |= encoderin;         // copy to graycode
  graycode >>= 2;                // shift to bit 3 and 2,
                                 // last state shifted to bit 1 and 0
  counter += graytab[graycode];  // +1 / -1 from table only if state 
changed

  digitalWrite(led3,counter & 0b00000001);  // binary display of counter
  digitalWrite(led2,counter & 0b00000010);
  digitalWrite(led1,counter & 0b00000100);

  Serial.println(counter);

}
/[c]

von Jan K. (madengineer)


Lesenswert?

Axel S. schrieb:
> Die Standard Compiler Libs sind noch nicht optimal auf denn ATtiny841
> abgestimmt, so wird zB. in  pinMode(pin,INPUT_PULLUP) der Inputpin ohne
> Pullup geschaltet. Daher braucht man doch externe Pullup Widerstände.

Das liegt daran, dass Atmel hier mal wieder etwas verändert hat...
Neben den normalen Portregistern DDR, PORT, PIN, gibt es hier nun ein 
PUE, sprich Pullup-Enable Register.
Das ist ein nettr kleiner Fallstrick bei dem Controller, ich spreche da 
aus Erfahrung.
Man sollte außerdem aufpassen, da das I2C-Modul nur den Slavemodus 
unterstützt.

von Uwe (de0508)


Lesenswert?

Hallo,

als Ergänzung sei noch mitgeteilt, dass LunaAVR auch schon lange den 
ATtiny441/ATtiny841 unterstützt und das PUE Register ist in der 
Standartbibliothek enthalten, und erledigt den Rest.

von Axel S. (axelac)


Lesenswert?

Mit einer kleinen Ergänzung kann das PUE Register aber auch direkt für 
die Inputpins gesetzt werden, dann können die externen Pullup 
Widerstände entfernt werden:

[c]
  ....
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  // initialize the encoder pins as an input:
  PUEA = 0b11100000;  // Pullup for PA5 PA6 und PA7 !
  pinMode(encbutton, INPUT_PULLUP);
  pinMode(d1, INPUT_PULLUP);
  pinMode(d2, INPUT_PULLUP);
  ....
/[c]

von Draco (Gast)


Lesenswert?

Wo gibts hier denn ne Frage?! Oder ist das Werbung für diesen 10000. 
Arduino Dingens? Dann ab in den Marktbereich damit bitte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.