Forum: Mikrocontroller und Digitale Elektronik Tiny 12


von ensan (Gast)


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 ?

von Unbekannter (Gast)


Lesenswert?

Schatlpan & Programm posten.

Die Glaskugeln sind noch eingefroren, vom langen Winter.

von ensan (Gast)


Angehängte Dateien:

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:

von Hannes L. (hannes)


Lesenswert?

Was soll das LPM bewirken?

...

von Hannes L. (hannes)


Angehängte Dateien:

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.

...

von Rolf Magnus (Gast)


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?

von ensan (Gast)


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

von hss (Gast)


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.

von ensan (Gast)


Lesenswert?

Danke hss

aber diese sind meist englisch

von Karl H. (kbuchegg)


Lesenswert?

Schon.
Aber nicht schwer zu lesen.

von hss (Gast)


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.

von Hannes L. (hannes)


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???

...

von hss (Gast)


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.

von Hannes L. (hannes)


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.

...

von hss (Gast)


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

von Karl H. (kbuchegg)


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.

von Hannes L. (hannes)


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.

...

von Karl H. (kbuchegg)


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.

von Hannes L. (hannes)


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.

...

von hss (Gast)


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.

von hss (Gast)


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

von hss (Gast)


Angehängte Dateien:

Lesenswert?

hier habt ihr etwas assembler

von Hannes L. (hannes)


Lesenswert?

@hss:

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

...

von André K. (freakazoid)


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

von Hannes L. (hannes)


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:
1
;====================================================================
2
; Interne Routinen, werden nur von lcd_init und lcd_clear aufgerufen
3
;--------------------------------------------------------------------
4
wait1ms:            ;wartet etwa 1 Millisekunden 
5
 push wl            ;Variablen beschaffen
6
 push wh
7
 ldi wl,low(clock/1000/25)  ;Startwert setzen 
8
 ldi wh,high(clock/1000/25) ;(AVR-Takt/1000Hz/25 Takte je Runde)
9
 rjmp wait1                 ;weiter...
10
11
wait5ms:            ;wartet etwa 5 Millisekunden 
12
 push wl            ;Variablen beschaffen
13
 push wh
14
 ldi wl,low(clock/200/25)   ;Startwert setzen 
15
 ldi wh,high(clock/200/25)  ;(AVR-Takt/200Hz/25 Takte je Runde)
16
 rjmp wait1                 ;weiter...
17
18
wait10ms:           ;wartet etwa 10 Millisekunden 
19
 push wl            ;Variablen beschaffen
20
 push wh
21
 ldi wl,low(clock/100/25)   ;Startwert setzen 
22
 ldi wh,high(clock/100/25)  ;(AVR-Takt/100Hz/25 Takte je Runde)
23
wait1:
24
 rcall waitend      ;7 Takte trödeln
25
 rcall waitend      ;7 Takte trödeln
26
 rcall waitend      ;7 Takte trödeln
27
 subi wl,1          ;Low-Byte vermindern
28
 sbc wh,null        ;High-Byte um Übertrag (Carry) vermindern
29
 brcc wait1         ;nochmal, solange $0000 -> $ffff kein Carry setzt
30
 pop wh             ;Variablen 
31
 pop wl             ;entsorgen
32
waitend:
33
 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'. :-)

...

von ensan (Gast)


Lesenswert?

Funzt ein Controller überhaupt ohne                        ;
Stackpointer initialisieren ?

von Unbekannter (Gast)


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!

von Ferdi (Gast)


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?

von Profi (Gast)


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.

von ensan (Gast)


Angehängte Dateien:

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

von Läubi (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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

...

von ensan (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch die korigierte schaltung

von ensan (Gast)


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?

von Kai R. (kairiek)


Lesenswert?

Lies doch jetzt bitte mal aufmerksam das Datenblatt...

MFG

Kai

von Hannes L. (hannes)


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.

;-)

...

von ensan (Gast)


Lesenswert?

Wäre ein 680 ohm als Pullup für den reset OK?

von Hannes L. (hannes)


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.

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.