Forum: Mikrocontroller und Digitale Elektronik Attiny26 macht nicht, was er soll!


von Rüdiger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
liebe Freunde der 20-beinigen Käfer.

Seit längerem lese ich hier im Forum und habe immer eine Antwort
gefunden, nur jetzt stoße ich an

meine Grenzen.

Ich versuche einen Attiny26 in AVRStudio zu programmieren und
anschließend die Hex datei mit ponyprog

 auf den uC zu übertragen.
Das funktioniert auch sehr gut, aber leider macht das Prog nicht das
was es soll.
(ein Wechselblinker an PA5, mit 1,5 sekunden)
Eigentlich sollen die Anforderungen an den attiny26 noch wachsen, aber
wenn das schon nicht läuft...

Die Schaltung habe ich als Anhang eingefügt, vielleicht liegt da
irgendwo der Fehler.
Der Ausgang geht auf einen CMos-Schalter (4066).

Die Fusebits sind alle nicht angehackt außer:
SUT = 10
CKSEL = 0110

Die schaltung soll mit einem 1Mhz quarz laufen.

Wenn ich das Programm raufgeschoben habe, setzt der Tiny die Ausgänge
nur einmal und dann ist Schluss.

Was mache ich nur falsch.
Es wäre sehr net, wenn ihr euch der Sache mal annehmen könntet.
Mich lässt das gefühl nicht los, dass es an dem Tiny liegt.
Danke




.include "tn26def.inc"


ldi r16, 0b00100000
out DDRA, r16 ;PA5 als Ausgang


looping: ;Blink-Schleife

ldi r16, 0b00100000
out PORTA, r16
rcall delay500msec ;0.5 Sekunden warten
rcall delay500msec ;0.5 Sekunden warten
rcall delay500msec ;0.5 Sekunden warten


ldi r16, 0b00000000
out PORTA, r16
rcall delay500msec ;0.5 Sekunden warten
rcall delay500msec ;0.5 Sekunden warten
rcall delay500msec ;0.5 Sekunden warten

rjmp looping

;*********************************************************************** 
****
  delay500msec:
 ldi R16, $12
 WGLOOP0: ldi R17, $BC
 WGLOOP1: ldi R18, $C4
 WGLOOP2: dec R18
 brne WGLOOP2
 dec R17
 brne WGLOOP1
 dec R16
 brne WGLOOP0
 nop
 nop
ret ;wieder zurück ins Hauptprogramm springen

von The Daz (Gast)


Lesenswert?

Könnte mich irren, aber ich meine bei 1MHz braucht jeder call von
delay500msec etwa 1,3 sec. Bei einem externen 1MHz Quartz sollte CLKSEL
auf 1100 stehen. CKOPT unprogrammiert lassen (1).

von The Daz (Gast)


Lesenswert?

Korrektur : delay500msec dauert ca. 1,9 sec.

von Karl H. (kbuchegg)


Lesenswert?

Aehm.
Es wäre gut den Stackpointer zu initialisieren, bevor
du da Unterprogramme aufrufst. Ansonsten speichert
der RCALL seine Rücksprungadresse im Datennirvana.

von Wolfram (Gast)


Lesenswert?

Aber bevor du dies alles tust solltest du den Reset Pin am Tiny auf
einen definierten Pegel legen und VCC mit einem Kondensator 100nF
stabilisieren. Wenn du durch deine Fuseseinstellungen nicht gerade den
externen Reset deaktiviert hast ist es sehr wahrscheinlich das sich der
Mikrocontroller ab und zu resetet.

von Läubi (Gast)


Lesenswert?

Ich glaub am Stack liegts eher :)

von Holger Krull (Gast)


Lesenswert?

Mein Warteschleifengenerator bringt mir andere Werte bei 500ms und 1Mhz

; =============================
;   Warteschleifen-Generator
;     500000 Zyklen:
; -----------------------------
; warte 499995 Zyklen:
          ldi  R17, $0F
WGLOOP0:  ldi  R18, $37
WGLOOP1:  ldi  R19, $C9
WGLOOP2:  dec  R19
          brne WGLOOP2
          dec  R18
          brne WGLOOP1
          dec  R17
          brne WGLOOP0
; -----------------------------
; warte 3 Zyklen:
          ldi  R17, $01
WGLOOP3:  dec  R17
          brne WGLOOP3
; -----------------------------
; warte 2 Zyklen:
          nop
          nop
; =============================

von Arnobär (Gast)


Lesenswert?

also ohne stack initialisieren is es kein wunder ^^

.include "tn26def.inc"

