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 ?
.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:
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.
...
> 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?
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
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.
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.
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???
...
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.
> 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.
...
.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
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.
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.
...
> 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.
@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.
...
-->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.
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
@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
;-)
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:
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'. :-)
...
> 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!
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?
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.
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
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?
> 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.
;-)
...
> 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.
...