Hallo! Ich hab mich gestern an ein mini - projekt mit dem ATtiny12 gewagt. Eigentlich sollte das projekt nur die Pins PB0, PB1 und PB2 belegen. Jetzt sollte ich aber doch einen Port mehr haben und da ich ein externes Quarz benötige bleibt mir nur noch der Port PB5(RESET). Im Datenblatt (S.46 ganz unten) steht dass man mit dem programmieren des RSTDISBL Bits den Externen Reset - Pin deaktivieren kann. Somit könnte ich diesen Pin als Port PB5 benutzen, oder??? Dann ist es aber nicht mehr möglich den Speicher des Zwergs über ISP zu erreichen..... Im DB (S.46) steht noch folgendes: Note: 1. If the RSTDISBL Fuse is programmed, then the programming hardware should apply +12V to PB5 while the ATtiny12 is in Power-on Reset. If not, the part can fail to enter programming mode caused by drive contention on PB0 and/or PB5. Wenn ich das richtig verstehe muss ich, wenn ich das RSTDISBL Bit mal programmiert hab, +12V an den (früheren) Reset Pin legen und dann die Betriebsspannung des Chips einschalten um wieder in den Programmiermodus zu kommen???!!! Wenn das stimmt, muss ich dann wärend des gesamten programmier - vorgangs diesen Pin auf +12V halten??? Bin ein wenig ängstlich weil ich nur den einen ATtiny hab und des Projekt sollte am Dienstag fertig sein!!! Bin dankbar für jede Antwort!!! MFG, HagBurt
machs doch einfach. Wenn du einen HV Programmer hast ist es kein Problem. Hast du Keinen, dann hast du mal wieder Zeit am realen Leben teilzunehmen. bye Frank
hm, mit nur einem einzigen lebenden Exemplar sollte man da schon etwas vorsichtiger sein :-) Vielleicht erstmal schauen, ob man nicht die anderen I/Os mehrfach nutzen kann? Genau weiss ich es nicht, aber ich glaube nicht, dass es damit getan ist, 12V an den Reset-Pin zu legen und dann weiter wie beim ISP... Ohne HV-Programmer ein heikles Unternehmen. Evtl. kannst du ja den Reset-Pin trotzdem nehmen, indem du MCUSR.EXTRF auswertest? Sicher nicht unbedingt schön, aber je nach Anwendung durchaus machbar.
Genau sag doch mal was du dranhängen hast, vieleicht kommst du ja trozdem mit den Pins aus ohne Reset zu disablen.
@Hagburt: 12V an Reset anzulegen, um bei gesetzter RSTDISBL-Fuse wieder in den ISP-Modus zu kommen, das funktioniert nicht. Grund: Bei dem Hochvolt-Modus (12V) wird ein völlig anderes Protokoll verwendet. ISP-Programme können dies nicht. Also, entweder einen Hochvolt-Prrogrammer verwenden, z.B. das Atmel STK500 oder sich einmal überlegen, wie man die Anzahl der benötigten Portpins reduzieren kann. Oder einen anderen Controller nehmen. ;-) Gruss Jadeclaw.
Danke für die Antworten!! Ist der selbstbau eines HV-Programmers sehr aufwändig??? Die ISP - Schaltung ist ja sehr einfach nachzubauen........ @Laeubi: Im Anhang ein jpg von meiner kleinen Schaltung! Es soll eine Sirene werden wo gleichzeitig im Sirenen - Takt 2 blaue LEDs abwechselnd blinken. Über den Taster T1 soll man den Modus auswählen können: 1. Blinken 2. Blinken + Sirene 3. Warten bis T2 betätigt wird (Erschütterungstaster) Ich bin nicht so der Elektronik - freak und es gibt sicherlich einige Änderungs - möglichkeiten..... Am Port PB5 / RESET soll eben mein Taster für Erschütterungen angebracht werden..... Danke schonmal, MFG HagBurt P.S. @Frank: ???War das auf die Uhrzeit bezogen???
Nun ja. Wozu brauchst du da einen Quarz? Der interne Oszillator ist zwar nicht der genaueste und driftet auch, aber ob die Leds jetzt im 1 Sekunden oder 1.0001 Sekunden Takt blinken, kratzt ja wohl niemanden wirklich.
"Wozu brauchst du da einen Quarz?" Das wollte ich auch gerade fragen. Nunja, ein Quarz wirkt da dran dann doch irgendwie wie ein Heckspoiler an einem Trabbi. Zum Thema HV-Programmer: Es gibt zwei, die sich nach Rückmeldung im hier im Forum auch als funktionsfähig erwiesen haben: HV-Prog, ein Nachbau des Programmierteils des STK500: http://www.der-hammer.info/hvprog/index.htm Eine einbfachere Version ist hier: http://elm-chan.org/works/avrx/report_e.html Diese Version unterliegt PC-seitig jedoch den gleichen Einschränkungen wie die einfachen ISP-Adapter. Das heißt, dort wo PonyProg am Parallelanschluß geht, geht dieser auch. Gruss Jadeclaw.
Ich hatte eigentlich auch vor ohne quarz zu arbeiten! Die LEDs sind auch nicht unbedingt das Problem. Es geht dabei ehr um den Lautsprecher.... Die ausgegebenen Töne haben manchmal unterbrechungenn und manchmal laufen sie ein paar sekunden ohne unterbrechung.... mit nem 4MHz Quarz (und alle delays * 3,3) hab ich dieses Problem nicht! Ich hab vorher noch was über das "Oscillator Calibration Register OSCCAL" gelesen.... auf seite 32 unten ist ne tabelle mit min-max werten.... was haben diese werte zu bedeuten? Mein Oscillation Callibration Byte hat den wert 0x5E ?! Kann es damit etwas zu tun haben dass die tonausgabe nicht regelmäßig abgearbeitet wird??? Danke, HagBurt
Quarz oder nicht Quarz ist da sicher nicht das Problem. Eher schon dein Programm. Zeig mal.
Nein. Kann es sein, dass in einer Interruptroutine zuviel Zeit verbraucht wird? Mit dem OSCCAL-Register kann man den internen RC-Oszillator auf die Sollfrequenz bringen, die angegebenen Werte besagen, welche Streubreite in den Einstellungen zu erwarten ist. Seite 76 zeigt auch die Abhängigkeit der Frequenz von Spannung und Temperatur. Der 0x5E-Wert, ist der, welcher bei der Fertigung ausgemessen wurde. Gruss Jadeclaw.
Ich seh grad, du hast den obligatorischen Abblock Kondensator nicht verbaut: 100nF zwischen Vcc und GND. Die Unterbrechungen könnten daher rühren, dass du kleine Unterbrechungen in der Versorgungsspannung hast und der Prozessor jedesmal einen Reset macht.
Hier mein code-auszug für die Sirenen - generierung: .include "tn12def.inc" sound_lights: ;-------- TATÜ TATA and Blue - blink - lightss sbi PORTB, 2 ldi r31, 127 ldi r30, 2 main_temp1: rcall wait1 dec r31 cpi r31, 0x00 brne main_temp1 dec r30 cpi r30, 0x00 brne main_temp1 cbi PORTB, 2 ldi r31, 240 ldi r30, 2 main_temp2: rcall wait2 dec r31 cpi r31, 0x00 brne main_temp2 dec r30 cpi r30, 0x00 brne main_temp2 rjmp sound_lights ;----------------------------------------------------- wait1: sbi PORTB,0 ldi r16, 233 ldi r17, 1 temp_wait1: dec r16 cpi r16, 0x00 brne temp_wait1 dec r17 cpi r17, 0x00 brne temp_wait1 cbi PORTB,0 ldi r16, 233 ldi r17, 1 temp_wait2: dec r16 cpi r16, 0x00 brne temp_wait2 dec r17 cpi r17, 0x00 brne temp_wait2 ret ;---------------------------------------------------- wait2: sbi PORTB, 0 ldi r16, 70 ldi r17, 1 temp_wait3: dec r16 cpi r16, 65 brne temp_wait3 dec r17 cpi r17, 0x00 brne temp_wait3 cbi PORTB, 0 ldi r16, 70 ldi r17, 1 temp_wait4: dec r16 cpi r16, 65 brne temp_wait4 dec r17 cpi r17, 0x00 brne temp_wait4 ret sorry dass er noch nicht kommentiert ist. Zeit-schleifen-fehler sind meiner meinung keine drin...... Ich hab mit meinem 30 USB - Oszi mal ne kleine Messung während des Betriebes mit dem internen RC-Oszillator drangehängt..... gemessen wurde über dem Basis - Vorwiderstand am Pin PB0. MFG, HagBurt
@Karl Heinz Buchegger : Hast recht, mit 100nF entstörkondensator ist das verhalten etwas besser. (nur noch 2 - 3 Unterbrechungen) Der Kommentar ;-------- TATÜ TATA and Blue - müsst ihr ignorieren... MFG, HagBurt
stimmt, da war noch was...... Aber eigentlch benötige ich ja den stack garnicht für die sicherung von rücksprung - addressen da ich ja kein subrotinen "call" sondern nur hin und her "rjmp"....., oder??? Und das Programm funktioniert ja fehlerfrei mit externem quarz.... nur sind die töne halt hochfrequenter.... MFG, HagBurt
also ich sehe da schon ein 'rcall wait1/2'. Aber wenn der Ram Bereich sonst nicht verwendet wird pasiert wahrscheinlich nix schlimmes. Aber sauberer wäre es schon.
Für diese "Lappalie" brauchst du keinen Quarz. Du solltest dein Programm anders strukturieren, also statt Warteschleifen den Timer-Interrupt verwenden. Leider hat der Tiny12 nur einen Timer, und dieser hat auch keine Compare-Einheit, mit der du den Sirenenton direkt in Hardware erzeugen könntest. Mit dem Tiny15 wärst du zum selben Preis besser bedient. Tiny13 und Tiny25 sind zwar noch fortschrittlicher, damit habe ich aber noch keine Erfahrung. Eine kleine Einführung in die Interruptprogrammierung mit Tiny15 findest du hier: http://www.hanneslux.de/avr/divers/index.html Das Calibrieren des internen Oszillators ist für diese Anwendung auch nicht unbedingt erforderlich, ohne Calibration rennt dein Tiny12 eben nur mit 800kHz..1MHz. Wenn du beide LEDs an einen Ausgang hängst, dann wird in deiner Schaltung immer eine leuchten. Die Transistoren für die LEDs brauchst du auch nicht, der Tiny12 kann die LEDs selbst treiben. Du könntest die beiden blauen LEDs, zwei Si-Dioden und die Widertände direkt in Reihe zwischen Vcc und GND schalten und mit einem Controllerpin die LEDs wechselweise schalten: Vcc blaue LED Si-Diode Widerstand Controller-Pin Widerstand Si-Diode blaue LED GND Die Flussspannungen der Dioden sind dann größer als die Versorgungsspannung, worauf die LEDs erstmal nicht leuchten. Ist der Controller-Pin auf Eingang ohne PullUp geschaltet, dann sind beide LEDs aus. Wird der Controller-Pin auf Ausgang geschaltet, so leuchtet bei L-Pegel die obere LED, bei H-Pegel die untere. Aber diesen Trick brauchst du nicht, da du ja (ohne Quarz) 5 I/O-Pins zur Verfügung hast. ...
@...HanneS... Lux: Danke für die vereinfachte schaltung..... Das nächste was ich versucht hätte wäre die timer / IR variante gewesen da ich schon Interrupt erfahrungen hab.... Trotzdem müsste doch mein Programm so laufen da es ja auch mit einem 4x schnellerem externen Qarz auch läuft...!!! MFG, HagBurt
> Trotzdem müsste doch mein Programm so laufen da es ja auch mit > einem 4x > schnellerem externen Qarz auch läuft...!!! Dein Programm habe ich nicht weiter analysiert, nachdem ich festgestellt habe, dass es nicht mit Timer-Interrupt arbeitet, sondern mit Warteschleifen und dass es keine Kommentare gibt. Sorry, es steht dir frei, mich für arrogant zu halten, aber Sowas (keine Kommentare, Warteschleifen) tu ich mir nicht mehr an, da ist mir meine Zeit zu schade. ...
@...HanneS... Lux: Ich halte dich nicht für arrogant und natürlich steht es mir frei! Mir ging es auch nur darum ob es möglich ist dass ein Programm nur funktioniert wenn es 4x schneller abgearbeitet wird was ich mir einfach nicht vorstellen kann..... Ich werd es mal mit dem timer versuchen.... Hab jetzt schon paar mal gelesen dass der interne Oszil. sehr instabil ist..... bedeutet das instabil im sinne von "große Abweichungen" oder instabil im sinne von "der oszillator schwingt aus und löst einen Reset aus" ? MFG, HagBurt
instabil ist er nur im Sinne von Frequenzkonstanz. Schwingt sicher. Zumindest beim AT90S1200 habe ich bei mehreren 1000 Stk keinerlei Probleme gehabt.
> möglich ist dass ein Programm nur > funktioniert wenn es 4x schneller abgearbeitet Nicht bei dem was du an Timing brauchst. Das erledigt den Tiny quasi nebenher. > Hast recht, mit 100nF entstörkondensator ist das > verhalten etwas besser. (nur noch 2 - 3 Unterbrechungen) Das macht mich stutzig. Was ist wenn du noch nen 100nF spendierst (wie immer: möglichst nahe ans Gehäuse vom Tiny ran). Ich glaub eigentlich immer mehr, dass das Problem elektrischer Natur ist. Klemm doch mal den Lautsprecher raus und eine LED oder sowas rein. Sinn der Sache: die Störungen durch den LS mal im Ansatz zu vermeiden und trotzdem eine Möglichkeit zu haben eventuelle Aussetzer zu sehen.
Der interne RC-Oszillator des Tiny12 arbeitet gut und zuverlässig. Aber er hat eine Temperaturdrift und jedes Exemplar läuft mit einer anderen Frequenz. Um Letzteres zu kompensieren, misst der Hersteller jedes Exemplar aus und ermittelt einen Korrekturwert (das "Calibrationsbyte"), den der Hersteller dauerhaft in den Signature-Bereich des AVRs und temporär in die letzte Flash-Zelle und in die letzte EEPROM-Zelle schreibt. Im Flash und EEPROM geht der Wert natürlich beim ersten Löschen verloren. Im Signature-Bereich kann der Wert aber nur von der Programmiersoftware gelesen werden. Um nun zu calibrieren, muss man den individuellen Wert vor dem Programmieren ermitteln und in das Programm einbinden, welches bei jedem Init (Reset) das Calibrationsbyte in das Calibrationsregister OSCCAL schreibt. All diese Informationen sind dem Datenblatt des Tiny12 und einer AVR-AppNote (Thema Calibration von RC-Oszillatoren) entnommen und stehen jedem Interessierten frei zur Verfügung. In dem oben geposteten Link zu der Soundspielerei mit Tiny15 ist zu sehen,wie ich den Oszillator calibriere. Es gibt sicher auch andere Möglichkeiten, aber diese scheint mir recht einfach und zuverlässig zu sein. Ich hatte damit noch nie Probleme und ich habe auch schon einige Tiny12 und Tiny15 verbaut. ...
Was du auch probieren kannst: Den C am Reset Pin mal in der Größe verändern. Werden die Aussetzer in ihrer zeitlichen Länge größer (bei größerem C) bzw kleiner (bei kleinerem C)? Wenn ja dann werden die Aussetzer durch Reset's verursacht. Der Grund dafür ist dann praktisch immer in der Versorgungsspannung zu suchen.
Also den Kondensator am Reset verwende ich bei Megas und Tinys grundsätzlich nicht. Allerdings halte ich den Reset-PullUp mit 3,3k recht niederohmig. ...
Mal ne Frage: Was passiert eigentlich wenn ich an einen LS 5V anlege und die dann ausschalte. So ein LS ist doch auch nur eine Spule und sollte daher eigentlich eine Gegenspannung aufbauen. Oder lieg ich da falsch?
Auch mal einen Versuch wert: Einen Widerstand von 20 - 50 Ohm zwischen Lautsprecher und +5V, sowie eine Diode antiparallel (= Sperrichtung) zum Lautsprecher schalten. Ein Lautsprecher ist auch immer eine Induktivität und da du diesen mit einem Rechtecksignal speist, gibt es auch entsprechende Spikes. Gruss Jadeclaw.
Stimmt... - Die Lautsprecherschaltung kann Störungen auf der Betriebsspannung verursachen. Lautsprecher mögen auch keine Gleichspannung. Ich hänge deshalb den Lautsprecher gern über Elko an eine Gegentaktstufe, wenn's nur Rechteck sein brauch, dann reicht dazu ein komplementärer Emitterfolger. ...
Danke für die vielen Antworten! Das mit dem LS ist mir jetzt auch klar geworden..... die ganze sache über eine gegntaktstufe zu betreiben werd ich heut abend gleich mal ausprobieren..... mein Oszi ist leider zu lahm um solche hochfrequenten spikes zu messen...... MFG, HagBurt
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.