www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tiny 12


Autor: ensan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute

Ich habe schon wieder ein Problem mit meinem Tiny.

Einen ext. Quarz benötigt man nicht, sagte mann mir zuminestens.
Aber ist der interne von anfang an auf On ?

Ich weiß nicht was Ich falsch mache. Wenn Ich ein Programm einspiele
was alle Pins auf High setzen soll ist alles OK. Die LEDS gehen an,.
Sobald Ich eine Zeitschleife reinsetze geht garnichts mehr, kann das
was mit dem Takt zutun haben ?

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schatlpan & Programm posten.

Die Glaskugeln sind noch eingefroren, vom langen Winter.

Autor: ensan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
.include "tn12def.inc"


.org $0000


.def a           = r16
.def b           = r17



init:
              ldi a, 0xff
              out PORTB, a

              ldi a, 0xff
              out DDRB, a



              ldi a, 0xFF
W2S_0:        ldi b, 0xFF
W2S_1:        lpm
              lpm
              lpm
              lpm
              lpm
              lpm
              lpm
              lpm
              lpm
              wdr
              dec b
              brne W2S_1
              dec a
              brne W2S_0




rjmp init




end:

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll das LPM bewirken?

...

Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst auch keine Transistoren, der Tiny12 kann die LEDs direkt
treiben. Vorwiderstand von 150..220 Ohm aber nicht vergessen.

Zum Blinken nimmt man auch vorteilhaft den Timer-Interrupt.

Im Anhang findest du ein Beispiel für einen Mehrfachblinker mit Tiny12.
Da der Oszillator des Tiny12 in diesem Programm nicht calibriert wird,
muss von einer sehr zufälligen Taktfrequenz im Bereich von
700kHz..1100kHz ausgegengen werden.

...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Sobald Ich eine Zeitschleife reinsetze geht garnichts mehr, kann
> das was mit dem Takt zutun haben ?

Nein. Die sollten eigentlich genauso angehen, wie vorher auch. Aber was
versuchst du da, aus dem Programmspeicher zu lesen? Und warum machst du
einen Watchdog-Reset? Ist der Watchdog denn eingeschaltet?

Autor: ensan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke  HanneS

Es will einfach nichts gehen. Ich muss dabei sagen das der Reset
mitlerweile abgeklemmt ist. Ich habe erfahren das es nicht nutzbar ist
wenn mann ISP Progt. aber muss Ich irgendwie denn Internen Tkt noch
einschalten ? weil auch mit deinem Script bleibt das ding aus

Autor: hss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du bist zu Faul Datenblatt zu lessen ausserdem würde dir Grundlagen der
E-technik nicht schaden, aller uC in standard Einstellung intern
getaktet wenn du nicht mit den Fuses gespielt has.

Autor: ensan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke hss

aber diese sind meist englisch

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon.
Aber nicht schwer zu lesen.

Autor: hss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du muss dich mehr mit Datenblätter bescheftigen was hier geschrieben
wird ist shon und gut aber es ist nicht alles.
Datenblätter würde ich auch niemals auf deutsch less wenn es sie auch
gebe.
   .org $0000
         rjmp init
das ist was bei dir fehlt.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der interne Takt ist im Auslieferungszustand des Tiny12 eingeschaltet,
aber nicht calibriert. Der Tiny12 versucht also sofort nach Anlegen der
Betriebsspannung mit der Abarbeitung des Programms. Das kann man aber
alles im Datenblatt nachlesen.

Die Taktquelle wird mit den Fusebits eingestellt. Da diese ab Werk auf
internen Takt eingestellt sind, lässt man da gefälligst die Finger von.
Sollte es unbedingt nötig sein, die Fusebits zu verändern, so nimmt man
vorher das Datenblatt und macht sich sachkundig. Alles Andere ist
totaler Leichtsinn und hat oftmals zur Folge, dass der AVR mit üblichen
Mitteln (ISP) nicht mehr angesprochen werden kann.

> Ich muss dabei sagen das der Reset
> mitlerweile abgeklemmt ist.

