ATtiny13 und PWM

Tiedge

Neues Mitglied
17. Mai 2014
20
0
0
49
Sprachen
Hallo,
ich bin neu Ihr und habe auch nicht viel Erfahrung im Bereich von Programmieren.
Ich habe mir ein Anfänger Packet gekauft das besteht aus eine Programmer, Steckboard und eine Anleitung für Anfänger in Assembler. Ich habe die Aufgaben in diese Anleitung durch gearbeitet und auch verstanden. Nun zu meine eigentlichen Problem. Ich machen Modellbau und möchte eine ATtiny13 für gewisse aufgaben verwenden, nun kann ich den PORT sagen was ein und Ausgang sein soll und wie sie sich verhalten sollen, aber über Timer ist leider überhaupt nichts beschrieben.
Ich möchte mir gern eine RC Schalter bauen mit vier Ausgängen die dann über Mosfett meine LED Streifen steuern sollen. Nur weis ich nicht wie ich den Timer Programmieren soll das ich das Signal vom Empfänger nutzen kann. An diesen Kanal ist ein Drei stufen Schalter verbunden und ich möchte das in der Mittelstellung alles aus ist, in der Oberen alles Ausgänge an und in der Unteren zwei Ausgänge an.

Ich hoffe Ihr könnt mir ein zeigen wie ich den Timer Programmieren muss.
Mfg Christian
 
Hallo, und willkommen im Forum...

Da Du Dich mit dem Tiny13 beschäftigst, sollte dieses Datenblatt Dein wichtigstes Dokument sein (insbesondere unter Assembler;))
Zu meinen Anfangszeiten fand ich dieses Tutorial sehr hilfreich (der 64seitige Download als PDF)
Wichtigstes Hilfsmittel ist inzwischen das AVR-instruction-set

Jetzt zu Deiner eigentlichen Frage:
Vor einiger Zeit hatte ich mal für den 16bit-Timer das Mega8 'ne Übersicht der dort verfügbaren Modi zusammengestellt (und erläutert) - hier - , und vorher 'ne detailierte Erklärung der dazugehörenden I/O-Register-Bits (desselben Timers) - hier - .

Beim Tiny13 ist das natürlich deutlich weniger komplex, Register- und Bitnamen variieren, ggf auch einige Funktionen - aber imwesentlichen ist es ähnlich - wenn Du das alles mit dem oben verlinkten Datenblatt (Kapitel 11) in der anderen Hand durchgehst, solltest Du etwas mehr Durchblick bekommen.

Falls Du noch Fragen hast, kannst Du natürlich hier weiterfragen;)
Nachtrag:
Hmm...
Moment mal...
Wenn ich das jetzt richtig verstehe, willst Du eigentlich gar kein PWM ausgeben, sondern die Pulsweite eines anliegenden RC-Signales messen, oder wie?
Dazu brauchst Du natürlich auch den Timer...
Die 4 Ausgänge sollen nur entsprechend An-/Ausgeschaltet werden? (Eigentlich sinds ja nur 2 Paare)
Ich will Dich aber trotzdem erstmal selbst denken lassen - folgende Tips/Fragen:
  • das RC-Signal liegt ge-demultiplext vor (also nur ein Kanal)?
  • Wie sieht das Signal in den jeweiligen relevanten (zu unterscheidenden) Zuständen aus?
  • Was ist sind dann die konkreten Unterschiede?
  • Wie kann man das mit dem Timer realisieren?
  • Welche Beschaltung der Pins ist am sinnigsten?
  • Welche Reihenfolge?
 
Hallo LotadaC
Ja ich möchte ein PWM messen und diese dann zum Schalten nehmen.
Danke erst mal für Deine Antwort.
Zum Nachtrag :
Es ist nur ein Kanal der von 1ms bis 2ms geht. So habe ich es bis jetzt im Netz gefunden.
1ms – 1.5ms-2ms sollten die Werte sein die gemessen werden sollen.
Timer würde ich an PORBT.2 als Input machen.
PORTB,1 -0-3-4 würde ich als Ausgang nutzen.