.org 0x00
;Stackpointer
ldi r16, RAMEND
out SP, r16

;PB5 als Ausgang
ldi r16, (1<<PB5)
out DDRA, r16

looping: ;Blink-Schleife

ldi r16, (1<<PB5)
out PORTA, r16
rcall delay500msec
rcall delay500msec
rcall delay500msec


ldi r16, (0<<PB5)
out PORTA, r16
rcall delay500msec
rcall delay500msec
rcall delay500msec

rjmp looping

;delay 500000 cycle
delay500msec:
ldi r17, 0x9E
ldi r18, 0x86
ldi r19, 0x01
delay500b:
subi r17, $01
sbci r18, $00
sbci r19, $00
brne delay500b
nop
ret

ok, ich sollte jetzt endlich mal einen artikel veröffentlichen in dem
ich meine smarte delay-routine erkläre, alle wundern sich immer wie das
geht ;)

von A.K. (Gast)


Lesenswert?

@Wolfram: Alle Megas und Tinys haben interne Pullups am Reset. Die sind
zwar für störversuechte Umgebung etwas dünne, aber für's erste reicht
es.

von Rüdiger (Gast)


Lesenswert?

Oh man, ihr seit ja echt schnell.
Leider kann ich neben der Arbeit nicht so regelmäßig reinschauen.

Aber ich werde mir die Tips mal sehr zu Herzen nehmen.

Leider kann ich nun irgendwie gar nicht mehr auf den Tiny zugreifen.

@wolfram:
Du hast es wohl geahnt, leider ist der nun hin.
Ich muss montag erstmal einen neuen bestellen, da ich keine Mgl. zur
HV-Programmierung habe.
Deshalb kann ich wohl erst mal nicht weiter rum probieren.

Wie wären die Fuses denn richtig, damit ich es nicht wieder versaue?
Danke

von TravelRec. (Gast)


Lesenswert?

Wenn Du schon mit AVR-Studio proggst, warum lädst Du dann die .hex-Datei
mit PonyProg? AVR hat das Programmier-Interface doch schon drin oder
haste wieder mal so´n Gurkenprogrammer Marke Eigenbau?! Bestimmt sind
nun die Fuses verstellt und somit läuft der Tiny nur noch auf externen
Takt. Also schließe mal ´ne externe Taktquelle von >1MHz an den
XTAL1-pin und dann sollte Dein Tiny wieder laufen. Und kauf Dir
gelegentlich mal einen ordentlichen Programmer, der mit AVR-Studio
zusammenarbeitet, dan hast Du mindestens 5 Sorgen weniger - meine
Meinung.

von Wolfram (Gast)


Lesenswert?

Wie du die Fuses setzen musst kann ich dir nicht sagen, ich benutze das
STK500. Es erspart sehr viel Zeit, insoweit haben sich die 100 Euro
wirklich gelohnt. UND man hat auch einen HV Programmer und ISP
Programmer.
Auch wenn es der Stack war. Wenn du Montag bestellst nimm noch die
Kondensatoren hinzu. Schaltung siehe Datenblatt. Die für AVCC hast du
ja übernommen.
>Die sind zwar für störversuechte Umgebung etwas dünne, aber für's
erste >reicht es.
Ich würde eine selbstgelötete Platine Experimentierplatine aka
Drahtverhau als ziemlich störverseuchte Umgebung bezeichnen. Insoweit
kann man schon allein durch 2 Kondensatoren die Situation sehr
verbessern.
Es macht nicht so richtig Spass wenn man Fehler sucht und die Hardware
schon der Grund sein kann.

von Thomas O. (Gast)


Lesenswert?

Hast du die Resetbeschaltung nicht reingezeichnet oder funktioniert das
programmieren bei dir so?

von Rüdiger (Gast)


Angehängte Dateien:

Lesenswert?

So der Tiny ist angekommen und ich habe den Code ausprobiert.
Es lag doch am Stack.
Danke

Mittlerweile habe ich weiter mit dem Tiny rumgespielt und eine serielle
Schnitstelle eingebaut.
Jetzt soll er mir aber noch einen AD-Wert über die UART senden aber die
Werte stimmen nicht so ganz.
Ich habe den Code mal angehängt.
Am ADC0 hängt ein Poti mit dem ich die Spannung zwischen 5V und GND
einstellen kann.
(Der 8-Bit wert reicht mir vorerst.)
Ich nehme die interne Ref.
Den Wert den er mir ausgibt ist (genau) die Differenz zwischen 2,56V
und dem Potiwert, nicht aber zwischen Potiwert und GND wie es
sinnvollerweise sein sollte.
Der Wert ist auch nicht so genau.
Wie genau ist denn der Wandler eigentlich?

