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
@hss: Ich bezog mich auf das Programm und die Arbeitsweise des Fragestellers, du musst dich nicht angesprochen fühlen. ...
@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:
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'. :-) ...
> 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
Hast du die I/Os ggf als EINGANG konfiguriert? Das Problem hatte ich auch mal, sind ähnliche symptome.
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.
...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.