Wie soll ich das verstehen? Was ist "abgeklemmt"?
Hast du etwa per Fusebit den Reset-Pin zum I/O-Pin geschaltet?
Dann ist natürlich kein ISP-Programming mehr möglich, das steht aber
auch im Datenblatt und ist daher allgemein bekannt. Was meinst du
eigentlich, warum ATMEL sich die Arbeit macht, Datenblätter zu ihren
Mikrocontrollern zu schreiben und kostenlos zur Verfügung zu
stellen???

...

Autor: hss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du muss dich mehr mit Datenblätter bescheftigen was hier geschrieben
wird ist shon und gut aber es ist nicht alles.
Datenblätter würde ich auch niemals auf deutsch less wenn es sie auch
gebe.
   .org $0000
         rjmp init
das ist was bei dir fehlt.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber diese sind meist englisch

Dafür gibt es Wörterbücher. Ich kann nämlich auch kein Englisch (in
unserer Schule gab es neben Deutsch nur Russisch), aber zum Lesen von
AVR-Datenblättern reicht es inzwischen.

...

Autor: hss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.org $0000
      rjmp init

.def a           = r16
.def b           = r17



init:
              ldi a, 0xff
              out PORTB, a

              ldi a, 0xff
              out DDRB, a

es muss jetzt gehn



              ldi a, 0xFF
W2S_0:        ldi b, 0xFF
W2S_1:        lpm
              lpm
              lpm
              lpm
              lpm
              lpm
              lpm
              lpm
              lpm
              wdr
              dec b
              brne W2S_1
              dec a
              brne W2S_0




rjmp init

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll da gehen?
Der rjmp init
am Anfang hat überhaupt nichts gebracht und der Rest des
Programms macht immer noch dasselbe: Der Port wird auf 0xFF
gesetzt und dann passiert: Eine Schleife wird runtergezählt
und sonst passiert nicht viel. Zumindest nichts was man an
den Port-Pins sehen würde.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das "rjmp init" dient dem Überspringen der Interrupt-Vektoren. Sein
Programm nutzt aber (unverständlicherweise) keine Interrupts, fängt
daher bei Adresse 0 an. Daher bringt "rjmp init" hier nix.

Hier ist vermutlich einfach mal unwissend und unüberlegt
drauflosgewurschtelt worden, wie das leider bei vielen PC-Benutzern
üblich ist. ("mal probieren...")

Hier kann man nur auf das Datenblatt verweisen und durch alternativen
Code zeigen, dass man Code auch lesbarer (und vor allem funktionsfähig)
schreiben kann.

Ich habe z.B. immer noch keine Antwort, was das "LPM" bewirken soll.
Ich kann es nämlich nicht nachvollziehen, dafür bin ich wohl zu
unwissend.

...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Sein Programm nutzt aber (unverständlicherweise) keine Interrupts

Nun, ja. Sei nicht so hart Hannes.
Meine ersten beiden Programme (auch auf einem Tiny12) nutzten
auch noch keine Interrupts. Irgendwo muss man ja schliesslich
mal anfangen. Und für den Anfang tuts auch mal eine simple
Warteschleife. Hauptsache da rührt sich was an dem Pins, was
man mit einer LED sehen kann.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz:

Ich meinte das nicht abwertend. Auch hatte ich wieder mal das Smilie
vergessen.

Es ist aber so, dass Programme durch Nutzung eines Timer-Interrupts
einfacher werden.

Meine ersten Programme auf AT90S1200 liefen schon mit Timer-Interrupt,
hatten aber (aus heutiger Sicht) auch ihre Mängel.

Ein AVR-Programm ohne jeglichen Interrupt habe ich noch nicht
geschrieben, dafür schon viele, in denen in der Mainloop nix gemacht
wird. Ich finde, dass ein Timer die Controllertakte übersichtlicher
zählen kann als eine Warteschleife.

...

Autor: hss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-->Hier ist vermutlich einfach mal unwissend und unüberlegt
-->drauflosgewurschtelt worden, wie das leider bei vielen PC-Benutzern
-->üblich ist. ("mal probieren...")
hey vorsicht ich bin davon ausgegangen das Tiny12 interr...........
wie wäre es denn mit dem Avrstudio und Datenblatt lesen.

