Welche AVR besitzen die PIN Toggle Fähigkeit?

Gast #4672713
Lesenswert?

Nach langem suchen im Netz, und nur begrenztem fündig werden...
(vielleicht habe ich ja was übersehen...)

Zu einzelnen AVRs findet sich was.
Und in den Datenblättern natürlich auch. Aber das sind dann leider viele 
Datenblätter, welche studiert werden wollen.

Darum meine Frage:
Welche AVRs toggeln ihre Pins, wenn man das betreffende PIN Register 
beschreibt?
Gibt es irgendwo eine Liste dieser Prozessoren?
Irgendein Unterscheidungskriterium?
z.B. eine (Präprozessor) Konstante

Ich würde mich sehr freuen, wenn es da schon was fertiges gibt.
Und ihr mir den Stubs in die richtige Richtung gebt.
Wenn nicht, dann eben Fleißarbeit....

Zwecke des ganzen:
Es soll eine für Arduinos geeignete Lib werden.
Im Anhang der jetzige Zustand der Lib

Das Problem:
1
digitalWrite(13,!digitalRead(13));
Dieses braucht viele Takte.
Manchmal zu viele.

Ich möchte eher sowas wie:
1
#ifdef FAST_TOGGLE_PIN_OPTION
2
PINB = _BV(5);
3
#endif
4

5
#ifndef FAST_TOGGLE_PIN_OPTION
6
PORTB ^= _BV(5);
7
#endif
Angehängte Dateien:
Gast #4672731
Lesenswert?

Arduino F. schrieb:
> Dieses braucht viele Takte.
> Manchmal zu viele.

So ist das eben.

1) die Arduino Lib Schreiber haben schon das "Optimalste"
herausgeholt.

2) entweder du lebst mit den Libs so wie sie sind. Mit
dieser Eine-für-Alles Strategie sind viele Arduino Benutzer
glücklich gemacht worden.
Oder du löst dich vom Einheits-Brei der aufgrund von Standards
einen gewissen Overhead erzeugt und schreibst deine eigenen
Dinge optimiert auf deine Bedürfnisse. Die Eierlegende
Wollmilchsau die auch noch optimal schnell ist wird es jeden-
falls nicht geben.

Schneller als so geht es sowieso nicht.

Arduino F. schrieb:
> #ifndef FAST_TOGGLE_PIN_OPTION
> PORTB ^= _BV(5);
> #endif

Ausgenommen ATXmega ....
(Firma: matzetronics) #4672756
Lesenswert?

Arduinoquäler schrieb:
> Mag sein dass du nur zwei Takte brauchst, aber ob du
> damit einen Ausgang togglen kannst ..... ?

Darum geht es doch, duh. Viele neuere AVR können eben den Ausgangspin 
togglen, wenn man eine 1 ins entsprechende Bit des PIN Registers 
schreibt.
Aber ein Kriterium dafür ist mir nicht bekannt, bzw. welcher AVR das als 
erster konnte.
#4672762
Lesenswert?

@  Arduinoquäler (Gast)

>> Kommt mit 2 Takten hin, wenn es denn der µC kann...

>Mag sein dass du nur zwei Takte brauchst, aber ob du
>damit einen Ausgang togglen kannst ..... ?

Ja, kann er. RTFM!

"However, writing a logic one to a bit in the PINx Register, will result 
in a toggle in the corresponding bit in the Data Register."
Gast #4672776
Lesenswert?

Falk B. schrieb:
> Ja, kann er.

Jetzt fällt es mir wie Schuppen von den Haaren, ich habs
schon mal gelesen aber wieder vergessen.

Falk B. schrieb:
> Das halte ich für fragwürdig. Man muss die Portzugiffe nicht zu Laufzeit
> dekodieren, das kann ein vernünftige Lösung auch zur Compilierungszeit.

Na dann mal 'ran, lieber Herr Brunner.

Was lässt sich denn bei einem SBI(portnr, bitnr) noch vor der
Laufzeit optimieren wenn die Parameter schon fest vorberechnet
vorliegen?
#4672786
Lesenswert?

@ Arduinoquäler (Gast)

>> Das halte ich für fragwürdig. Man muss die Portzugiffe nicht zu Laufzeit
>> dekodieren, das kann ein vernünftige Lösung auch zur Compilierungszeit.

>Na dann mal 'ran, lieber Herr Brunner.

Ich kann kein C++ 8-0

