Forum: Mikrocontroller und Digitale Elektronik Tiny15 zur Relaissteuerung


von Axel L. (ligonap)


Angehängte Dateien:

Lesenswert?

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

von Elektronix (Gast)


Lesenswert?

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.

von ja (Gast)


Lesenswert?

..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...!

von MaWin (Gast)


Lesenswert?


von Falk B. (falk)


Lesenswert?


von Axel L. (ligonap)


Lesenswert?

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).

von Axel L. (ligonap)


Lesenswert?

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.

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

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

von Elektronix (Gast)


Lesenswert?

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.

von Ralf2008 (Gast)


Lesenswert?

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

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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.

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Prima!!!

Wieder was gelernt (was ich wohl selbst nie brauchen werde).

MfG, Consulter

von MWS (Gast)


Lesenswert?

> 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
1
Dim A As Iram Byte

oder für ein definiertes Register, hier R15:
1
Dim A As Iram Byte At 15

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Danke....

von Axel L. (ligonap)


Lesenswert?

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.

von MWS (Gast)


Lesenswert?

> 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.

von AVRuser (Gast)


Lesenswert?

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 ...

von MWS (Gast)


Lesenswert?

> 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...

von Axel L. (ligonap)


Lesenswert?

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?

von Ralf (Gast)


Lesenswert?

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".

von MWS (Gast)


Lesenswert?

> 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
1
$regfile = "ATtiny15.DAT"
2
$crystal = 1600000
3
$tiny
4
$noramclear
5
$hwstack = 0
6
$swstack = 0
7
$framesize = 0
8
9
Const L1_Preset = 253
10
Const L2_Preset = 210
11
12
Const Preset_01s = 1                                        ' 0,1s
13
Const Preset_05s = 5                                        ' 0,5s
14
Const Preset_15s = 15                                       ' 1,5s
15
16
Loop_1_Ctr Alias R16
17
Loop_2_Ctr Alias R17
18
Loop_3_Ctr Alias R18
19
20
'Relais an PB4
21
Config Portb.4 = Output
22
23
'Warte 1500 ms
24
  !LDI     Loop_3_Ctr, Preset_15s                           ' Preset = 15 entspricht ca. 1,5 Sekunden
25
  !RCALL   ASM_Delay
26
27
'Relais Ein (HIGH)
28
Portb.4 = 1
29
30
'Warte 500 ms
31
  !LDI     Loop_3_Ctr, Preset_05s                           ' Preset = 5 entspricht ca. 0,5 Sekunden
32
  !RCALL   ASM_Delay
33
34
    'Relais Aus (Low)
35
Portb.4 = 0
36
37
Do
38
Loop
39
40
ASM_Delay:
41
Lbl_Loop_3:
42
  !LDI     Loop_2_Ctr, L2_Preset
43
Lbl_Loop_2:
44
  !LDI     Loop_1_Ctr, L1_Preset
45
Lbl_Loop_1:
46
  !DEC     Loop_1_Ctr
47
  !BRNE    Lbl_Loop_1
48
  !DEC     Loop_2_Ctr
49
  !BRNE    Lbl_Loop_2
50
  !DEC     Loop_3_Ctr
51
  !BRNE    Lbl_Loop_3
52
  !RET
53
54
End

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Wobei wir wieder bei Assembler sind.... ;-)

von Axel L. (ligonap)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

> 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 !

von martin (Gast)


Lesenswert?

sicher dass die schaltung mit 1,6mhz läuft? Zähl mal die nullen im 
Bascom Programm.

von Axel L. (ligonap)


Lesenswert?

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.

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

> 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:
1
$regfile = "ATtiny15.DAT"
2
$crystal = 1600000
3
$tiny
4
$noramclear
5
$hwstack = 0
6
$swstack = 0
7
$framesize = 0
8
9
Const L1_Preset = 253
10
Const L2_Preset = 210
11
12
Const Preset_01s = 1                                        ' 0,1s
13
Const Preset_05s = 5                                        ' 0,5s
14
Const Preset_15s = 15                                       ' 1,5s
15
16
Loop_1_Ctr Alias R16
17
Loop_2_Ctr Alias R17
18
Loop_3_Ctr Alias R18
19
20
dim A as Iram Byte at 20
21
22
  !WDR
23
  !LDI   R16,         2^WDTOE + 2^WDE
24
  !LDI   R17,         2^WDTOE
25
  !OUT   WDTCR,       R16
26
  !OUT   WDTCR,       R17
27
28
'Relais an PB4
29
Config Portb.4 = Output
30
31
A = 10
32
33
'Warte 1500 ms
34
  !LDI     Loop_3_Ctr, Preset_15s                           ' Preset = 15 entspricht ca. 1,5 Sekunden
35
  !RCALL   ASM_Delay
36
37
'Relais Ein (HIGH)
38
Portb.4 = 1
39
40
'Warte 500 ms
41
  !LDI     Loop_3_Ctr, Preset_05s                           ' Preset = 15 entspricht ca. 1,5 Sekunden
42
  !RCALL   ASM_Delay
43
44
    'Relais Aus (Low)
45
Portb.4 = 0
46
Do
47
Loop
48
49
ASM_Delay:
50
Lbl_Loop_3:
51
  !LDI     Loop_2_Ctr, L2_Preset
52
Lbl_Loop_2:
53
  !LDI     Loop_1_Ctr, L1_Preset
54
Lbl_Loop_1:
55
  !DEC     Loop_1_Ctr
