Vorab: Ich bin ein absoluter Neuling auf dem Thema Mikrocontroller.
Natürlich habe ich mich im Netz umgesehen, aber so ganz steige ich noch
nicht durch diesen kryptischen Assembler durch.
Mir schwebt folgender Ablauf vor: Nach etwa einer Sekunden (nach dem
Einschalten) soll der ATtiny15L für 500ms ein Reed-Relais (über einen
N-HexFet - PB4) schalten. Keine Wiederholung, kein erneuter Reset.
Aktuell habe ich mir für den Assembler im groben folgenden Ablauf
vorgestellt:
- Laden der "tn15def.inc"
- Definition irgendwelcher Register
- Reset
- Timer 1000ms
- Relais einschalten (PB4)
- Timer 500ms
- Relais ausschalten (PB4)
Weiß jemand Rat oder kann mir helfend unter die Arme greifen?
Grüße
Axel
Hi Axel,
du kannst auch BASCOM (BASIC-Compiler) statt Assembler nutzen. Als
Anfänger und für dieses kleine Projekt tust du dir bestimmt leichter zum
Ziel zu kommen. Schau mal auf www.mcselec.com. Hier bekommst du eine
Demoversion mit der du ohne Probleme den Tiny15 proggen kannst.
..Lösch- Diode muß parallel zur Relais- Spule liegen..
Man kann auch mit Kanonen auf Spatzen schießen.
Ich würde das lieber mit einem PC und einer Relaiskarte machen...!
An den Relais-Kontakten befinde sich ein Reed-Relay COMUS 3563.1231.053
mit einer Diode parallel zur Spule. ;-)
Die Diode LL4148 kann als Schutzdiode angesehen werden, die sich bereits
auf der Platine befindet (Schaltung basiert auf einer ELV-Schaltung).
Elektronix schrieb:> Hi Axel,>> du kannst auch BASCOM (BASIC-Compiler) statt Assembler nutzen. Als> Anfänger und für dieses kleine Projekt tust du dir bestimmt leichter zum> Ziel zu kommen. Schau mal auf www.mcselec.com. Hier bekommst du eine> Demoversion mit der du ohne Probleme den Tiny15 proggen kannst.
So, ich habe den Tipp beherzigt und es mal mit BasCom versucht:
############################
$regfile = "ATtiny15.DAT"
$tiny
$crystal = 1600000
'Relais an PB4
Config Portb.4 = Output
'Warte 1500 ms
Waitms 1500
'Relais Ein (HIGH)
Portb.4 = 1
'Warte 500 ms
Waitms 500
'Relais Aus (Low)
Portb.4 = 0
End
#############################
Bekommen beim 'Syntax check' folgende Fehlermeldung:
Error:22 Line: 20 Out of SRAM space ,in File...
Ich glaube, BasCom ist für den Tiny15 nicht geeignet. Zumal der Tiny
kein SRAM hat, sondern nur 32 Rechenregister als Speicher.
Axel L. schrieb:> Elektronix schrieb:>> Hi Axel,>>>> du kannst auch BASCOM (BASIC-Compiler) statt Assembler nutzen. Als>> Anfänger und für dieses kleine Projekt tust du dir bestimmt leichter zum>> Ziel zu kommen. Schau mal auf www.mcselec.com. Hier bekommst du eine>> Demoversion mit der du ohne Probleme den Tiny15 proggen kannst.>> So, ich habe den Tipp beherzigt und es mal mit BasCom versucht:>> ############################> $regfile = "ATtiny15.DAT"> $tiny> $crystal = 1600000
Das stimmt aber leider erst, wenn Du den Tiny15 kalibriert hast, ab Werk
läuft der mit irgendwas um die 1,0...1,2 MHz. Neuere AVRs (Tiny13,
Tiny25) kalibrieren den Oszillator beim Reset selbst. Bei Tiny12 und
Tiny15 muss man das noch von Hand erledigen.
>> 'Relais an PB4> Config Portb.4 = Output>> 'Warte 1500 ms> Waitms 1500>> 'Relais Ein (HIGH)> Portb.4 = 1>> 'Warte 500 ms> Waitms 500>> 'Relais Aus (Low)> Portb.4 = 0>
Hier sollte eigentlich eine Endlos-Schleife hin, da der Controller sonst
von vorn beginnt. Ob der Befehl "End" das macht, weiß ich nicht, könnte
aber sein.
Do
Loop
> End> #############################>> Bekommen beim 'Syntax check' folgende Fehlermeldung:> Error:22 Line: 20 Out of SRAM space ,in File...>> Ich glaube, BasCom ist für den Tiny15 nicht geeignet.
Eben, Hochsprachen brauchen auf AVRs SRAM. Und SRAM gibt es beim Tiny15
nicht. Der Waitms-Befehl nutzt SRAM für die Warteschleifen.
> Zumal der Tiny> kein SRAM hat, sondern nur 32 Rechenregister als Speicher.
Das ist aber erstmal kein Makel. Es gibt Leute, die haben mit den
wenigen Ressourcen des Tiny15 komplexe Dinge realisiert wie z.B.
DCC-Lokdecoder, RC-Fahrtregler mit Bremslicht und Rückfahrlicht.
Warum klammerst Du Dich eigentlich an den Tiny15? Hast Du sie vorrätig?
Wenn nicht, dann nimm den neueren und inzwischen billigeren Tiny13, der
hat 64 Byte SRAM und damit läuft dein Bascom-Programm. Außerdem ist sein
Oszillator bereits kalibriert, was Dir unnötige Arbeit spart. Er ist (im
Fachhandel) auch besser verfügbar als der Tiny15.
MfG, Consulter
Gut, ich gebe mich geschlagen :-/
Ich habe seinerzeit den Tiny13 geproggt. Mit dem gehts ohne Probleme, da
er 64bytes SRAM besitzt.
Du kannst aber auch in BASCOM mit Assembler arbeiten, schau mal nach
$ASM. Im Forum gibts auch irgendwo ein paar Beispiele für Zähl- bzw.
Warteschleifen in Assemblercode.
Axel L. schrieb:> Bekommen beim 'Syntax check' folgende Fehlermeldung:> Error:22 Line: 20 Out of SRAM space ,in File...>> Ich glaube, BasCom ist für den Tiny15 nicht geeignet. Zumal der Tiny> kein SRAM hat, sondern nur 32 Rechenregister als Speicher.
Habe keine grosse Ahnung von Bascom, aber man soll
unter "Options", "Programmer", "Compiler" den HW-Stack
und SW-Stack auf z.B. "4" o. ä. einstellen ...
Ralf2008
Elektronix schrieb:> Gut, ich gebe mich geschlagen :-/
Das musst Du nicht. Das war doch eine gute Vorlage zum Zeigen was nicht
geht. ;-)
> Ich habe seinerzeit den Tiny13 geproggt. Mit dem gehts ohne Probleme, da> er 64bytes SRAM besitzt.> Du kannst aber auch in BASCOM mit Assembler arbeiten, schau mal nach> $ASM. Im Forum gibts auch irgendwo ein paar Beispiele für Zähl- bzw.> Warteschleifen in Assemblercode.
Naja, um vollständig in ASM zu arbeiten, braucht es kein Bascom, da kann
man dann gleich im Avrstudio4 arbeiten.
Wenn man die Warteschleifen selbst programmiert, könnte es vielleicht
gehen. Man müsste probieren, ob man mit dem Zusatz "Overlay" zum Befehl
"Dim" die Variablen in den Adressbereich der Register (0 bis 31) zwingen
kann. Nur zur Info für Axel: SRAM beginnt ab Adresse 96.
MfG, Consulter
Klar geht das, man muss nur wissen wie :D
Ob's Sinn macht, sich mit einem ATiny15 in Verbindung mit Bascom
rumzuquälen sei dahingestellt.
1
$regfile = "ATtiny15.DAT"
2
$crystal = 1600000
3
$tiny
4
$noramclear
5
$hwstack = 0
6
$swstack = 0
7
$framesize = 0
8
9
'Relais an PB4
10
Config Portb.4 = Output
11
12
Do
13
'Warte 1500 ms
14
Waitms 1500
15
16
'Relais Ein (HIGH)
17
Portb.4 = 1
18
19
'Warte 500 ms
20
Waitms 500
21
22
'Relais Aus (Low)
23
Portb.4 = 0
24
Loop
25
26
End
Fehlerursache war übrigens, daß Bascom für Stack und Frame, falls nicht
im Code definiert, die Standardeinstellungen aus den Optionen nimmt, und
wenn da irgendetwas > 0 drinsteht, dann beschwert sich der Compiler.
> Wieder was gelernt (was ich wohl selbst nie brauchen werde).
Man weis nie, wofür's gut ist :D
Hier noch eins:
> Man müsste probieren, ob man mit dem Zusatz "Overlay" zum Befehl> "Dim" die Variablen in den Adressbereich der Register (0 bis 31)> zwingen kann.
Das nennt sich IRam
MWS schrieb:> Klar geht das, man muss nur wissen wie :D> Ob's Sinn macht, sich mit einem ATiny15 in Verbindung mit Bascom> rumzuquälen sei dahingestellt.>
1
$regfile = "ATtiny15.DAT"
2
> $crystal = 1600000
3
> $tiny
4
> $noramclear
5
> $hwstack = 0
6
> $swstack = 0
7
> $framesize = 0
8
>
9
> 'Relais an PB4
10
> Config Portb.4 = Output
11
>
12
> Do
13
> 'Warte 1500 ms
14
> Waitms 1500
15
>
16
> 'Relais Ein (HIGH)
17
> Portb.4 = 1
18
>
19
> 'Warte 500 ms
20
> Waitms 500
21
>
22
> 'Relais Aus (Low)
23
> Portb.4 = 0
24
> Loop
25
>
26
> End
> Fehlerursache war übrigens, daß Bascom für Stack und Frame, falls nicht> im Code definiert, die Standardeinstellungen aus den Optionen nimmt, und> wenn da irgendetwas > 0 drinsteht, dann beschwert sich der Compiler.
Ok, läuft in BasCom.
Es lag tatsächlich an diesen Werten. Grrrrrrr
Aber...
im Simulator brauchen die 1500ms bzw. 500ms gefühlte 2,5 bzw. 0,5 min.
Die Do-Loop-Schleife ist nicht notwendig, da der Zyklus nur einmal
durchlaufen werden soll.
> Die Do-Loop-Schleife ist nicht notwendig, da der Zyklus nur einmal> durchlaufen werden soll.
Dann mach an's Ende ein Do/Loop, ist guter Programmierstil, damit der µC
in einen definierten Zustand rein läuft.
Freut mich, daß es geht, ich muss gestehen, daß ich neugierig war wie
der Code sich auf einem echten Tiny15 verhält. Denn ich hab' mir den
erzeugten Assemblercode angesehen und Bascom bastelt ein paar PUSH/POP
beim Aufruf der Waits rein.
PUSH/POP sind Anweisungen, die auf den Stack zugreifen, einen Stack im
klassischen Sinn hat der Tiny15 aufgrund fehlenden SRams nicht und ihm
gehen deshalb auch diese Anweisungen im Befehlssatz ab, er läuft also in
ungültigen Opcode.
Aber scheinbar werden die dann als NOP gewertet und er geht einfach
drüber.
> im Simulator brauchen die 1500ms bzw. 500ms gefühlte 2,5 bzw. 0,5 min.
Das ist normal, im AVR Studio verhält es sich ähnlich.
Wenn Du simulieren willst, setz' ein $SIM an den Codeanfang, dann werden
die Verzögerungsschleifen leer gelassen. Nur im richtigen Code nicht
vergessen das $SIM wieder rauszunehmen.
Hast du die Schaltung so wie im Plan aufgebaut, und es funktioniert?
Denn einige Bauteilewerte sind ziemlich gewagt ...
(z.B. der Abblock-C mit 1nF, der 100nF haben sollte; auch der Widerstand
am Eingang der 5V kann je nach Stromaufnahme des Relais problematisch
werden)
Übrigens muss am Programm-Ende bei BASCOM keine Do-Loop Schleife stehen;
auch beim "End" wird eine Endlos-Schleife auf sich selbst generiert.
Auch werden Assembler-Inlines nicht immer 1:1 von BASCOM übernommen. Ich
hatte dort mal einen Assembler-Befehl mit einem ungültigen Register
verwendet, aber statt einer Fehlermeldung hatte BASCOM diesen Befehl
durch eine gültige ASM-Sequenz ersetzt ...
> hatte dort mal einen Assembler-Befehl mit einem ungültigen Register> verwendet, aber statt einer Fehlermeldung hatte BASCOM diesen Befehl> durch eine gültige ASM-Sequenz ersetzt ...
Das passiert bei Registern im extended IO, die z.B. per IN/OUT nicht
mehr erreicht werden können, die werden dann durch LDS/(ORI/ANDI)/STS
ersetzt. Hat aber einen Pferdefuß.
Das ist aber beim vorliegenden Tiny15 ganz sicher nicht von Belang.
> Übrigens muss am Programm-Ende bei BASCOM keine Do-Loop Schleife stehen;> auch beim "End" wird eine Endlos-Schleife auf sich selbst generiert.
Nun ja, End macht sogar noch mehr, es löscht auch das globale
Interruptflag. Wenn man also den Code beenden, aber noch Interrupts im
Hintergrund weiter laufen lassen möchte, so nimmt man doch besser
Do/Loop, da weis man was man hat :D
Wobei das aufgrund nicht vorhandener Interrupts natürlich hier auch
nicht wirklich wichtig ist...
AVRuser schrieb:> Hast du die Schaltung so wie im Plan aufgebaut, und es funktioniert?> Denn einige Bauteilewerte sind ziemlich gewagt ...> (z.B. der Abblock-C mit 1nF, der 100nF haben sollte; auch der Widerstand> am Eingang der 5V kann je nach Stromaufnahme des Relais problematisch> werden)
Gerade mit mySmartUSB light und myAVR ProgTool die bin-Datei auf den
Tiny15 geschoben und mit dem Board getestet. Zwar nur mit 4,5V, aber
dies liegt in der Spezifikation.
Das Relais schaltet ohne zu murren, aber es schaltet sofort und nicht
erst nach 1,5 Sekunden für 0,5 Sekunden. Wo liegt der Fehler?
Dachte erst, dass mein N-HexFet durch ist, aber ohne Tiny tut sich
nichts. ;-)
Also liegt es am Tiny selber. Habe ich High mit Low verwechselt?
10K pull down Widerstand gegen Masse an das Gate des MOSFET.
Sorgt dafür das der MOSFET sicher sperrt, wenn der AVR sich im
Reset befindet, wo die IO-Pins auf Eingang geschaltet sind und
das Gate des MOSFETs in der Luft "hängt".
> Also liegt es am Tiny selber. Habe ich High mit Low verwechselt?
Also Deine HW ist nicht so der Hit, das sind schon hässliche
Betriebsbedingungen für einen µC. Jedoch könnten hier die ungültigen
Opcodes ein Problem bereiten, Bascom ist da sicher nicht für den Tiny15
optimiert.
Nimm mal folgenden Code, getestet und garantiert frei von schädlichen
Opcodes :D
Ralf schrieb:> 10K pull down Widerstand gegen Masse an das Gate des MOSFET.> Sorgt dafür das der MOSFET sicher sperrt, wenn der AVR sich im> Reset befindet, wo die IO-Pins auf Eingang geschaltet sind und> das Gate des MOSFETs in der Luft "hängt".
Gut, habe faktisch zwischen Pin2 und Pin4 einen 10k eingesetzt zum Test.
Resultat: Die Schaltung macht gar nichts mehr. Dabei ist es egal ob ich
das letzte Programm von MWS nehme oder nicht.
Ohne 10k Widerstand schaltet das Relais sofort (egal welches Programm).
Rätsel über Rätsel. ????
Man steckt leider nicht im Tiny, um zu sehen was er macht. Grrrr
> Wobei wir wieder bei Assembler sind.... ;-)
War das Mittel der Wahl um auszuschließen daß es möglicherweise an der
SW scheitert. Wobei nach Lösung der HW Geschichte mich schon
interessiert, ob die erste, ausschließliche Basic Lösung auch geht.
Zur HW, ich denke nicht, daß die Versorgung des Tiny so ok ist, die
Spannung wird kurz einbrechen, sobald das Relais schaltet, das reicht
um "ungewöhnliche" Reaktionen zu erzeugen. Deshalb würde ich die µC
Stromversorgung vom Relais entkoppeln, also Diode von + nach 10µF
Kondensator parallel zu VCC/GND, und parallel auch noch'n 100nF dazu.
Modifizier' den Code so, daß Du ein Wechseln bekommst, also die
Geschichte in die Loop rein und dann messen, ob der Pinzustand an PB4
wechselt. Ohne Relais testen !
MWS schrieb:>> Wobei wir wieder bei Assembler sind.... ;-)>> War das Mittel der Wahl um auszuschließen daß es möglicherweise an der> SW scheitert. Wobei nach Lösung der HW Geschichte mich schon> interessiert, ob die erste, ausschließliche Basic Lösung auch geht.>> Zur HW, ich denke nicht, daß die Versorgung des Tiny so ok ist, die> Spannung wird kurz einbrechen, sobald das Relais schaltet, das reicht> um "ungewöhnliche" Reaktionen zu erzeugen. Deshalb würde ich die µC> Stromversorgung vom Relais entkoppeln, also Diode von + nach 10µF> Kondensator parallel zu VCC/GND, und parallel auch noch'n 100nF dazu.>> Modifizier' den Code so, daß Du ein Wechseln bekommst, also die> Geschichte in die Loop rein und dann messen, ob der Pinzustand an PB4> wechselt. Ohne Relais testen !
Das Relais zieht max. 250mA, aber doch erst nach 1,5 Sekunden und nicht
vorher. Der Witz ist ja, der Tiny scheint sich selber nur als
Stromleitung zu sehen.
Es darf doch nicht sein, dass ein µC beim Einschalten alle Ausgänge auf
High setzt. Da wären schnell alle Computer hinüber.
Axel L. schrieb:> Es darf doch nicht sein, dass ein µC beim Einschalten alle Ausgänge auf> High setzt.
Das macht er ja normalerweise auch nicht. Woher nimmst Du diese Aussage?
Hast Du zum Test LEDs (natürlich mit Vorwiderständen) an die Portpins
angeschlossen?
Oder hast Du Die Ports mit einem Logiktester, Oszilloskop oder
Logik-Analyzer beobachtet?
Wenn man im Schaltungsdesign und der Programmierung Anfänger ist (was
ja jeder von uns einmal war), dann begnügt man sich erstmal mit LEDs an
den Ausgängen, deren Vorwiderstände so dimensioniert sind, dass die
Ströme unter dem erlaubten Limit bleiben.
> Da wären schnell alle Computer hinüber.
Wie soll ich diese Aussage verstehen?
Was haben Computer mit einem falsch programmierten, falsch beschalteten
oder durch vorherige Falschprogrammierung oder Falschbeschaltung
beschädigten Mikrocontroller zu tun?
Und ja, die Dinger gehen auch mal kaputt, wenn man ihnen zuviel zumutet.
MfG, Consulter
> sicher dass die schaltung mit 1,6mhz läuft? Zähl mal die nullen im> Bascom Programm.
Nö, Millihertz sicher nicht ;-) 5 Nullen, entsprechend: 1.600.000
Der letzt Code verwendet ein eigenes Delay, da wäre es völlig egal
welchen Wert man reinschreibt.
Axel:
> Es darf doch nicht sein, dass ein µC beim Einschalten alle Ausgänge auf> High setzt. Da wären schnell alle Computer hinüber.
Tut er ja auch nicht, von selber setzt der gar keine Leitungen auf High,
laut Simulator auch nicht. Aber ich ahne da was, probier folgendes:
@MWS: Danke für Deine Mühe. Habe aber nun folgendes Unternommen:
Meine bisherigen Versuche wurden mit einem Primitivnetzteil unternommen.
Ich habe es im Verdacht für die sofortige Relais-Schaltung
verantwortlich zu sein. Daher bin vom Netzteil auf Batterie (4,5V), wie
es später ungefähr sein soll, gewechselt.
Auch habe ich mich mal im Assembler versucht und dies hier ist dabei
herausgekommen:
-----------------------------------
.equ F_CPU= 1600000
.include "tn15def.inc"
.CSEG
.ORG 0x0000
rjmp Part1 ; POWER ON RESET
reti ; IRQ0 handler
reti ; Pin change handler
reti ; Timer1 Compare Match
reti ; Timer1 overflow handler
reti ; Timer0 overflow handler
reti ; EEPROM ready handler
reti ; Analog Comperator handler
reti ; ADC Conversion handler
Part1:
; Spannung an PB anlegen.
ldi r16, 0xFF
out DDRB, r16 ; PORTB configured for output
ldi r16, 0xFF
out PORTB, r16 ; LEDs ausschalten
Part2:
; Warten für 1500ms ca. 1500000 Zyklen
ldi R17, $08
WGLOOP0: ldi R18, $F8
WGLOOP1: ldi R19, $FB
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
Part3:
; Spannung auf Pin2 (PB4) für 500ms ca. 500000 Zyklen
sbi PORTB, 4
ldi R17, $0F
WGLOOP3: ldi R18, $37
WGLOOP4: ldi R19, $C9
WGLOOP5: dec R19
brne WGLOOP5
dec R18
brne WGLOOP4
dec R17
brne WGLOOP3
cbi PORTB, 4
ende:
rjmp ende
----------------------------
Resultat: Nichts! Es tut sich nichts.
Da das Auslesen und Schreiben auf den ATtiny15 klappte, muss die Ursache
woanders liegen. VCC und GND haben Kontakt. Kann es sein, das der Takt
wesentlich niedriger ist als angenommen?
Axel L. schrieb:> ldi r16, 0xFF> out DDRB, r16 ; PORTB configured for output
Richtig...
> ldi r16, 0xFF> out PORTB, r16 ; LEDs ausschalten
Falsch, wenn die LEDs gegen GND angeschlossen sind, was die folgenden
Zeilen vermuten lassen, denn 0xff schaltet alle Ports auf H-Pegel....
> Part3:> ; Spannung auf Pin2 (PB4) für 500ms ca. 500000 Zyklen> sbi PORTB, 4> cbi PORTB, 4> Resultat: Nichts! Es tut sich nichts.> Da das Auslesen und Schreiben auf den ATtiny15 klappte, muss die Ursache> woanders liegen. VCC und GND haben Kontakt. Kann es sein, das der Takt> wesentlich niedriger ist als angenommen?
Ja, weil die Kalibration fehlt. Je nach Exemplar kann der Takt
unkalibriert etwa von 800 kHz bis 1,5 MHz betragen. Das ist aber nicht
die Ursache, damit müsste es trotzdem gehen.
MfG, Consulter
Kluchscheißender Consulter schrieb:> Axel L. schrieb:>>> ldi r16, 0xFF>> out PORTB, r16 ; LEDs ausschalten>> Falsch, wenn die LEDs gegen GND angeschlossen sind, was die folgenden> Zeilen vermuten lassen, denn 0xff schaltet alle Ports auf H-Pegel....
Kleiner Schreibfehler. Muss eher Schalttransistor heißen, wobei die
Source gegen GND angeschlossen ist.
Kluchscheißender Consulter schrieb:>> Ja, weil die Kalibration fehlt. Je nach Exemplar kann der Takt> unkalibriert etwa von 800 kHz bis 1,5 MHz betragen. Das ist aber nicht> die Ursache, damit müsste es trotzdem gehen.
Und wie lässt sich diese Kalibration einbinden?
Kuckst Du :D
Untenstehenden Code hab' ich als Tiny15 compiliert und in einen Tiny25
(hab' keinen Tiny15 hier) geschrieben. Das geht, weil die relevanten
Register dieselbe Adresse im IO haben und auch keine Interrupts benutzt
werden.
Code funktioniert wie gewünscht, hier das Schalten in einer
Endlosschleife zum Testen. Auch hab' ich die RCALLs raus genommen.
Der Code ist im übrigen mit dem für einen Tiny25 erzeugten Code exakt
gleich.
Schau mal auch in Deiner Bascom Version nach, ob Du unter
Compiler->Optionen->Output einen Haken in "Swap words" drin hast. Bei
meinem Programmer (STK500) darf keiner drin sein, denn sonst ist das
Hexfile unbrauchbar. Wie es sich mit myAVR ProgTool verhält, kann ich
nicht sagen, mach' mal probehalber einen Haken rein, wenn keiner drin
ist.
Angehängt auch noch das erzeugte Hexfile.
Da wohl mein MOSFET beschlossen hatte sich zu verabschieden habe ich den
IRF 3205 TO220 IR eingesetzt, aber es tut sich nach wie vor nichts.
Den Tiny kann ich ohne Probleme mit mySmartUSB auslesen und die
bin-Dateien aus BasCom sowie die hex-Datein aus Studio4 brennen.
Ich habe an Pin 8 4,5V und GND an Pin 4. An Pin 2 ist der erste Pin des
TO220 (Gate) angeschlossen. Zweiter Pin des TO220 ist ans Relais und
dritter wiederum an GND angeschlossen.
Ich glaube, so langsam lasse es mit den µC und werde mich mal umschauen,
wo man so etwas in Auftrag geben kann. Falls jemand eine Gute Adresse
kennt, werde dankbar.
Axel L. schrieb:> Da wohl mein MOSFET beschlossen hatte sich zu verabschieden habe ich den> IRF 3205 TO220 IR eingesetzt, aber es tut sich nach wie vor nichts.> Den Tiny kann ich ohne Probleme mit mySmartUSB auslesen und die> bin-Dateien aus BasCom sowie die hex-Datein aus Studio4 brennen.> Ich habe an Pin 8 4,5V und GND an Pin 4. An Pin 2 ist der erste Pin des> TO220 (Gate) angeschlossen.
Warum testest Du nicht erstmal mit LEDs? Der FET als Relaistreiber ist
doch beim Debuggen der Software eine zusätzliche Unsicherheit. Darum
kannst Du Dich kümmern, wenn die Software zuverlässig läuft.
> Zweiter Pin des TO220 ist ans Relais und> dritter wiederum an GND angeschlossen.
Hast Du einen Widerstand (10k bis 20k) zwischen Gate und Source?
Wenn nicht, kann der FET bei hochohmigem AVR-Pin (während des
Programmierens) floaten.
Hast Du eine Freilaufdiode parallel zur Relais-Spule?
Wenn nicht, dann zerstört die Selbstinduktionsspannung der Relaisspule
den FET bereits beim ersten Ausschalten.
> Ich glaube, so langsam lasse es mit den µC und werde mich mal umschauen,> wo man so etwas in Auftrag geben kann. Falls jemand eine Gute Adresse> kennt, werde dankbar.
MfG
> Den Tiny kann ich ohne Probleme mit mySmartUSB auslesen und die> bin-Dateien aus BasCom sowie die hex-Datein aus Studio4 brennen.
Mit der Option "Swap words" wird LSB und MSB im bin/hex vertauscht, wenn
diese Einstellung nicht stimmt, dann sind die erzeugten Files für den µC
völlig unbrauchbar.
Diese unbrauchbaren Files lassen sich aber trotzdem flashen, egal mit
welchem Programm. Entscheidend ist hier nur die Firmware des Programmers
und in welcher Reihenfolge der die Bytes des Files in den µC schreibt.
Manche Programmer benötigen gerade diesen Austausch, ob Dein myAVR
ProgTool dazugehört, kann ich nicht sagen, das lässt sich aber von Dir
leicht rausfinden, mach' 'nen Haken dort rein, wenn keiner drin ist. Ich
habe für den STK500 ohne diese Option compiliert.
Der IRF3205 kann lt. DB bis zu 4V Gate Threshold Voltage haben, das ist
nicht optimal, der vorherige Typ war besser. Hast Du kein Messgerät, mit
dem Du ein kurzzeitiges Ansteigen der Spannung am Pin2 messsen kannst ?
Kluchscheißender Consulter schrieb:> Hast Du einen Widerstand (10k bis 20k) zwischen Gate und Source?> Wenn nicht, kann der FET bei hochohmigem AVR-Pin (während des> Programmierens) floaten.
Habe eine 10k Widerstand zwischen Gate (1. Kontakt am TO220) und Source
(3. Kontakt am TO220).
>> Hast Du eine Freilaufdiode parallel zur Relais-Spule?> Wenn nicht, dann zerstört die Selbstinduktionsspannung der Relaisspule> den FET bereits beim ersten Ausschalten.
Gleich zwei Stück. Eine befindet sich im Reed-Relais (COMUS) und zweite
habe ich parallel zur ersten Diode und der Spule (zwischen Pin2 & Pin6
des DIL14) angebracht.
Der Witz: Ich habe mal den Tiny aus seinem Sockel genommen und jedesmal,
wenn ich die Sockelkontakte 2(zur Gate) und 8(VCC) kurz schließe,
schaltet das Relais. Dies Kurzschließen sollte doch eigentlich der µC
machen, oder?
Ja schon.
Häng aber trotzdem erst mal eine LED an.
Mit der testet es sich viel angenehmer.
Dein erstes Testprogramm könnte sein:
Port Pin mit der LED auf Ausgang konfigurieren. LED einschalten.
Dein nächstes Testprogramm
Selbiges wie oben, nur diesmal LED ausschalten
Damit kannst du unabhängig von irgendwelchen Rundherum Hardwareproblemen
festellen, ob dein µC überhaupt arbeitet.
Karl heinz Buchegger schrieb:> Ja schon.> Häng aber trotzdem erst mal eine LED an.> Mit der testet es sich viel angenehmer.
Habe ich gemacht. An Pin5 (PB0) eine LED und 1k Widerstand.
> Dein erstes Testprogramm könnte sein:> Port Pin mit der LED auf Ausgang konfigurieren. LED einschalten.
Habe diesen Code auf den µC gebrannt.
1
.equ F_CPU= 1600000
2
.include "tn15def.inc"
3
4
; Spannung an PB anlegen.
5
ldi r16, 0xFF
6
out DDRB, r16 ; PORTB configured for output
7
ldi r16, 0xFF
8
out PORTB, r16 ; ausschalten
9
10
; LED an Pin 5 (PB0) einschalten
11
sbi PORTB, 0
Null Reaktion. LED leuchtet, wenn ich Pin8 & Pin5 am Sockel
kurzschließe.
Auch wenn ich jetzt vielleicht in ein Fettnäpfchen treten sollte ...
wäre es nicht, wie am Anfang von dem Thread schon mal genannt, einfach
besser für diesen Zweck einen Tiny13 zu nehmen?
Für's erste wären die Probleme beim Einsatz von BASCOM behoben und man
könnte sich in Ruhe auf das Schaltungslayout stürzen.
Elektronix schrieb:> Auch wenn ich jetzt vielleicht in ein Fettnäpfchen treten sollte ...> wäre es nicht, wie am Anfang von dem Thread schon mal genannt, einfach> besser für diesen Zweck einen Tiny13 zu nehmen?> Für's erste wären die Probleme beim Einsatz von BASCOM behoben und man> könnte sich in Ruhe auf das Schaltungslayout stürzen.
War heute bei Conrad und habe mir zwei Tiny13 besorgt.
Folgendes Programm habe ich mit BasCom geschrieben und gebrannt.
1
$regfile = "attiny13.dat"
2
$crystal = 1170000
3
$hwstack = 16
4
$swstack = 0
5
$framesize = 24
6
7
'Relais an PB3(Pin2) und LED an PB0(Pin5)
8
Config Portb.3 = Output
9
Config Portb.0 = Output
10
11
'LED Ein (HIGH)
12
Portb.0 = 1
13
14
'Warte 1500 ms
15
Waitms 1500
16
17
'LED Aus (Low)
18
Portb.0 = 0
19
20
'Relais Ein (HIGH)
21
Portb.3 = 1
22
23
'Warte 500 ms
24
Waitms 500
25
26
'LED Ein (HIGH)
27
Portb.0 = 1
28
29
'Relais Aus (Low)
30
Portb.3 = 0
31
32
End
Meine Schaltung Klappt, juhu!!
Beim ersten Versuch bin ich von 9,6Mhz ausgegangen, aber Messungen
ergaben für die 1,5sec ganze 12,3Sec. Dann habe ich den Wert auf 1,17Mhz
reduziert und nun werden die Zeiten eingehalten. Läuft wunderbar.
Ein großes Danke an alle Helfenden. ;-)
Also ich hätte schon gerne wissen wollen, warum der Tiny15 nicht ging.
Daß es prinzipiell geht, war sowieso klar, aber das Forum inklusive
meiner einer hat sich an der Diskussion beteiligt, weil wir den Fehler
finden wollten.
Mit einem Tiny13 geht's natürlich auch, genauso eben wie's mit einem
Tiny15 gegangen wäre, die Aufgabe ist für diese Bausteine völlig
anspruchslos.
Jetzt nicht zu wissen was der Fehler war, ist irgendwie
unbefriedigend...
Hast Du zum Schluss wenigstens den 10k Widerstand von VCC auf Reset dran
gemacht ?
MWS schrieb:> Also ich hätte schon gerne wissen wollen, warum der Tiny15 nicht ging.>> Daß es prinzipiell geht, war sowieso klar, aber das Forum inklusive> meiner einer hat sich an der Diskussion beteiligt, weil wir den Fehler> finden wollten.>> Mit einem Tiny13 geht's natürlich auch, genauso eben wie's mit einem> Tiny15 gegangen wäre, die Aufgabe ist für diese Bausteine völlig> anspruchslos.>> Jetzt nicht zu wissen was der Fehler war, ist irgendwie> unbefriedigend...>> Hast Du zum Schluss wenigstens den 10k Widerstand von VCC auf Reset dran> gemacht ?
Zwischen Gate und Source ist ein 10k Widerstand. Das war ein sehr
sinnvoller Tipp. Ich habe mal meine Platine an diese Antwort gehängt.
Ok, nicht gerade professionell, aber für mich reicht es völlig.
Warum der ATtiny15L nicht ging, trotz fehlerfreiem Auslesen/Brennen, ist
mir auch rätselhaft. Denn Tiny13 habe ich gebrannt, auf die Platine
gesteckt und er lief. Der Tiny15 ging sofort in die Ablage M.
Interessant finde ich auch, dass man zum Preis von einem Tiny15 zwei
Tiny13 bekommt.
> Zwischen Gate und Source ist ein 10k Widerstand.
Das ist zwar auch sinnvoll, aber mein Vorschlag war beim Tiny15 zwischen
VCC und RESET-Pin (PB5, Pin 1) einen 10k zu setzen, denn möglicherweise
befand sich der Tiny15 laufend im Reset, das würde das Betriebsverhalten
erklären, gleichwohl er sich programmieren ließ.
Beim Programmieren zieht der Programmer den RESET Pin auf Low, der muss
aber im laufenden Betrieb auf High liegen.
> Interessant finde ich auch, dass man zum Preis von einem Tiny15 zwei> Tiny13 bekommt.
Der Tiny15, wie auch der Tiny25 haben als Besonderheit eine High Speed
PLL, die mit 25.6MHz, resp. 64MHz läuft, damit sind sehr schnelle PWMs
möglich. Diese Eigenschaft hat der Tiny13 nicht, da Du die aber auch
nicht brauchst, wäre der Tiny13 von Haus aus die bessere Wahl gewesen.
Aber dennoch, der Tiny15 hätte ganz definnitiv laufen müssen.
Der code funzt auf dem tiny15.
Da ich blutiger Anfänger bin habe ich das in bascom reingesteckt, und
das hex file über ponyprog über einen paralleladapter den ich hier
gefunden habe:
http://www.dieelektronikerseite.de/uC%20Ecke/Lections/SPI-Kabel%20-%202%20Welten%20treffen%20aufeinander.htm
aufgespielt.
Das einzige Problem ist: die Zeiten sind viel länger als 1.5 s. Ich habe
dann mit anderen Werten experimentiert und mal gestoppt, 2000 ergibt
eine Zeit von 4s und 4000ms ergibt ganze 14 s in der Realität.
Allerdings muß ich dazusagen, daß ich die ersten Zeilen aus dem Basic
code gelöscht habe, weil mir nicht klar war, warum ich die interne
Taktfrequenz des tiny15 verändern soll.
folgender code funzt definitiv auf dem tiny15
$regfile = "ATtiny15.DAT"
$tiny
$noramclear
$hwstack = 0
$swstack = 0
$framesize = 0
'Relais an PB4
Config Portb.4 = Output
Do
'Warte 1500 ms
Waitms 4000
'Relais Ein (HIGH)
Portb.4 = 1
'Warte 500 ms
Waitms 2000
'Relais Aus (Low)
Portb.4 = 0
Loop
End