ATTiny84 mit Arduino Uno programmieren - Probleme mit Core von Google Code

Hallo,

ich habe den Nachmittag über versucht einen ATTiny84 mit einem Arduino Uno zu programmieren. Anfänglich hatte ich einen "falschen" oder alten Core - weshalb ich hier einen Thread aufgemacht habe. Dann bin ich über einen ATTiny Core auf GitHub gestoßen, mit dem es dann geklappt hat, ein Lämpchen zum blinken zu bekommen.

Nun habe ich versucht die JeeLib mit diesem GitHub-Core auf einem ATTiny84 zum Laufen zu kriegen. Dabei bekam ich stets eine Fehlermeldung:

jeelib - error: 'Serial' was not declared in this scope

Nach etwas Recherche fand ich einen Newsgroup-Eintrag von jemandem, der meinte, es läge am "falschen" ATTiny Core. Man solle den auf Google Code verwenden.

Also, Version xxx.15 runtergeladen, draufgepackt, flashen bringt keine Fehlermeldung mehr - allerdings funktioniert auch der einfache Blink-Sketch nicht mehr. D.h. der Sketch lässt sich auf den ATTiny84 laden, aber meine lustige LED blinkt nicht. Gleiche Schaltung, 30 Minuten zuvor, hat das mit dem Core von Google Code ja noch funktioniert...