56
  !BRNE    Lbl_Loop_1
57
  !DEC     Loop_2_Ctr
58
  !BRNE    Lbl_Loop_2
59
  !DEC     Loop_3_Ctr
60
  !BRNE    Lbl_Loop_3
61
  !RET
62
63
End

von Axel L. (ligonap)


Lesenswert?

@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?

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

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

von Axel L. (ligonap)


Lesenswert?

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?

von Ralf (Gast)


Lesenswert?

Das Kalibrationsbyte (z.B. 0x6F) mit dem Programmer auslesen
und in das OSCCAL-Register schreiben.

z.B.:
1
ldi r16,0x6F
2
out osccal,r16

Oder in den Flash o. das EEPROM schreiben und dort auslesen.
Das ist aber wie schon erwähnt nicht das Problem (oder die Lösung) ...

von MWS (Gast)


Angehängte Dateien:

Lesenswert?

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.
1
$regfile = "ATtiny15.DAT"
2
$crystal = 1600000
3
$tiny
4
$noramclear
5
$hwstack = 0
6
$swstack = 0
7
$framesize = 0
8
9
Const L1_Preset = 253
10
Const L2_Preset = 210
11
12
Const Preset_01s = 1                                        ' 0,1s
13
Const Preset_05s = 5                                        ' 0,5s
14
Const Preset_15s = 15                                       ' 1,5s
15
16
Loop_1_Ctr Alias R16
17
Loop_2_Ctr Alias R17
18
Loop_3_Ctr Alias R18
19
20
  !WDR
21
  !LDI   R16,         2^WDTOE + 2^WDE
22
  !LDI   R17,         2^WDTOE
23
  !OUT   WDTCR,       R16
24
  !OUT   WDTCR,       R17
25
26
'Relais an PB4
27
Config Portb.4 = Output
28
29
Do
30
'Warte 1500 ms
31
  !LDI     Loop_3_Ctr, Preset_15s                           ' Preset = 15 entspricht ca. 1,5 Sekunden
32
Lbl_loop_3_1:
33
  !LDI     Loop_2_Ctr, L2_Preset
34
Lbl_loop_2_1:
35
  !LDI     Loop_1_Ctr, L1_Preset
36
Lbl_loop_1_1:
37
  !DEC     Loop_1_Ctr
38
  !BRNE    Lbl_Loop_1_1
39
  !DEC     Loop_2_Ctr
40
  !BRNE    Lbl_Loop_2_1
41
  !DEC     Loop_3_Ctr
42
  !BRNE    Lbl_Loop_3_1
43
44
'Relais Ein (HIGH)
45
Portb.4 = 1
46
47
'Warte 500 ms
48
  !LDI     Loop_3_Ctr, Preset_05s                           ' Preset = 15 entspricht ca. 1,5 Sekunden
49
Lbl_loop_3_2:
50
  !LDI     Loop_2_Ctr, L2_Preset
51
Lbl_loop_2_2:
52
  !LDI     Loop_1_Ctr, L1_Preset
53
Lbl_loop_1_2:
54
  !DEC     Loop_1_Ctr
55
  !BRNE    Lbl_Loop_1_2
56
  !DEC     Loop_2_Ctr
57
  !BRNE    Lbl_Loop_2_2
58
  !DEC     Loop_3_Ctr
59
  !BRNE    Lbl_Loop_3_2
60
61
    'Relais Aus (Low)
62
Portb.4 = 0
63
Loop
64
65
End

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Axel L. schrieb:

> Und wie lässt sich diese Kalibration einbinden?

Bitte schau auch mal ins Datenblatt des Controllers. Und auch mal bei 
Atmel nach einschlägigen AppNotes. Die AppNote AVR053 behandelt z.B. das 
Thema Oszillator & Calibration. Die AppNotes findest Du hier:
http://www.atmel.com/dyn/products/app_notes_v2.asp?family_id=607

Desweiteren ist das Thema Calibration hier im Forum schon einigemale 
recht umfassend diskutiert worden. Vielleicht solltest Du Dich mal mit 
der Suchfunktion befassen.
http://www.mikrocontroller.net/search?query=calibration+tiny15&forums%5B%5D=1&forums%5B%5D=19&forums%5B%5D=9&forums%5B%5D=10&forums%5B%5D=2&forums%5B%5D=4&forums%5B%5D=3&forums%5B%5D=6&forums%5B%5D=17&forums%5B%5D=11&forums%5B%5D=8&forums%5B%5D=14&forums%5B%5D=12&forums%5B%5D=7&forums%5B%5D=5&forums%5B%5D=18&forums%5B%5D=15&forums%5B%5D=13&forums%5B%5D=16&max_age=-&sort_by_date=0

MfG

von Axel L. (ligonap)


Lesenswert?

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.

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

> 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 ?

von Axel L. (ligonap)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Axel L. (ligonap)


Lesenswert?

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.

von MWS (Gast)


Lesenswert?

Mach' mal 'nen 10k von Pin 1 auf Pin 8 rein, möglicherweise kommt der µC 
nicht aus dem Reset.

von Elektronix (Gast)


Lesenswert?

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.

von Axel L. (ligonap)


Lesenswert?

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. ;-)

von MWS (Gast)


Lesenswert?

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 ?

von Axel L. (ligonap)


Angehängte Dateien:

Lesenswert?

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.

von MWS (Gast)


Lesenswert?

> 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.

von conquistador (Gast)


Lesenswert?

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

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.