.include “ tn13Adef.inc“
ldi r16,0b11011
out DDRB,r16
lid r16,0b00100
out PORTB,r16
Jetzt müsste der Timer gesetzt werden aber da kommt mein Prob.
 
Um welchen Controller gehts denn nun? Um den Tiny13 oder den Tiny13A?
Der 13A besitzt einen Timer mit 2 OC-Units - prinzipiell könntest Du Deine beiden Output-Paare also sogar über HW-PWM ausgeben UND mit demselben Timer das Signal messen. ABER für den Anfang wäre das sicher etwas kniffelig. trotzdem könnte man den Schaltplan bereits darauf auslegen - ansonsten:
Warum diese Pinbelegung? Laß das doch erstmal außen vor, und überlege Dir das prinzipielle Vorgehen.
PORTB.2 kann in seiner Funktion als T0 Takteingang des Timers sein, Du kannst damit Flanken zählen. Du willst aber die zeitliche Länge messen, oder? (Ok, wenn Du Die Takte in einer festgelegten Zeit zählst, kannst Du das auch von hinten durch die Brust ins Auge berechnen, aber dann brauchst Du ja einen 2ten Timer. Beim 13(A) könnte man dafür höchstens noch den Watchdog-Timer oder den ADC (eine Wandlung benötigt 13 ADC-Takte oder so, und kann einen IRQ triggen) mißbrauchen. Also verwende den Timer auch als solchen (über den internen Taktgeber), und ermittle die Zeit zwischen den Relevanten Flanken.
Mit Deinem 1-2ms-Signal meinst Du vielleicht die Methode der analogen Proportionalsteuerung?

Dann beschreibe mir bitte nochmal genauer, wie dein Signal jetzt konkret für Deine zu unterscheidenden Zustände (Steuerknüppel) aussieht.
Außerdem brauchst Du noch den tatsächlichen Prozessortakt (wenn Du da noch nicht festgelegt bist, sollten effektive 1,2MHz ganz brauchbar sein (interner 9,6MHz RC-Oszi mit SystemClockPrescaler=8 (Standardeinstellung mit aktiver CKDIV8-Fuse)
Sollte erstmal genug zum Nachdenken sein (ich hab bereits 'ne komplette Lösung im Kopf, aber Du willst ja sicher selbst was bei lernen...)

Du bist wieder dran...
 
Hi,
danke für die Antwort.
Ja klar möchte ich dabei was Lernen, aber wenn ich das ganze Lese, bin ich schon wieder raus.
Da mit das alles wie Chinesisch anhört. Ich glaube,ich kaufe mir erst mal ein gutes Buch sonst komme ich so nicht weiter. Das einzige was ich über mein Signal weis, kommt aus dem Netz und kann da auch nicht all zu viel damit anfangen. Steuerknüppel unten 1ms, Steuerknüppel mitte 1,5ms und Steuerknüppel oben 2ms.

Ich möchte das bei 1ms zwei Portb an sind und zwei aus, bei 1,5ms alle aus und bei 2ms alle an.
Jetzt ist es aber so das ich nicht mal weis ob das mit den Werten überhaupt stimmt.
Es geht um Attiny13a
Mfg
Christian
 
ist doch schon mal was...
Du hast ja nur 3 zu unterscheidende Zustände:
Knüppel mitte -> alles aus
Knüppel unten -> ein Paar an
Knüppel oben -> beide Paare an
Sinnig erscheint also, wenn man die Signale erstmal irgendwie unterschieden hat, folgender Weg:
  • beschreibe ein Rechenregister mit dem Zustand "alle aus"
  • bei "Knüppel unten" entsprechendes Bitmuster laden
  • sonst bei "Knüppel oben" entsprechendes Bitmuster laden
  • Rechenregister ins Portregister ausgeben
Wie unterscheiden sich nun die 3 Signale?
Scheinbar so:
Code:
..._/--------\____...  Mitte
           |   |
..._/-----\_______...  unten
           |   |
..._/-----------\_...  oben
           |   |
Dieses Signal wiederholt ständig, die steigenden Flanken liegen ca 20ms auseinander.
Du willst also die Zeit zwischen einer steigenden Flanke, und der dazugehörenden fallenden Flanke messen. Oder genauer:
Du willst wissen, wieviele Takte der Timer zwischen den Flanken gezählt hat.
Genau genommen interessiert Dich das aber auch nicht - Du willst ja nur zwischen den 3 diskreten Werten (mitte, Vollausschlag) unterscheiden. Das habe ich mit den senkrechten Strichen angedeutet.
Wo legen die?
Na in der Mitte zwischen Mittelstellung und dem jeweiligen Vollausschlag, also bei 1,25 und 1,75ms.
Liefert der Timer "weniger als 1,25ms", heißt das für Dich "voll unten",
liefert er "mehr als 1,75ms", heißt das "voll oben",
der Rest ist "Mitte"
klar?

Da Du Dich nicht mit der Berechnung der Differenz zwischen den Flanken rumschlagen willst, setzt Du den Timer bei einer steigenden Flanke einfach auf 0 zurück. Und beim Vergleich rechnest Du natürlich nicht mit ms, sondern vergleichst die entsprechenden Timer-Takt-Zahlen, klar?

Du willst jetzt also schnell auf Flanken des Signales (welches an einem sinnigen Pin anliegt) reagieren können, um den Timer zurückzusetzen/auszuwerten - was bietet sich da für Dich an?
Noch was generelles:
...
Timer würde ich an PORBT.2 als Input machen.
PORTB,1 -0-3-4 würde ich als Ausgang nutzen.

Code:
.include  “ tn13Adef.inc“
ldi r16,0b11011
out DDRB,r16
...
Also mal abgesehen von der Wahl der Pins - da würde ich erst wenn der Algorithmus steht rangehen...

Mit der include-Direktive bindest Du die Prozessordefinitionsdatei des Tiny13A ein. Schau Dir die mal an. Dort werden diverse Konstanten des Prozessors für Dein Programm definiert, insbesondere Registeradressen (die Du danach zB mit DDRB statt 0x17 ansprechen kannst), aber eben auch die Bitnamen in den Registern.
Logischerweise verbirgt sich zB hinter dem niederwertigsten Bit des DDRB - also DDB0 (siehe Datenblatt) - dort die Konstante "0", definiert durch ".equ DDB0=0".
DDB1 ist 1, DDB3 ist 3, DDB4 ist 4...

damit kannst Du den imediate für Dein LDI (LoaD Imediate) auch festlegen, indem Du die einzelnen Bitwerte ver-OR-st. In Deinem Beispiel sähe das so aus:
Code:
...
LDI r16, (1<<DDB4)|(1<<DDB3)|(1<<DDB1)|(1<<DDB0)
OUT DDRB, r16
...
Die Klammern sind eigentlich unnötig, da das "schieben" ("<<") Vorrang vor den logischen Verknüpfungen ("|"=OR) hat, ich finde es so aber übersichtlicher...
Bei der Assemblierung macht der Assembler da die entsprechende Zahl draus, durch das Eins-Schieben steht quasi in den Klammern der jeweilige Bitwert (1<<DDB4 ist 'ne 1 die DDB4-oft, also viermal nach links geschoben wurde. Aus 0b00000001 wird also 0b00010000
1<<DDB3 entsprechend 0b00001000) - die bitweise ver-OR-ung erzeugt dann 0b00011011, stimmt also.
Der erzeugte Maschinencode ist absolut identisch, aber die Verwendung der Bitnamen ist besser lesbar.

Noch besser wäre es, wenn Du zusätzlich Deine eigenen Konstanten definierst. Da die einzelnen Bits eines jeden Beinchens in den betreffenden 3 Registern (PORT, DDR, PIN) meiner Meinung nach immer einen identischen Wert besitzen/zugewiesen bekommen (also DDxn=PORTxn=PINxn=Pxn), kannst Du einfach zB folgendes definieren:
Code:
.include...
;Ausgänge
.equ Ausg0=PB0
.equ Ausg1=PB1
.equ Ausg2=PB3
.equ Ausg3=PB4
, und das beim LDI dann verwenden:
Code:
 LDI r16, (1<<Ausg3)|(1<<Ausg2)|(1<<Ausg1)|(1<<Ausg0)
Das erleichtert nochmal die Lesbarkeit des Codes, außerdem steht jetzt nur noch an einer einzigen Stelle (nämlich der Equation - ".equ"), welches Beinchen dem konkreten "Ausgang" entspricht. Wenn Du also konsequent Deine selbstdefinierten Konstanten im Code benutzt hast, und - sagen wir mal B2 als Ausgang3 verwenden willst, mußt Du nur diese eine Zeile auf ".equ Ausg3=PB2" ändern. (klar, PB2 darf dann natürlich nicht mehr Dein Eingang sein)
 
Danke Dir,
ich werde mich jetzt erst mal dran setzten und sehen was draus wird.
Ich werde Dir später dann das Ergebnis zeigen.

Gruß Christian
 
Hi,
ich musste heute feststellen, das mein Lernpacket total für den A…………. ist.
Programmer geht nicht richtig, das was in der Anleitung zum Lernen steht ist auch nicht das wahre,
es bring mich einfach nicht weiter weil überhaupt nichts beschrieben ist, aus den einzelnen Aufgaben.
Kannst Du mir einen Tipp geben was ich mir am Besten zu legen sollten.
Also an Programmer und Buch.
Wäre nett von Dir wenn Du mir einen guten Tipp geben kannst.

LG
Christian
 
Hi Christian,

Hi,
ich musste heute feststellen, das mein Lernpacket total für den A…………. ist.
Programmer geht nicht richtig, das was in der Anleitung zum Lernen steht ist auch nicht das wahre,
es bring mich einfach nicht weiter weil überhaupt nichts beschrieben ist, aus den einzelnen Aufgaben.
Kannst Du mir einen Tipp geben was ich mir am Besten zu legen sollten.
Also an Programmer und Buch.
Wäre nett von Dir wenn Du mir einen guten Tipp geben kannst.

LG
Christian

Also als Programmer kann ich eigentlich den AVRISPmk2 empfehen (ja er ist etwas teurer :rolleyes:).
Hier gab es schon öfters Probleme mit anderen Proggern die dann nicht mit Bascom zusammenlaufen wollten oder denen die Spannung des Zielsystems mit dem Atmel nicht gepaßt hat und, und, und ...
Da es zig verschiedene Programmer auf dem Markt gibt (die bestimmt auch ihre Berechtigung haben) und keiner alle kennen kann wirst du bei nem anderen Progger als dem AVRISPmk2 evtl Probleme bekommen wenn du Unterstützung von anderen Usern benötigst weil ihn evtl keiner kennt.

Der AVRISPmk2 paßt sich außerdem schön an die entsprechende Spannung des Zielsystems an (1,8V-5,5V). Er läuft mit Bascom und auch mit dem AVR-Studio. Außerdem gibts direkt vom Hersteller neue Firmware wenn neue Controllertypen raus kommen. Bei anderen Proggern kann es dir passieren das manche Controller nicht unterstützt werden und du sie dann nicht programmieren kannst.

Als Testaufbau ... hol dir nen Steckbrett, nen paar Drähte, verschiedene Widerstände, Kondensatoren nen paar Atmels ud LEDs, ... usw und ein kleines Labornetzteil (das kann manimmer gebrauchen). Also einfach nen Grundsatz an Bauteilen besorgen und loslegen. Der Rest kommt dann.

Gruß
Dino
 
HI,
also Bau teile habe ich genug da, Netzteil habe ich auch, da ich ja Modellbau betreibe, Steckbrett ist kein Prob.

Was für ein Buch würdest Du mir Raten.

Lieber Bascom oder doch lieber Assembler

Lg
 
Ist bedauerlich, Dir jetzt zu sagen: "Hätteste gleich was ordentliches gekauft" wird auch nichts ändern...
Wie Dino schon meinte, würde auch ich Dir den echten AVRISP MKII empfehlen (als Programmer) den sollteste so für um die 40€ bekommen. Wenn'de Dirk und das Forum unterstützen willst, zB direkt hier im Onlineshop, Reichelt und Co haben den aber auch.
Wenn Dir die Investition zu viel ist, mußt Du den Programmer mal nennen, vielleicht(!) kann dann noch irgendwer anders was sagen...

Zur Sprache: ich hatte mal etwas mit Bascom rumprobiert und bin bei Assembler gelandet und geblieben. Dino hatte AFAIK mit ASM begonnen, macht aber inzwischen einiges mit Bascom (aber als alter ASM-ler mit eingebettetem ASM usw, eben deutlich näher an der Hardware). Im Forum findest Du natürlich zu jeder Sprache jemanden, der mal helfen kann...

Wenns aber um das Verständnis für die Hardware geht, ist Assembler meiner Meinung nach das beste - für komplexere Sachen kannst Du immer noch wechseln.
Von der Sprache hängt dann natürlich die Literaturempfehlung ab:
Aus meiner Bascom-Zeit macht das "Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR" von Claus Kühnel einen relativ "zerlesenen" Eindruck.
Für ASM hab ich hier eigentlich gar kein empfehlenswertes Buch - hatte ja oben bereits das Tutorial verlinkt (PDF mit den um die 60 Seiten), das war für den Anfang ganz gut, dann ist der Instruction Code ganz wichtig (Link war auch schon oben) und eben das Datenblatt des verwendeten Controllers. Die sind ja alle immer irgendwie ähnlich, wenn man also mal eins durchgegangen ist, versteht man das nächste besser und schneller.

Ansonsten finden sich bestimmt im FAQ-Bereich des Forums (Dino hatte da sogar mal 'n Sammelthread erstellt und festgenagelt) noch viele Hinweise.

Und dann hast Du ja auch noch das Forum selbst...
 
Ich danke Euch zweien erst mal,
Ich werde mir diesen Programmer zulegen und in der zwischen Zeit noch weiter Lesen.
 
Heey :) Wie währe es mal mit einem Schaltplan ? :confused:
 
Ok,
hatte mir erst mal keine Gedanken über die Schaltung gemacht, da ich erst mal das Programme hin bekommen möchte.
Aber ihr mal schnell meine Schaltung umgesetzt. Kann sein das noch einige dinge Verändert werden.
 

Anhänge

  • Rc-Schalter.JPG
    Rc-Schalter.JPG
    74,4 KB · Aufrufe: 22
Ein Layout sollte man nicht mit einem Schaltplan verwechseln. Das ist ein Layout
 
Fährst du generell ohne Landkarte in fremde Länder/Gegenden?
 
Wenn ich doch weis, wie die einzelne Teile arbeiten, wieso soll ich mir dann doppelte Arbeit machen und mir erst einen Schaltplan Zeichnen und dann noch eine Layout erstellen.
 
Ich verstehe nicht ganz.
Erstellst du nur dein Layout ohne Schaltplan?

Ich kenne Leute, die machen sich die Mühe und erstellen vorher erst einen Schaltplan und aus dem Schaltplan dann ein Layout.
Alles andere ist absolut absurd :(
Muss aber jeder für sich selbst endscheiden.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)