Da ich einen Funksensor mit dem Tiny bauen wollte, bin ich also auf die TinyTX-Seite gegangen, und habe die Augen nach dem genutzten ATTiny-Core aufgehalten (http://nathan.chantrell.net/tinytx-wireless-sensor/)

Dort wird folgender Core verwendet: http://code.google.com/p/arduino-tiny/downloads/detail?name=arduino-tiny-0100-0017.zip&can=2&q= (xxx. 17 - also etwas neuer).

Also den Core rüberkopiert, Bootloader 1Mhz/8Mhz neu draufgepackt, auch mal den ArduinoISP-Sketch neu hochgeladen, aber die LED will einfach nicht blinken.

Nun stehe ich etwas doof da: Beim Upload der Sketche oder beim setzen des Bootloaders gab's keine Fehlermeldungen. Ist der Tiny durch? Oder der Core Mist?

Hat jemand eine Idee was ich da jetzt falsch gemacht habe? Die Verdrahtung des ATTiny84 mit dem UNO habe ich ebenfalls nochmal geprüft, die passt.

Spiel mal auf den Atiny ein einfaches Blinkprogramm, um zu testen ob er nocht geht. Dafür brauchst du die Serielle Schnittstelle nicht.

Hi,

ja, wie ich ja bereits geschrieben habe, blinkt die LED nicht, wenn ich den ATTiny-Core von Google Code (arduino-tiny) nutze.
Ich habe auch gerade die LED ausgetauscht - blinkt nicht.

Jetzt habe ich noch einmal den GitHub-Core rüberkopiert, den Blink-Sketch hochgeladen - und die LED blinkt! Es muss also am Core liegen.

Also:
Damit klappt’s nicht: http://code.google.com/p/arduino-tiny/
Damit klappt’s: GitHub - damellis/attiny: ATtiny microcontroller support for the Arduino IDE

Mit zweiterem bekomme ich aber folgenden Fehler, wenn ich versuche einen einfachen Blink-Sketch mit der JeeLib zu laden:

#include <JeeLib.h>  // Include library containing low power functions
int led = 8;
ISR(WDT_vect) { Sleepy::watchdogEvent(); } // Setup for low power waiting
 
void setup() {
  pinMode(led, OUTPUT);
}
 
void loop() {
  digitalWrite(led, HIGH);
  Sleepy::loseSomeTime(1000);      // Instead of delay(1000);
  digitalWrite(led, LOW);
  Sleepy::loseSomeTime(1000);      // Instead of delay(1000);
}

Und der Fehler:

In file included from D:\Daten\Benutzerprofil\Desktop\arduino-1.0.5\libraries\JeeLib/JeeLib.h:7,
                 from sketch_sep17a.ino:1:
D:\Daten\Benutzerprofil\Desktop\arduino-1.0.5\libraries\JeeLib/Ports.h:697: error: 'Serial' was not declared in this scope
D:\Daten\Benutzerprofil\Desktop\arduino-1.0.5\libraries\JeeLib/Ports.h:698: error: 'Serial' was not declared in this scope

Genau das gleiche Problem hatte ich auch. Lag aber glaube ich nur daran, dass ich eine falsche Pin-Zuordnung hatte... Prüfe doch nochmal die Belegung (pins_arduino.c):

#if defined( __AVR_ATtinyX4__ )
// ATMEL ATTINY84 / ARDUINO
//
//                           +-\/-+
//                     VCC  1|    |14  GND
//             (D  0)  PB0  2|    |13  AREF (D 10)
//             (D  1)  PB1  3|    |12  PA1  (D  9)
//                     PB3  4|    |11  PA2  (D  8)
//  PWM  INT0  (D  2)  PB2  5|    |10  PA3  (D  7)
//  PWM        (D  3)  PA7  6|    |9   PA4  (D  6)
//  PWM        (D  4)  PA6  7|    |8   PA5  (D  5)        PWM
//                           +----+

So kann man sich natürlich auch die Zeit um die Ohren schlagen.. Ich bin gerade auf folgenden Kommentar gestoßen: http://jeelabs.net/boards/7/topics/2119?r=2139#message-2139

Da stand schon was in Richtung Pin-Belegung falsch. Ich habe mir seinen Sketch genommen, und mit dem ATTiny Core von Google Code hochgeladen - das Mistding blinkt, nachdem ich's an den physischen Pin 2 gesteckt hab:

#include "pins_arduino.h" 
#define led PB0

void setup() {                
  pinMode(led, OUTPUT);     
}

void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

Ich habe mal nach der pins_arduino.h gesucht und den Abschnitt für den ATTiny84 gefunden - allerdings weiß ich nicht wirklich, wie ich's interpretieren soll - noch, ob's richtig ist:

#if defined( __AVR_ATtinyX4__ )

// ATMEL ATTINY84 / ARDUINO
//
//                           +-\/-+
//                     VCC  1|    |14  GND
//             (D  0)  PB0  2|    |13  AREF (D 10)
//             (D  1)  PB1  3|    |12  PA1  (D  9) 
//                     PB3  4|    |11  PA2  (D  8) 
//  PWM  INT0  (D  2)  PB2  5|    |10  PA3  (D  7) 
//  PWM        (D  3)  PA7  6|    |9   PA4  (D  6) 
//  PWM        (D  4)  PA6  7|    |8   PA5  (D  5)        PWM
//                           +----+

// these arrays map port names (e.g. port B) to the
// appropriate addresses for various functions (e.g. reading
// and writing)

In der Google Code-Core-Datei unter: C:\Program Files (x86)\Arduino\hardware\tiny\cores\tiny

Spricht man beim ATTiny die Pins nicht mit Pin1-X an? Sondern mit PB0 & PA0?!

define led PB0

-> #define pin1 PBO ;)

Jop, soweit bin ich ja schon. Meine Frage ist mehr, ob das "normal" ist? In vielen HowTos, auch zum Flashen der ATTinys mit anschließendem "nimm dir den Blink-Sketch, lad ihn hoch und schau ob's funktioniert" ist eben die Rede von Pins in Zahlenform - von PB0&Co. habe ich bisher nichts gelesen.

Hab mit dem Attiny nichts am Hut, aber ich denke es wird lediglich die direkte Ansprache an die Hardware sein, ählich mit den Port Hack beim Atmega.

Ein "Hack" ist das nicht. Das ist lediglich wie Pins bei Mikrocontrollern generell adressiert werden. Intern werden die durch Register verwaltet und da werden halt auf einem 8-Bit Prozessor immer 8 zu einem Port zusammengefasst (und diese mit Buchstaben bezeichnet). Die Arduino IDE abstrahiert das lediglich und versteckt es. Leider aber mit extrem ineffizienten Methoden.

So als "Hack" wollte ich es auch nicht darstellen. Kam nur irgendwo in dem Zusammenhang. Kann auch sein das es ein Artikel auf HackADay war.

Doch das funktioniert auch wenn man anstatt PB0 nur 0 schreibt (für D0)...

PB0 ist der AVR-Name des Pins. 0 oder D0 sind Arduino Bezeichnungen. Damit kann der Prozessor an sich nichts anfangen. Die Arduino IDE enthält Funktionen wie digitalRead und digitalWrite die das Setzen und Auslesen von Pins in vielen Situationen stark vereinfachen, da das ganze System auf Anfänger ausgerichtet ist und die AVR-Befehle dafür etwas kryptisch erscheinen können. Das geht allerdings auch auf Kosten der Geschwindigkeit und man kann nicht mehrere Pins gleichzeitig ansprechen. Für sehr viele Anwendungen ist es aber ausreichend.

Also bei mir funktioniert es jedenfalls mit der angabe der Pin-Nummer nicht - zumindest mit dem Core von Google Code. Mit dem vom MIT schon. Nun also die Preisfrage: Krieg ich's irgendwie auch mit der Pin-Nummer mit dem Core von Google hin? Indem ich irgendwo selbst die Pin-Belegung hinterlege o.ä.?

Gottverdammt; Stunden hab ich mich gewundert warum die LED nicht blinkt... Ich habe die falsche Pin-Map verwendet!

Falsch:

Richtig:

Da kann man sich echt nen Wolf suchen...

Ja das hat mich auch zwei Tage gekostet... Hatte dich doch aber extra nochmals auf die pins_arduino.c hingewiesen, dort wird die Belegung aufgeführt ;)