>Was lässt sich denn bei einem SBI(portnr, bitnr) noch vor der
>Laufzeit optimieren wenn die Parameter schon fest vorberechnet
>vorliegen?

Gar nichts. Aber das war auch gar nicht das Thema, sondern das leidige 
digitalWrite() vom Arduino.
Gast #4672787
Lesenswert?

Arduino F. schrieb:
> Welche AVRs toggeln ihre Pins, wenn man das betreffende PIN Register
> beschreibt?
> Gibt es irgendwo eine Liste dieser Prozessoren?

Nein, gibt es nicht.

> Irgendein Unterscheidungskriterium?

Neuere AVRs können das. Eine Liste von "Neueren AVRs"? Mir nicht 
bekannt.

Würde  mir einen µC, der sonst den Ansprüchen genügt heraussuchen und 
dann das Datenblatt daraufhin abklopfen.
Gast #4672792
Lesenswert?

Arduinoquäler schrieb:
> Was lässt sich denn bei einem SBI(portnr, bitnr) noch vor der
> Laufzeit optimieren wenn die Parameter schon fest vorberechnet
> vorliegen?
Für mich ist die Ausgangsposition die Arduino Welt.

Und da zeigt sich, dass man mit so was, auf einem Arduino UNO, um 50kHz 
Rechteck zustande bekommt
1
void loop() 
2
{
3
  for(;;) 
4
  {
5
    digitalWrite(13,!digitalRead(13));
6
  }
7
}


Im Gegensatz zu ca. 2Mhz, auf diese Art:
1
void loop()  
2
{ 
3
  for(;;)  PINB = _BV(5);
4
}
#4672820
Lesenswert?

Hallo,

wenn ich das schnell brauche schreibe ich es eben so rein.
PINB = (1<<PB5);

Wenn ich es auch noch taktgenau brauche, dann starte ich das alte 
AVR-Studio und werfe den ASM an und zähle Takte.

Arduino ist für mich aus 2 Gründen in den Hobbykreis gekommen:
Die billigen Module um Zeit und Arbeit zu sparen.
Die vorhandenen Libs, um Zeit und Arbeit zu sparen.
Das kommt den "kleinen Projekten zwischendurch" sehr entgegen.

PS: da ich in letzter Zeit viel mehr ESP8266 als ATMega programmiere, 
hätte ich ohnehin nichts davon.

Was willst Du dem User einer solchen Lib mit an die Hand geben?
Das er statt der Arduino-Pinnummer jetzt Port und Pin des AVR nehmen 
soll?
Das eben kann er jetzt ohne weitere Änderungen auch schon, wenn er weiß, 
wie es geht.

Gruß aus Berlin
Michael
Gast #4672833
Lesenswert?

Arduino F. schrieb:
> Zwecke des ganzen:
> Es soll eine für Arduinos geeignete Lib werden.

Arduino F. schrieb:
> Und da zeigt sich, dass man mit so was, auf einem Arduino UNO, um 50kHz
> Rechteck zustande bekommt

Ja .... und wenn du dann deine Kreation als Lib anbietest die
genau so universell verwendbar ist dann endest du genau dort wo
die Arduino Lib Väter ihre Konvergenzlinie gesehen/gezogen haben.
Gast #4673244
Lesenswert?

Matthias S. schrieb:
> Aber ein Kriterium dafür ist mir nicht bekannt,....
Danke.(schade)

Falk B. schrieb:
> Aber das war auch gar nicht das Thema, sondern das leidige
> digitalWrite() vom Arduino.
Ja!

bench schrieb:
> Mir nicht bekannt.
Danke! (und Schade)

A. K. schrieb:
> Der erste mir bekannte Typ war der ATtiny2313.
>
> Man kann das auch umgekehrt machen. Hauptsächlich die AT90SNNNN, daran
> orientierte ATmegaNNNN wie ATmega8535, die alten Klassiker
> ATmega8/16/64/128 sind draussen, und ein paar alte weniger systematisch
> erfassbare ATtiny.
Beim suchen und erfassen, wird mir das helfen.

Michael U. schrieb:
> willst Du dem User einer solchen Lib mit an die Hand geben?
Ja...
Aber Vorrangring ist das für mich.
In der Beziehung bin ich Egoist.
Wenn es sonst noch jemand mag, nur zu... er/sie/es möge es nutzen...