Autor: hss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bevor du einfach hier irgenetwas verzafst nehm Avrstudio und Simuliere
es ich hab nur das korriegiert was er da oben geschrieben hat wenn du
genauer wissen willst ich programmiere Atmega16 oder Arm

Autor: hss (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier habt ihr etwas assembler

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@hss:

Ich bezog mich auf das Programm und die Arbeitsweise des Fragestellers,
du musst dich nicht angesprochen fühlen.

...

Autor: André Kronfeldt (freakazoid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@HanneS:
Da wohl keiner das LPM erklären kann oder will, versuch ich das mal.
LPM ist einer der Befehle mit vielen (3?) Takten zur Ausführung.
Schätze mal es wurde versucht eine Verzögerung in die Schleife
einzubauen. Mit NOP hätte man die 3-fache Anzahl an Befehlen benötigt
(wenn man es denn dann auch so gelöst hätte).
Ein anderer Grund für LPM ist mir nicht eingefallen und selbst der oben
genannte Grund ist schwer zu verstehen ;-)

Grüße, Freakazoid

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;-)

Das Einzige, wo ich derzeit eine Warteschleife nutze, ist die
Initialisierung des Text-LCDs, da zu diesem Zeitpunkt noch keine
Interrupts freigeschaltet sind. Es gibt noch andere Einsatzfälle für
Warteschleifen, z.B. OWI, aber die nutze ich derzeit nicht.

Die Warteschleife für das LCD-INIT hatte zwecks Tests an unbekannten
LCDs mehrere Vorbereitungsteile, im folgenden Beispiel sind sie noch
drin:
;====================================================================
; Interne Routinen, werden nur von lcd_init und lcd_clear aufgerufen
;--------------------------------------------------------------------
wait1ms:            ;wartet etwa 1 Millisekunden 
 push wl            ;Variablen beschaffen
 push wh
 ldi wl,low(clock/1000/25)  ;Startwert setzen 
 ldi wh,high(clock/1000/25) ;(AVR-Takt/1000Hz/25 Takte je Runde)
 rjmp wait1                 ;weiter...

wait5ms:            ;wartet etwa 5 Millisekunden 
 push wl            ;Variablen beschaffen
 push wh
 ldi wl,low(clock/200/25)   ;Startwert setzen 
 ldi wh,high(clock/200/25)  ;(AVR-Takt/200Hz/25 Takte je Runde)
 rjmp wait1                 ;weiter...

wait10ms:           ;wartet etwa 10 Millisekunden 
 push wl            ;Variablen beschaffen
 push wh
 ldi wl,low(clock/100/25)   ;Startwert setzen 
 ldi wh,high(clock/100/25)  ;(AVR-Takt/100Hz/25 Takte je Runde)
wait1:
 rcall waitend      ;7 Takte trödeln
 rcall waitend      ;7 Takte trödeln
 rcall waitend      ;7 Takte trödeln
 subi wl,1          ;Low-Byte vermindern
 sbc wh,null        ;High-Byte um Übertrag (Carry) vermindern
 brcc wait1         ;nochmal, solange $0000 -> $ffff kein Carry setzt
 pop wh             ;Variablen 
 pop wl             ;entsorgen
waitend:
 ret                ;fertig bzw.zurück...
Dabei sind die Register wl und wh R24 und R25, null ist ein unteres
Register (meist R3), das immer den Wert 0 enthält, die Konstante
'clock' wird im Kopf des Programms definiert und entspricht der
Taktfrequenz. Das Aufrufen eines sowiso vorhandenen 'RET' als
Unterprogramm vertrödelt doch etwas mehr Zeit als ein 'LPM'. :-)

...

Autor: ensan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funzt ein Controller überhaupt ohne                        ;
Stackpointer initialisieren ?

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Funzt ein Controller überhaupt ohne                        ;
> Stackpointer initialisieren ?

Datenblatt, Seite 12 lesen. Dort steht alles über den Hardware-Stack.

Du wirst um das aufmerksame und genaue Lesen des kompletten
Datenblattes nicht drum rum kommen!

