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
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).
Aehm.
Es wäre gut den Stackpointer zu initialisieren, bevor
du da Unterprogramme aufrufst. Ansonsten speichert
der RCALL seine Rücksprungadresse im Datennirvana.
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.
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 ;)
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
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.
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.
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
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.
>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...
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
> 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.
...
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.
@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
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.
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!
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.
> 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...
...