Michael U. schrieb:
> wenn ich das schnell brauche schreibe ich es eben so rein.
> PINB = (1<<PB5);
Das finde ich wenig lesbar.
Insbesondere wenn das ein Dutzend solcher Pins, mit verschiedenen 
Funktionen, werden.
Ich wünsche mir ein klares Benennungsschema.
Das Arudino Schema ist auch irgendwie klar, zumindest dokumentiert, aber 
hilft nicht viel weiter, wenn der (nicht direkt von der Arduino IDE 
unterstützte) AVR auf ein eigenes Brett gelötet wird.

So....
Ich fasse mal den Erkenntnis Gewinn zusammen:
Ich muss es mir selber machen!


Ein herzliches Danke, an alle, welche mir eine respektvolle Antwort 
gegeben haben.
DANKE!


So, nun an die Arduino Hasser Fraktion:
Ich kann es nur emotional formulieren...
Als ich gerade mal wusste, wie man das Wort "Arduino" schreibt, aber 
noch nie einen Atmel bewusst wahrgenommen hatte, sprang mich eine 
Aufgabe/Problem/Auftrag an.
Mit Hilfe eines 3 Euronen Boards und der IDE war das Thema in 2H 
erledigt.
Das war mein erster Kontakt mit dem Arduino/AVR Kram.
Seit dem bin ich bekennender Fan.

Natürlich sind manche Dinge in der Arduino Welt unglücklich gelöst. Da 
gehe ich voll mit den Kritikern konform. Allerdings lässt die IDE einen 
auch da ran. Und es gibt auch viel Licht.
Von Hause aus verdaut sie *.S Dateien. (weiß nur kaum einer)
Sie liefert mir automatisch ein Assemblerlisting, so dass ich sehen kann 
was der Compiler da baut. Und ja, lieber c-hasser, das kann ich lesen.

Und überhaupt, ich hasse ursprünglich auch C....
Komme eigentlich aus der ObjektPaskal, Java und SPS(AWL) Ecke...
Auch PHP, Forth und SQL wird gerne genommen.
C war mir immer ein Gräul.
C++ ist auch nicht viel schöner...
Aber ich nehme es.
Denn OOP in Assembler ist auch nicht die Ausgeburt an Eleganz.

Schlussendlich ist es völlig scheißegal, welche IDE man verwendet. 
Nahezu alle basieren auf der avr-gcc Toolchain.
Es kommt also exakt das gleiche dabei raus, wenn man nur will.


So, nun an c-hater im speziellen:
Deine Herabwürdigungen fasse ich als Angriff und Beleidigung auf.
Fachlich ist da auch nicht wirklich was gekommen, oder?
Wie schätzt du das selber ein?
Hast du meine Frage überhaupt verstanden? ... egal...

Ich nehme mal zu deinen Gunsten an, dass irgendein Ereignis/Umstand in 
deiner Kindheit/Jugend zu einer neurotischen Fehlanpassung geführt hat, 
so dass du jetzt solche Verhaltensauffälligkeiten zeigen musst.

War das zu kompliziert?
OK, dann auf neudeutsch: Troll!

Und ich finde es schade, dass die Moderation solche Ausfälle recht 
selten sanktioniert.
Gast #4673445
Lesenswert?

Arduino F. schrieb:
> Das Arudino Schema ist auch irgendwie klar, zumindest dokumentiert, aber
> hilft nicht viel weiter, wenn der (nicht direkt von der Arduino IDE
> unterstützte) AVR auf ein eigenes Brett gelötet wird.

Es hilft genau dann nicht weiter, wenn du für dein Brett nicht die 
passende Boardbeschreibung für die Arduino IDE angelegt hast.
#4673568
Lesenswert?

Hallo,

für alles halbwegs gängige von den Tiny bis zu den größeren AVR gibt es 
das doch schon.
Ich hatte zumindest keinen großen Aufwand, einen Tiny45 aus der IDE zu 
bedienen und von dort mit dem Dragon zu flashen.

...
wenn ich das schnell brauche schreibe ich es eben so rein.
PINB = (1<<PB5);
>Das finde ich wenig lesbar.
>Insbesondere wenn das ein Dutzend solcher Pins, mit verschiedenen
>Funktionen, werden.

Naja, real würde bei mir vermutlich auch
LED_PIN = (1<<LED);
stehen.
Schon deshalb, weil ich dann mit einer #define-Änderung aus PB5 PB3 
machen kann oder aus PINB PIND usw.

