Ich versuche für ein Modellhaus (Burg, Modellbahn) Kerzen bzw.
Fackelflackern über LEDs zu simulieren.
Dies ist auch recht simpel:
1
voidsetup(){
2
pinMode(5,OUTPUT);
3
pinMode(6,OUTPUT);
4
pinMode(7,OUTPUT);
5
pinMode(8,OUTPUT);
6
}
7
8
voidloop(){
9
analogWrite(5,random(150,255));
10
analogWrite(6,random(150,255));
11
analogWrite(7,random(150,255));;
12
analogWrite(8,random(150,255));
13
delay(random(100));
14
}
Auf einem Arduino funktioniert das einwandfrei (mit entsprechenden
geänderten ArduinoPWM Pins).
Um das ganze zu verkleinern, wollte ich das auf den ATTiny84 umsetzen.
Auf den Pins 7 und 8 werden die LEDs entsprechend "gedimmt" durch die
PWM. Aber auf den Pins 5 und 6 gibt es Probleme. Diese Blinken nur in
einer sehr schnellen, aber mit dem Auge wahrnehmbaren Frequenz.
Als Test:
Ein analogWrite(5,0); lässt die LED durchgängig leuchten.
Ein analogWrite(5,255); lässt die LED durchgängig aus.
Ein analogWrite(5,1); bis analogWrite(5,254); lässt die LED durchgängig
in unveränderter Frequenz und unveränderten AN und AUS Zeiten blinken.
(geschätzt 20mal die Sekunde).
Also habe ich mich gefragt, warum ist das so? Pins 5 und 6 nutzen einen
anderen Timer. Aber wenn der Timer nur zu langsam ist, sollte sich doch
diese Blinkfrequenz bei den Werten 1-254 doch ändern. Also nicht die
Frequenz, besser gesagt die An und Aus Zeiten. Aber dies ist optisch
nicht zu erkennen.
Unabhängig davon habe ich mir gedacht, den Timer1 (der ist doch für Pin
5 und 6 zuständig?) zu ändern. Aber irgendwie verstehe ich das nicht
wirklich nach dem lesen mehrerer Tutorials.
Eigentlich sollte ich doch nur den Prescaler auf 0 setzen müssen? Aber
ist der nicht standardmäßig auf 0?
Vielleicht kann mir mal jemand helfen. Warum ist der Timer so langsam,
bzw. warum kommt mir das so vor?
Und wie im Topic zu entnehmen, ich bin da totaler Anfänger, also bitte
etwas Nachsicht. Vielleicht bin ich mit meinen Schlußfolgerungen auch
total auf dem Holzweg.
Danke
Hallo,
nutzt du zufällig das Board Package von Spencekonde?
https://github.com/SpenceKonde/ATTinyCore
Dann wäre die erste Frage, zählst du die Arduino Pinnummern richtig
herum?
Ich habe gestern noch versucht über micros() sozusagen die PWM
Softwareseitig zu simulieren. Am Uno funktionierte das sogar gut. Am
ATTiny leider nur, sollange man nur ein Pin nutzt. Mit jeden weiteren
Pin sieht man ungewolltes "pulsieren". Ich vermute er ist einfach zu
langsam.
Also gestern noch viel gesucht und gelesen. Wenn ich das richtig
verstanden habe, tut dieser "Core" den man in der ArduinoIDE verlinkt,
auch an dem Timer rumstellen, um diverse Arduino "Funktionen" ATTiny
kompatibel zu machen.
Ich nutze den Core: http://drazzy.com/package_drazzy.com_index.json
Dieser funktionierte gut, bei einem anderen ATTiny, wo ich ein
Blaulicht, Blinker, Licht, Piezo über einen IR Empfänger angesteuert
habe. Wahrscheinlich spielt dieser "Core" an dem Timer1 rum.
Ja, die Pinnummerierung habe ich richtig. Sie lassen sich ja richtig
digital ansteuern (An, Aus). Warum nutzen die Cores eigentlich
unterschiedliche Nummerierungen? Kann man da sich nicht auf einen
Standard einigen? Kann man eigentlich auch in der Arduino IDE zB.
digitalWrite(PA6,HIGH); schreiben? Das würde ein vertauschen der Nummern
minimieren.
Wenn ich das richtig verstanden habe, muss ich den Timer1 nur wieder
schneller machen. Da ich in diesem simplen Sketch nur analogWrite() und
random() nutze.
Nur was ist denn eigentlich der Standard Wert für einen Timer? Was soll
ich bei WGM10-13 einstellen? Schneller PWM, 8-Bit(1010)? Was soll ich
bei CS10-12 einstellen? Keine Vorskalierung (001)? COM1A1, COM1A0,
COM1B1 und COM1B0 sollten ja auf 0000 gestetzt werden, oder?
Also sollte ich folgenden Code im Setup einfügen?
1
noInterrupts();
2
TCCR1A=0b00000001;
3
TCCR1B=0b00001001;
4
interrupts();
Danke
Eigentlich wollte ich nur paar LEDs in PWM ansteueren ^^.
Hallo,
wir reden vom gleichen Paket. Ich hatte den Link zu seinem Github, du
hast den Link für die Arduino IDE gepostet.
Einen ATtiny84 gibts bei Arduino nicht, also kann jeder der ein Paket
zur Verfügung stellt nummerieren wie er möchte. Darüber solltest du dich
wirklich nicht aufregen. Du musst nur wissen wie nummeriert wurde. Sein
Pinout liegt ja vor.
Hast du Clockwise oder Counterclockwise eingestellt?
Also du bist sicher das du die richtigen Pins verwendest?
Dann muss das funktionieren, weil das Paket gibts nicht erst seit
gestern.
Mich macht das aus der Ferne stutzig.
> Kann man eigentlich auch in der Arduino IDE zB. digitalWrite(PA6,HIGH)
Nein.
Hast du dir einmal seine Beschreibung auf Github durchgelesen?
Es gibt eine alternative Pin Bezeichnung die darauf abzielt.
Also wenn du alles nochmal geprüft hast, können wir den Timer 1 direkt
programmieren. Deine Einstellungen im Boardmenü stimmen alle?
Mich machen jedoch weiterhin deine Aussagen stutzig. Wegen blinken und
pulsieren. analogWrite blinkt nicht, es dimmt, macht also je nach Wert
die Led heller oder dunkler. Ist das soweit verstanden? Ansonsten würden
wir komplett aneinander vorbeireden. Deine Leds haben auch
Vorwiderstände?
Hallo,
ich habe einen Test vorbereitet. Getestet auf einem Mega2560 und geprüft
ob es mit dem ATtiny84 kompiliert. Tut es. Ich habe keinen ATtiny84 zur
Hand. Standardeinstellung "clockwise".
Danke, das du dir Zeit dafür nimmst.
Veit D. schrieb:> Hast du Clockwise oder Counterclockwise eingestellt?
k.A. Wo stellt man das ein? (inzwischen gefunden) Ich nehme an
Uhrzeigersinn bzw. gegen Uhrzeigersinn auf Deutsch. Aber
> Also du bist sicher das du die richtigen Pins verwendest?
Ich habe die im Anhang Rot markierten Pins jeweils verschaltet. Sie
lassen sich einzeln mit digitalWrite(); schalten. digitalWrite(5,LOW);
lässt die an den unteren rechten Pin angeschlossene LED leuchten.
digitalWrite(5,HIGH); lässt die an den unteren rechten Pin
angeschlossene LED aus gehen. Das gleiche mit den markierten Pins 6, 7
und 8. Also lässt das sehr darauf schliessen, das die Pinzuordnung
richtig ist. Also Clockwise (Uhrzeigersinn).
> Also wenn du alles nochmal geprüft hast, können wir den Timer 1 direkt> programmieren. Deine Einstellungen im Boardmenü stimmen alle?
Ich habe mal ein Screenshot von den Einstellungen gemacht. Kannst du
bitte checken ob alles stimmt? Bzw. wo muss ich aufpassen?
> Mich machen jedoch weiterhin deine Aussagen stutzig. Wegen blinken und> pulsieren. analogWrite blinkt nicht, es dimmt, macht also je nach Wert> die Led heller oder dunkler. Ist das soweit verstanden?
Naja, streng genommen gehen sie schon An und Aus, nur so schnell das das
Auge nicht hinterherkommt. Und das Verhältnis der An und Aus Zeiten
bestimmt die Helligkeit.
Und deswegen bin ich darauf gekommen, das mit dem Timer1 etwas nicht
stimmt. Es betrifft ja nur die Pins 5 und 6. (unten Links und Rechts).
analogWrite(5,0) lässt die LED unten Rechts dauerhaft leuchten.
analogWrite(5,255) Lässt die LED unten Rechts ausgehen.
analogWrite(5,1) bis analogWrite(5,254) lässt sie sehr schnell blinken,
ohne dass das An/Aus Verhältnis sich verschiebt. Ich hänge mal ein Video
vom Blinken an. Es zeigt analogWrite(5,100) und analogWrite(6,100).
> Ansonsten würden wir komplett aneinander vorbeireden. Deine Leds haben> auch Vorwiderstände?
Ja, die haben Vorwiderstände.
Huch, da haben wir uns überschnitten.
Veit D. schrieb:> Was machen deine 4 Leds?
7 und 8 Faden von Hell nach Dunkel und wieder zurück.
5 und 6 sind erst an, dann blinken sie, das Aus Intervall wird länger,
bis sie aus sind, gefolgt von Blinken wo das Aus Intervall kürzer wird
bis sie an ist.
Und ich habe jetzt einfach mal damit im Setup probiert:
1
noInterrupts();
2
TCCR1A=0b00000001;
3
TCCR1B=0b00001001;
4
interrupts();
Und es funktioniert :D
Also ist der Timer1 irgendwie sehr langsam eingestellt. Liegt es
vielleicht an der tone() Funktion die der core unterstützt? Auf Github
steht bei Timer viel. Ich mit meinem schlechten Englisch lese da etwas
herraus, wenn man Timer1 verstellt das tone() nicht mehr funktioniert.
Aber da ich tone() hier nicht brauche. Ich bin auf jeden Fall total
glücklich das es funktioniert und ich das mit dem Timer einstellen
wenigstens ansatzweise verstanden habe.
Und Danke Veit D. das du mir geholfen hast :)
Hallo,
normalerweise sollte tone() analogWrite nicht beeinflussen, also
irgendwo schon, weil gleicher Timer1, aber man nimmt wohl kaum
analogWrite mit tone() zusammen. Von daher sollten sich unterschiedliche
Timer1 Konfigurationen je nach Pin Verwendung nicht auswirken.
Übrigens, deine Boardkonfig ist okay. Clockwise = Uhrzeigersinn ist
richtig. Das ist von Spencekonde als Standard eingestellt. Nur macht
mich die andere Reihenfolge der Einträge stutzig. Ich weiß nicht wie
lange du das schon verwendest, vielleicht gabs ein Update zwischendurch
von seinem Paket. Schau mal ob du im Boardverwalter das Packet
aktualisieren kannst. Bei mir ist v1.5.0 aktuell. Wenn das alles okay
ist müssen wir das ignorieren.
Danach lässt du einmal das pinMode(x, OUTPUT) für die analogen Pins weg
und schaust was passiert. Das wird in allen analogWrite Bsp. auch
weggelassen. Frag mich nicht warum.
Wenn die Pins 5 und 6 immer noch nicht wollen wie sie sollen, dann ist
dein Problem irgendwie kurios und interessant zu gleich. Mach mal bitte
folgenden Test. Damit schauen wir uns die Timerkonfiguration an. Ohne
uns durch hunderte Dateien wühlen zu müssen.
Die Lib 'utilities', entpackste in den richtigen libraries Ordner. Der
wo die Sketche liegen. Nicht der im Installationspfad der IDE. Dann
schauen wir mal weiter.
Ich hatte 1.4.1 installiert. Ein Update auf 1.5.0 bringt aber keine
Änderung. Die Pins an 5 und 6 blinkern dennoch.
pinMode() kann man tatsächlich weglassen. Aber das gewöhne ich mir
vielleicht gar nicht erst an. Aber auch das verhindert nicht das
blinkern.
Bibliothek ist im Biblitheksordner
"arduino-1.8.13/portable/sketchbook/libraries"
Nach dem hochladen deines Sketches, blinkern die LEDs an Pin 5 und 6.
Leds an Pin 7 und 8 leuchten.
Hallo,
pinMode, okay, ändert also nichts.
> Bibliothek ist im Biblitheksordner> "arduino-1.8.13/portable/sketchbook/libraries"
Ja dort ist es richtig.
Was gibt der serielle Monitor aus?
Veit D. schrieb:> Hallo,>> pinMode, okay, ändert also nichts.>>> Bibliothek ist im Biblitheksordner>> "arduino-1.8.13/portable/sketchbook/libraries"> Ja dort ist es richtig.> Was gibt der serielle Monitor aus?
Hmm. Dumme Frage, wie verbinde ich den ATTiny mit dem Seriellen Monitor?
Veit D. schrieb:> Hallo,>> nochwas vorweg. Starte mal nach dem Update die IDE neu.>> Serial. Wenn du den nackten IC hast, benötigst du einen Serial(TTL)-USB> Adapter.
Die Idee hatte ich neu gestartet. Auch nach dem einbinden der
Bibliothek.
Ich beschreibe den nackten ATTiny84 mit einem Arduino Nano. Einen
TTL-USB Adapter habe ich leider nicht :(
Ich habe noch so ein UART-USB Adapter für ESP8266 rumliegen. Bringt der
etwas? Muss mich mal schlau machen. Wie und wo da etwas am ATTiny
angeschlossen werden muss. Hach
Hallo,
wenn dein UART-USB Adapter auch mit 5V umgehen kann, dann schaue in das
Pinout von Spencekonde und lies den Abschnitt Serial Support. Stichwort
Software Serial. Musste dann die Baudrate auf 9600 runter nehmen. Wenn
es dumm läuft gehts Dimming nicht mehr, weil wahrscheinlich die Software
Serielle auch einen Timer benötigt. Wahrscheinlich Timer 1. Kommt auf
einen Versuch drauf an. Das ist der Nachteil mit Winzig µC, beim
debuggen kommt man schnell an die Grenze.
Davon abgesehen, kannste Timer 1 direkt ausprobieren. Wenn das klappt
müßte man doch einmal Spencekonde informieren bzw. fragen was da los
ist.
Wenn ich nichts übersehen habe sollte das 1:1 auf dem ATtiny84
funktionieren. Beide Leds sollten unterschiedlich gedimmt ohne blinken
leuchten.
1
/*
2
IDE 1.8.13
3
ATtiny84
4
Spencekonde Package
5
Timer 1 - Phase Correct Mode 10
6
*/
7
8
#include<util/atomic.h>
9
10
constbytepinPhaseA{PIN_PA6};// Pin OC1A / 6
11
constbytepinPhaseB{PIN_PA5};// Pin OC1B / 5
12
13
/*
14
* um analogWrite kompatibel zu bleiben darf TOP und OCR1A/OCR1B den Wert 255 nicht überschreiten,
Oh mein Gott. Ich glaube ich habe heraus gefunden woran es gelegen hat.
Es ist alles Richtig mit dem Core. Auch an dem Timer1 liegt es nicht,
bzw. nicht direkt das es unbrauchbar wird.
Beim lesen, wie man ATTiny über den Arduino as ISP per SoftwareSerial
den Monitor nutzen kann, wurde nebenbei erwähnt, das jemand
Übertragungsprobleme hatte, da der ATTiny auf 1mHz lief. Er sagt nach
dem neuen Bootloader brennen mit 8mHz funktioniert alles korrekt.
Und da viel es mir wie Schuppen von den Augen. Bootloader Brennen hatte
ich nie ausgeführt. Der ATTiny lief also gar nicht auf 8mHz, sondern
wahrscheinlich viel viel langsamer. Und daher wurde die PWM Frequenz des
Timer1 wahrscheinlich sichtbar für das Menschliche Auge.
Hach. So viel Verwirrung wegen so einem vergessenen Klick.
Also entschuldigt dies bitte, und Danke für die Hilfe.
Hallo,
alles klar, kein Problem, wenn Ursache selbst gefunden umso besser.
Da war dein µC noch jungfräulich in den Fuse Einstellungen und der Main
Prescaler noch aktiv. Der jeden CPU Takt auf 1/8 runterteilt.
Mit Bootloader drauf könntest du den µC theoretisch per USB flashen,
wenn der Adapter noch ein DTR Signal rausgibt. Wenn du weiterhin mit
Arduino over ISP flasht, kannste die Bootloader Einstellung eigentlich
wieder zurücknehmen. Haste mehr Flashspeicher und die 1/8 Fuse
Einstellung sollte erhalten bleiben. Hoffe ich.
Ansonsten war hoffentlich nicht alles umsonst mit der direkten Timer
Programmierung. Kannste später vielleicht noch gebrauchen.
Als Letztes eine Hilfsfunktion für analogWrite Ersatz bei direkter
Programmierung. Leicht erweiterbar um Timer 0.
1
voidanalogPWM(constbytepin,constbyteduty)
2
{
3
switch(pin)
4
{
5
casePIN_PA6:OCR1A=duty;break;
6
casePIN_PA5:OCR1B=duty;break;
7
default:break;
8
}
9
}
Anwendung:
1
analogPWM(PIN_PA6,30);
2
analogPWM(PIN_PA5,200);
Ansonsten Tschau und immer genügend Takt unterm Hintern.
Ja, der ganze Ausflug war interessant und wahrscheinlich auch leerreich.
Das mit dem Bootloader brennen hat sich jetzt wahrscheinlich auch
eingeprägt. An Speicher Grenzen, vor allem bei den kleinen Basteleien
werde ich wohl nicht stoßen.
Da das programmieren bei mir nicht all zu häufig genutzt wird, kann es
schnell sein das ich das nächstmal wieder da hänge, wie war das gleich
nochmal. Wenn man etwas selten macht, wird man nicht firm.
Um so schöner ist es, das es Foren wie diese hier gibt, wo immer mal ein
Profi vorbei schaut und hilft.
Danke für deine Hilfe