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.
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 ; =============================
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 ;)
@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.
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.
Hast du die Resetbeschaltung nicht reingezeichnet oder funktioniert das programmieren bei dir so?
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!
Ich habe noch einmal den aktuellen Code angehängt. Vielleicht liegt es ja doch an de Parametrierung?
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.
> 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...
...
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.
> 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... ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.