Arduino bietet eine ganze Menge auch für die eigene Bequemlichkeit.
Beispiel: Stringverarbeitung. Man kann die C-Sachen nehmen oder die 
String-Klasse.
Nachteil: auf einem Mega328 wird mit der Stringklasse schnell der Ram 
knapp wenn man nicht gut aufpasst.
Auf dem ESP8266 nehme ich die fast ausschließlich, einfacher geht es 
nicht.
Aber selbst da habe ich mir da schon Probleme eingebaut. Ein paar 
String.replace() mit einem 6k html-Source aus dem Filesystem geladen 
laufen auch gegen die Wand. ;-)

Dort entschärft sich auch das digitalWrite() Problem fast von selbst. 
80MHz waren bisher da auch flott genug und nette Leute sorgen da fast 
immer für Anpassungen.
Die aktuelle NeoPixelBus-Lib hat im Test zumindest keine Probleme mehr 
mit 120 WS2812 am ESP und WLAN und MQTT aktiv.

Beim den kleinen AVR werde ich im Notfall wohl auch weiterhin auf C in 
der Arduino-IDE oder dem AVR-Studio und ASM zurückgreifen.

Ist ein Hobby und soll es auch bleiben.

Gruß aus Berlin
Michael
Gast #4673576
Lesenswert?

Marc V. schrieb:
> Soviel ich weiss nein,
Danke für die Auskunft.

Marc V. schrieb:
> warum machst du es nicht selbst
Eine herzerfrischende Idee!

Mal abgesehen vom erstellen einer solchen Liste, ist ab dann 
Wartungsaufwand nötig. Die Liste will immer auf neuestem Stand gehalten 
werden. Kann natürlich sein, dass Atmel nach der Übernahmen nix neues 
mehr entwickelt. Naja, da will ich mich nicht drauf verlassen.
Gast #4673790
Lesenswert?

>> #ifndef FAST_TOGGLE_PIN_OPTION
>> PORTB ^= _BV(5);
>> #endif
>Das braucht 4 Takte, oder so.
>
>PINB = _BV(5);
>Kommt mit 2 Takten hin

Deshalb programmiere ich nur in ASM, auch wenn ihr das ja alle so 
schrecklich findet. Da kann man nunmal ohne viel black magic einfach 
direkt zählen, wie viel Takte man braucht.

Und nein, ich habe nichts gegen C, nur sehe ich bei einfachen 
µC-Aufgaben dort keinen Vorteil.

So, hate on, wa?
Gast #4673848
Lesenswert?

Doch, das ist funktional genau das selbe.
(Abgesehen davon, dass man nicht mit sbi darauf zugreifen kann, da Atmel 
entschieden hat, dieses Register nicht mit in die VPORT Register zu 
spiegeln.)
Gast #4673851
Lesenswert?

Marc V. schrieb:
> Arduino F. schrieb:
>> Aus den XML generiert?
>  Ja.
>
>> Was war das Kriterium?
>
>  <TOGGLE_PIN>

Heijeijei....

Das bekomme ich auch noch hin...
(dachte ich)

Wenn das Wörtchen "Wenn" nicht wäre...
In meinen xml Dateien findet sich leider kein "TOGGLE_PIN".
Nirgendwo....
Meine XML Dateien stammen aus dem Atmelstudio 6.2
Beim 7.0er scheinen die nicht mehr dabei zu sein.
Und eine andere XML Quelle kann ich nicht finden.
Auch nicht auf der Atmel Seite.


Würdest du mir noch verraten, wo du deine XML Dateien her hast?
(Firma: Vescomp) #4673875
Lesenswert?

Arduino F. schrieb:
> Würdest du mir noch verraten, wo du deine XML Dateien her hast?

 "C:\Program Files\Atmel\AVR Tools\Partdescriptionfiles"
 Die gibt es aber auch schon bei Studio 4.19 oder früher.

 Command Prompt, geh zu "drive:\Program Files\Atmel", und folgendes:
1
 "dir *.xml /s > AvrList.txt"
 Sollte dir alle *.xml files in AvrList.txt auslisten (mit Directory).

 Und die Files danach parsen, natürlich.
Gast #4674040
Lesenswert?

Ein Verzeichnis namens Partdescriptionfiles gibt es nicht auf meinen 
Rechnern.