Habt ihr noch eine Idee?
Was mach ich blo? falsch?
Danke

von Rüdiger (Gast)


Lesenswert?

Die Frage der Genauigkeit ist vieleicht doof gestellt.
Klar hat er eine Genauigkeit von 10bit (oder in meinem Fall nur 8bit).
Ich meinte eher wie dicht der gemessene Wert an dem waren Wert dren
ist, den ich habe jetzt immer eine Abweichung von 0,1V.

von Rahul (Gast)


Lesenswert?

>Den Wert den er mir ausgibt ist (genau) die Differenz zwischen 2,56V
>und dem Potiwert, nicht aber zwischen Potiwert und GND wie es
>sinnvollerweise sein sollte.
Poti falsch herum angeschlossen? Falsche Drehrichtung?

>Der Wert ist auch nicht so genau.
>Wie genau ist denn der Wandler eigentlich?
Das steht alles im Datenblatt...

von Rüdiger (Gast)


Lesenswert?

Also das Poti falsch herum kann nicht sein.
wenn ich am ADC-Eingang 1V anlege, dann gibt er mir als Wert die 1,56V
aus. Das ist genau die Differenz zu 2,56V.

Die Abweichungen lese ich dann nochmal nach. Danke

von Hannes L. (hannes)


Lesenswert?

> Am ADC0 hängt ein Poti mit dem ich die Spannung zwischen 5V und GND
> einstellen kann.

> Ich nehme die interne Ref.

Ist das nicht ein Widerspruch??

Wenn du das Poti zwischen Vcc und GND schaltest, dann solltest du auch
Vcc als Referenz nehmen.

...

von Rüdiger (Gast)


Lesenswert?

Den Widerspruch versteh ich nicht.
Die 5V sind natürlich Vcc und ich bleibe doch mit dem Wert an ADC0
unter 2,56V. Damit müsste es doch wenigstens laufen.

von Rahul (Gast)


Lesenswert?

Wie sieht denn die Schaltung an deinem ADC-Pin genau aus?

von WM Hoffender (Gast)


Lesenswert?

@Rüdi
Mal eine Zwischenfrage: Wie hast du die UART realisiert?
Hardwaremäßig hat der ATTiny26 eine USI, die SPI und I2C kann. Hast du
die UART als software auf einen PIN implementiert?

Gruß mit 3 Fragezeichen

von Rüdiger (Gast)


Lesenswert?

Die UART habe ich aus einer 3xx AppNote von Atmel.
Die ist komplett fertig gewesen.

Ich bin leider noch in der Firma, deshalb kann ich den Schaltplan erst
heute abend posten.

von Rüdiger (Gast)


Angehängte Dateien:

Lesenswert?

So jetzt habe ich es mal geschafft die Schaltung zu posten.

Also an AREF liegen nun 5V und am ADC0 1,8V.
Aber die serielle Schníttstelle gibt mir als 162 aus.
Es sollten aber 92 sein.
Was mach ich nur falsch?
BITTE helft mir!

von Rüdiger (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe noch einmal den aktuellen Code angehängt.
Vielleicht liegt es ja doch an de Parametrierung?

von Xenu (Gast)


Lesenswert?

162 invertiert ergibt 93.

Interessant, oder?

von Thomas O. (Gast)


Lesenswert?

Poti anderstrum anschließen(A und E vertauschen) dann gehts normal oder
per Software invertieren.

Könntest z.b. 255 in ein Register laden und davon die 162 abziehen.

von Hannes L. (hannes)


Lesenswert?

> Könntest z.b. 255 in ein Register laden und davon die 162 abziehen.

Könntest auch im Befehlssatz nachschaun und den Befehl COM
entdecken...

...

von Thomas O. (Gast)


Lesenswert?

wusste doch das es nen Befehl gibt, ist mir nicht mehr eingefallen wie
es geheissen hat damals in Basic ums zu vergleichen bzw. zu suchen.

von Hannes L. (hannes)


Lesenswert?

> wusste doch das es nen Befehl gibt, ist mir nicht mehr eingefallen
> wie
> es geheissen hat damals in Basic ums zu vergleichen bzw. zu suchen.

COM vergleicht oder sucht nicht, COM invertiert...

...

von Thomas O. (Gast)


Lesenswert?

wusste nicht mehr wie der Basic-Befehl hieß um ihn im Befehlsdatenblatt
zu suchen. Habe gramatikalisch etwas daneben gegriffen.

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.