Autor: Ferdi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe jetzt die Transistoren weggelassen und die IOs direkt benutzt,
außerdem musste Ich den Reset auf High legen und dann gings. Allerdings
sagte man mir das man den auch offen lassen kann.
Jetzt wollte Ich denn nächsten schritt wagen und die Transistoren
anchliessen, allerdings arbeitet die Patine jetzt wie ein Berührung
sensor. Es geht nichts bis Ich die Platine berühre oder auch nur in die
nähe komme.

WARRRRum?

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,
1. ein Vorwiderstand (R5) für alle LEDs ist ein wenig wenig.
Du solltest jeder LED einen spendieren.
Sonst leuchtet die LED mit der niedrigsten Spannung am hellsten, und
außerdem ändert sich die Leuchtstärke mit der Anzahl der
eingeschalteten LEDs, da sich der Strom aufteilt.

2. Im Auslieferungszustand hat Pin 1 (Reset/PB5) nur die
Reset-Funktion, kannst Du also nicht als Ausgang verwenden.
In Deiner Schaltung wirkte R2 als Pull-Down und damit Dauer-Reset.

3. Wenn die Schaltung auf Berührung o.ä. reagiert, sind immer offene
Eingänge im Spiel. Es ist oberstes Gebot, möglichst alle Pins (da sie
während und nach dem Reset zuerst mal Eingänge sind) mit Pull-Ups oder
Pull-Downs zu versehen.
Offene (floating) CMOS-Eingänge neigen zum Schwingen und können neben
erhöhtem Stromverbrauch andere schwer zu lokalisierende Nebeneffekte
auslösen.

Autor: ensan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Morgen

Was meinst genau mit offene Eingänge ?
Ich muss dabei sagen das die Schaltung mitlerweile anders aussieht.
der Aktuelle ist im anhang und dazu noch etwas der Reset ist mit
10 K auf V+ gelegt.

Und dazu noch das ding wird über ISP geprogt

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du die I/Os ggf als EINGANG konfiguriert?
Das Problem hatte ich auch mal, sind ähnliche symptome.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann in deinem neuen Schaltbild weder Reset-Widerstand noch
LED-Vorwiderstände finden.

...

Autor: ensan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch die korigierte schaltung

Autor: ensan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe den Fehler jetzt geht alles.
Es lag wirklich daran das Ich den Reset auf High legen musste.
Ist es da eigentlich egal was für ein Wiederstand man nimmt?
Und warum sagt man das es auch ohne geht?

Autor: Kai Riek (kairiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies doch jetzt bitte mal aufmerksam das Datenblatt...

MFG

Kai

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es lag wirklich daran das Ich den Reset auf High legen musste.

Nun, das ist eigentlich eine Selbstverständlichkeit. Wer rechnet schon
damit, dass du das nicht machst?

> Ist es da eigentlich egal was für ein Wiederstand man nimmt?

Der Widerstand ist ein Kompromiss.
Er sollte so niederohmig sein, dass Störimpulse keine Chance haben,
einen ungewollten Reset auszulösen.
Und er sollte so hochohmig sein, dass der ISP-Programmer es ohne Mühe
schafft, den Reset-Pin nach Low zu ziehen und zu halten.
Ich persönlich nehme meist 3k9 bedrahtet oder 4k7 SMD, je nachdem
welche Bauform gerade besser zum Layout passt. Ich bevorzuge diese
Werte nicht weil sie "ultimativ optimal" sind, sondern weil ich sie
reichlich vorrätig habe und meine Schaltungen damit zuverlässig
funktionieren.

> Und warum sagt man das es auch ohne geht?

Ich weiß nicht, wer sowas sagt, und wenn einer sowas sagt, dann
überhöre ich das geflissentlich. Ich bilde mir lieber meine eigene
Meinung. Denn wenn ich auf alles hören würde, was man so sagt (z.B.
Werbung), dann würde ich sehr schnell verblöden.

;-)

...

Autor: ensan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre ein 680 ohm als Pullup für den reset OK?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wäre ein 680 ohm als Pullup für den reset OK?

Den wird dein ISP-Programmer wohl als Kurzschluss interpretieren.
Vermutlich wird das auch dein LPT-Port nicht lange mitmachen.

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.