1. Auf meinem ausrangierten XP mit AS6.2 gibt es sowas nicht.
Da findet sich die Datei ATmega328P.xml genau 1 mal auf der ganzen 
Platte
Im Verzeichnis: C:\Programme\Atmel\Atmel Studio 6.2\devices
Die habe ich mal als Anhang drangeklebt.
Keine der dortigen, fast 500 Dateien, beinhaltet den String 
"TOGGLE_PIN".
Keine *.xml Datei auf dem Rechner beinhaltet "TOGGLE_PIN".


2. Schlimmer noch, auf dem frischen Win10 mit AS7.0
Weit und breit keine ATmega328P.xml
Keine *.xml Datei auf dem Rechner beinhaltet "TOGGLE_PIN".
Angehängte Dateien:
Gast #4674121
Lesenswert?

Arduino F. schrieb:
> Nachtrag:
> Im AS 7.0 heißen die Dateien jetzt *.atdf, also z.B. ATmega328P.atdf
> Aber auch darin kein "TOGGLE_PIN", oder vergleichbar, zu erkennen

Ich kann bestätigen, daß auch bei mir das Verzeichnis
"Atmel\AVR Tools\Partdescriptionfiles" existiert und darin die 
*.xml-Files sind, z.B. ATmega88.xml. Und in den XML-Files sind unter 
"AVRSimIOPort.SimIOPort" die einzelnen Ports(A, B, C...) aufgeführt und 
dort dann "TOGGLE_PIN" mit dem Wert "Y"...
Keine Ahnung, warum das ganze bei dir nicht auffindbar ist.
Gast #4674126
Lesenswert?

Ja!
Meine sehen anders aus.
Der "TOGGLE_PIN" Eintrag ist offensichtlich für den Simulator.
Bei den neueren AS wird diese Information dann wohl in der jeweiligen 
*.dll Datei stecken. Da gibts für jeden µC eine eigene DLL.

Gut, damit habe ich die Daten bis 2011, wie mir scheint.
Für die neueren fehlt es...
Naja, immerhin!

Ein großer Schritt.
Danke.
Gast #4674132
Lesenswert?

Hugo schrieb:
> Keine Ahnung, warum das ganze bei dir nicht auffindbar ist.
Habe gerade AS 4.19 installiert.
Da gibts das alles.

Zu 6.XX und 7.0 hat sich da offensichtlich viel geändert.

Hugo schrieb:
> Ich kann bestätigen, daß auch bei mir das Verzeichnis
> "Atmel\AVR Tools\Partdescriptionfiles" existiert und darin die
> *.xml-Files sind,
Eine AS 4er Version...?!?
Gast #4674139
Lesenswert?

Arduino F. schrieb:
> Eine AS 4er Version...?!?

Ja, ich hab die 4er Version vom AVR-Studio auch noch draufgelassen, 
obwohl ich das 6.2er AtmelStudio installiert habe.
Aber die *.xml-Files sind im 4er, richtig.
Was mich auch nachdenklich gemacht hat, daß die Tags TOGGLE_PIN 
innerhalb der Simulator-Tags der einzelnen Ports sind....
Gast #4674158
Lesenswert?

Über dieses Thema bin ich gestern auch gestolpert: Wollte 3 Taster zum 
Togglen bringen. Beim Layoutentwurf bemerkt: Kein Platz für die IC´s und 
die nötige Entprellung. Aber da sind ja noch ein paar alte Attiny11 in 
der Bastelkiste. Nach Aufruf des Datenblattes musste ich feststellen: 
Der kann ja gar nix, auch nicht Togglen über PinB. Egal, geht ja auch 
anders.

Aber vielen Dank für die Liste, kommt bei mir mit in die Atmel-Doku!
#4674217
Lesenswert?

Mich interessiert i.a. überhaupt nicht mehr, wieviele Takte irgendwas 
nun wirklich baucht, solange es ausreichend schnell ist.
Früher hatte ich den Ehrgeiz, möglichst "effiziente" Programme zu 
schreiben. Das hiess: möglichst kompakt, möglichst schnell. Ja, das hat 
auch Spass gemacht, war aber letztlich fast immer wertlos, nur fürs Ego 
gut. Stunden und Tage zugebracht, um noch ein bisschen rauszukitzeln...
Der gesparte Speicherplatz blieb dann leer, die gesparte Laufzeit wurde 
in Warteschelifen verbraten, weil einfach nichts zu tun war. Immer in 
der Erwartung: ich hätte noch Reserven für irgendwas, was aber nur 
höchst selten kam.
Insofern: nicht aus dem Auge verlieren, wenn es mal knapp wird. Aber als 
Grundeinstellung unproduktiv.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren