Forum: Mikrocontroller und Digitale Elektronik Attiny13 Schalter


von Caesar (Gast)


Lesenswert?

Hallo!
Baue gerade eine Schaltung, bei der mit einem Taster jeweils eines von 3 
Geräten eingeschaltet werden soll (Option #4: alle sind aus). Ich möchte 
dazu einen Attiny13 verwenden. Ausserdem soll der übrige Port ein 1Hz 
Signal ausgeben (für eine Blinkled).
Ich habe es schon geschafft, mit Bascom über einen Taster eine LED 
ein/auszuschalten. Dabei habe ich den Taster mit 100nf entprellt...
Ich hatte mir sowas vorgestellt:

;                   ATMEL ATtiny13
;                     __   __
;            _    1/ |   |_|    |8
;+5 Volt O--|___|----|Res    Vcc|----O + 5 Volt
;                    |          |
;  Gnd 0-|<|--|___|--|PB3    PB2|--|___|--|>|--O Gnd
;                /  3|          |6  _   LED3
;     0 Volt O--O O--|PB4    PB1|--|___|--|>|--O Gnd
;                   4|          |   330   LED1
;        0 Volt O----|Gnd    PB0|--|___|--|>|--O Gnd
;                    |__________|5        LED2
;
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 32
$swstack = 10
$framesize = 40

Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output

Portb.0 = 0
Portb.1 = 0
Portb.2 = 0

Do
If Pind.4 = 1 Then

  Toggle Portd.0
  Bitwait Pind.4 , Reset

  End If
Loop
End

Aber jetzt weiss ich nicht mehr weiter. Ich habe keine Ahnung vom 
Programmieren. Brauche ich dafür eine Variable.die sich ändert und eine 
verkettung von If-Abfragen?

von ?????????? (Gast)


Lesenswert?

was hast du vor ???

was fürn portd beim tiny13?

von Karl (Gast)


Lesenswert?

Jep, da versteht man nur Bahnhof. Du musst auch mal etwas als Eingang 
konfigurieren:

Config Pinx.y=Input
Portx.y=1

"D" gibt es nicht beim Attiny13, wundert mich, dass überhaupt etwas 
funktioniert.

Welche Geräte willst Du einschalten? LEDs?

Etwas mehr Beschreibung bitte!

von Kevin (Gast)


Lesenswert?

>Hallo!

>Bla, bla, bla, bla
>Bla, bla, bla, bla
>Bla, bla, bla, bla

>Ich habe keine Ahnung vom Programmieren.

Gefällt mir, ich hole schnell mal Popcorn. :)

von grunz (Gast)


Lesenswert?

Caesar schrieb:
> Ich habe es schon geschafft, mit Bascom über einen Taster eine LED

Aber nicht mit dem geposteten Programm. Läst sich nicht mal kompilieren


?????????? schrieb:
> was fürn portd beim tiny13?

Frag ich mich auch.


Karl schrieb:
> Du musst auch mal etwas als Eingang
> konfigurieren:

Alle Pins sind standartmäßig Inputs.


Kevin schrieb:
> Gefällt mir, ich hole schnell mal Popcorn. :)

Ich jetzt auch.

von Pflaumenkuchenauflauf (Gast)


Lesenswert?

Ich würd ja an deiner Stelle versuchen die Bomben mit einer Lunte zu 
zünden.

Beim Attiny13 bin ich mir nicht so ganz sicher. Es könnte nach hinten 
losgehen.

solltest du es dennoch versuchen probier mal das hier:

$regfile = "attiny13.dat"
$crystal = 8000000

Dim A As Byte


Config Portb.0 = Input
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output


Do
Debounce Pinb.0 , 1 , Los , Sub

Loop

Los:
A = A + 1

If A = 1 Then
Portb.1 = 1
Else
Portb.1 = 0
End If

If A = 2 Then
Portb.2 = 1
Else
Portb.2 = 0
End If

If A = 3 Then
Portb.3 = 1
Else
Portb.3 = 0
End If

If A = 4 Then
Portb = 0
A = 0
End If


Return

von grunz (Gast)


Lesenswert?

Pflaumenkuchenauflauf schrieb:
> $crystal = 8000000
Der interne Oszillator läuft nicht mit 8MHz sondern mit 9,6 oder 4,8 MHz

Pflaumenkuchenauflauf schrieb:
> Config Portb.0 = Input
Warum Portb.0? Taster soll doch auf Portb.4 sein?

Wenn Config Portb.0 = Input, dann auch A mit 0 initialisieren ( A = 0 ) 
und internen Pullup am Tasterport einschalten.

Ich werd auch 50 mal Standard schreiben

von Pflaumenkuchenauflauf (Gast)


Lesenswert?

recht hast du!

Da hab ich nicht richtig hingesehen.

Alle wege führen ja bekanntermaßen nach Rom. Und meiner nach sonstwohin.

Hab das von einem Tiny24 "angepasst" und reingesetzt.

von grunz (Gast)


Lesenswert?

@Pflaumenkuchenauflauf
Ich finde es sehr nett, daß du versuchst dem Caesar zu einem lauffähigen 
Programm zu verhelfen und niemand ist fehlerfrei.

Ich finde nur, daß er wenigstens einen kompilierbaren Code einstellen 
sollte und nicht den Eindruck erweckt, als würde sein Aufbau 
funktionieren. Wenn er beim Kompilieren Probleme hat, sollte seine Frage 
zunächst darauf bezogen sein.

von Karl (Gast)


Lesenswert?

grunz schrieb:
> Alle Pins sind standartmäßig Inputs.

Schlaumeier. Nicht in seinem Programm.

Was soll's. Caesar fragt bestimmt schon anderswo...

von grunz (Gast)


Lesenswert?

Karl schrieb:
> grunz schrieb:
>> Alle Pins sind standartmäßig Inputs.
>
> Schlaumeier. Nicht in seinem Programm.

Nach Einschalten vom Tiny13 ist das DDRB Register mit Nullen 
initialisiert, was Konfiguration der Pins als Input bedeutet. Vielleicht 
wäre Default statt Standard das bessere Wort dafür? (initial value laut 
Datenblatt)

In Caesars Programm wird wird PB4 weder als Ausgang noch als Eingang 
konfiguriert, also das DDRB Register für PB4 nicht geändert. Bleibt also 
ein Input. Das MUSS man nicht nochmal als Input konfigurieren weil es 
schon einer ist, kann man aber für die Übersichtlichkeit des Programms 
machen. War jedenfalls nicht das Problem in seinem Programm.

von Karl (Gast)


Lesenswert?

Caesar schrieb:
> If Pind.4 = 1 Then

Der Witz war ja, dass er Pind.4 als Input konfiguriert hat. Von Pinb.4 
hat er nichts geschrieben.

von grunz (Gast)


Lesenswert?

Karl schrieb:
> Caesar schrieb:
>> If Pind.4 = 1 Then
>
> Der Witz war ja, dass er Pind.4 als Input konfiguriert hat. Von Pinb.4
> hat er nichts geschrieben.

Mit "If Pind.4 = 1 Then" wird der Zustand des PD4 abgefragt und nicht 
konfiguriert. Das es PD4 auf dem Tiny13 nicht gibt, hat ????????? vor 
dir schon bemerkt.

Aus der Zeichnung ist ersichtlich, das der Taster an Pinb.4 hängt.

von Caesar (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank für die netten Ratschläge und jap grunz, ich hatte wirklich 
gehofft auf lauffähigen Code!
Danke Pflaumenkuchenauflauf für den Versuch und den Ratschlag, aber ich 
baue seit vielen Jahren keine Bomben mehr =)Aber wenn ich damals 
Microcontroller gehabt hätte... ich musste auch dran denken, 
jejeejejej!!! Jaja, damals das Unkaut-Ex... das war manchmal wirklich 
knapp! Gott sei Dank ist nichts passiert!
Ich baue eine Stoppuhr für Physikexperimente und das Programm hatte ich 
eingeplant, um das Signal vom Quarzoszillator, das in mehreren Stufen 
geteilt wird, an verschiedenen Stellen abzugreifen. Ich habe die 
Schaltung in CMOS aufgebaut-nein, das ist keine neue Programmiersprache 
;)
Ich habe jetzt einen weiteren 4017 (so ein IC für ein 10er Lauflicht) 
dafür verwendet. Nimmt zwar etwas mehr Platz weg, ich habe wenig...
Aber meine Frage beinhaltete auch ein anderes Problem! Wie gesagt, uCs 
sind für mich absolut Neuland und ich habe noch kaum Kenntnisse der 
Programmierung! In einem anderen Projekt habe ich ein paar Leuchtdioden 
an einen Atmega8 angeschlossen. Sie blinken abwechselnd, Lauflicht und 
so...
Kann man in dieses Programm einen Taster zum Ein/Ausschalten einbringen? 
Wann kann der abgefragt werden, denn der uC wartet doch fast die ganze 
Zeit ('Waitms')?????


$regfile = "m8def.dat"
$crystal = 16000000
Ddrd = &B11111000
Portd = &B00000000
Do
  Portd.7 = 1
  Waitms 300
  Portd.7 = 0
  Portd.6 = 1
  Waitms 300
  Portd.6 = 0
  Portd.5 = 1
  Waitms 300
  Portd.5 = 0
  Portd.4 = 1
  Waitms 300
  Portd.4 = 0
  Portd.3 = 1
  Waitms 200
  Portd.4 = 1
  Waitms 200
  Portd.5 = 1
  Waitms 200
  Portd.6 = 1
  Waitms 200
  Portd.7 = 1
  Waitms 1500
  Toggle Portd.7
  Toggle Portd.6
  Toggle Portd.5
  Toggle Portd.4
  Toggle Portd.3
  Waitms 600
  Toggle Portd.7
  Toggle Portd.6
  Toggle Portd.5
  Toggle Portd.4
  Toggle Portd.3
  Waitms 600
  Toggle Portd.7
  Toggle Portd.6
  Toggle Portd.5
  Toggle Portd.4
  Toggle Portd.3
  Waitms 600
...
Loop
End

von grunz (Gast)


Angehängte Dateien:

Lesenswert?

Caesar schrieb:
> jap grunz, ich hatte wirklich
> gehofft auf lauffähigen Code!

Hast Glück gehabt. Ich hatte heute einen guten Tag. (Siehe auch 
Netiquette )

Ohne Gewähr! Nicht getestet! Sicher noch elegantisierbar.

von grunz (Gast)


Lesenswert?

Mindestens ein Fehler ist schon drin: Alle beiden "SET OCF1A" mit "SET 
TIFR.OCF1A" ersetzen

von Caesar (Gast)


Angehängte Dateien:

Lesenswert?

Wow, vielen Dank, Señor Grunz!!!!
Das mit dem waitms war wohl keine gute Idee! Interne Timer also... 
Vielen Dank, das bringt mich um Lichtjahre weiter!!! Ich habe die "SET 
OCF1A" mit "SET TIFR.OCF1A" ersetzt. In Line 21 (markiert: XXXXXX Ocr1a 
= 24999) ist ein Assignment Error. Was ist das?

'IDE/Compiler: BASCOM DEMO Version 2.0.5.0
'folgende 5 $Zeilen im Programm angeben, damit im Code sichtbar, sonst 
"unsichtbar" von der IDE vorgegeben!
$regfile = "m8def.dat"
$crystal = 16000000                     'µC muß auch tatsächlich mit 
16MHz laufen!
$hwstack = 34                           'mindestens 32 wegen 
Interruptverwendung
$swstack = 10
$framesize = 24

Declare Sub Switch

Dim Output_active As Byte
Dim 100ms_steps As Byte

Dim Jump As Byte

Ddrd = Bits(pd7 , Pd6 , Pd5 , Pd4 , Pd3)       'angegebene Portd Pins 
als Ausgang

Set Portc.0                             'angenommen Taster an PC0 und 
tastet nach GND, Pullup Widerstand einschalten

Config Timer1 = Timer , Clear Timer = 1 , Prescale = 64       'Mode 4 - 
CTC, timer startet mit prescale
XXXXXX Ocr1a = 24999 
'Comparewert für 100ms bis OCF1A gesetzt wird
Stop Timer1                             'Timer1 soll noch nicht laufen
Timer1 = 0                              'tcnt1 initialisieren
Set Tifr.ocf1a                                              'Eventuell 
anstehendes Interruptflag löschen

On Compare1a Isr_100ms_steps            'wird durch compare1a match alle 
100ms aufgerufen
Enable Interrupts

Do
  Debounce Pinc.0 , 0 , Switch , Sub    'angenommen Taster an PC0 und 
schaltet nach GND
Loop


Sub Switch                              'Unterprogramm wird 
angesprungen, wenn Taster gedrückt worden ist
  If Output_active = 0 Then             'Einschalten
      Output_active = 1
      100ms_steps = 1
      Portd = &B10000000                'bei Einschalten wird PD7 nach 
High geschaltet, alle anderen PDs nach Low
      Enable Compare1a
      Start Timer1                      'Timer einschalten, erster 
Compare1a Interrupt tritt nach 100ms auf
    Else                                'Ausschalten
      Disable Compare1a
      Stop Timer1
      Timer1 = 0
      Set Tifr.ocf1a                                        'Eventuell 
anstehendes Interruptflag löschen
      Output_active = 0
      Portd = &B00000000
  End If
End Sub

Isr_100ms_steps:                        'ISR wird nach Einschalten per 
Taster alle 100ms ausgeführt
  If 100ms_steps <= 20 Then
      Select Case 100ms_steps
        Case 3 : Portd = &B01000000     '300ms nach Einschalten geht PD6 
nach High, andere PDs Low
        Case 6 : Portd = &B00100000     'nach weiteren 300ms PD5 nach 
High
        Case 9 : Portd = &B00010000
        Case 12 : Portd = &B00001000
        Case 14 : Portd = &B00011000    'nach insgesamt 1400ms 
zusätzlich PD4 nach High
        Case 16 : Portd = &B00111000    'nach weiteren 200ms zusätzlich 
PD5
        Case 18 : Portd = &B01111000
        Case 20 : Portd = &B11111000
      End Select
    Else
      Select Case 100ms_steps
        Case 35 : Portd = &B00000000    'nach insgesamt 3500ms werden 
die oberen Bits ausgeschaltet
        Case 41 : Portd = &B11111000    'nach weiteren 600ms wieder 
eingeschaltet
                  100ms_steps = 29      'für aus/ein (toggeln) im 600ms 
Takt
      End Select
  End If
  Incr 100ms_steps
Return

von grunz (Gast)


Lesenswert?

Assignment error kommt zB wenn die Variable nicht definiert ist. OCR1A 
ist aber ein Register im Mega8 und muß nicht extra definiert werden.

Bei mir kompiliert es fehlerfrei.

Bitte Datei, die nicht kompiliert mit Endung .bas nach obigem Vorbild 
der "mega8_PinToggle.bas" anhängen.

Welche BASCOM Version nutzt du?

von grunz (Gast)


Lesenswert?

PS kannst auch erst versuchen OCR1A gegen COMPARE1A zu tauschen.

Wenn du eine ältere BASCOM Version benutzt, mindestens auf die 2.0.5.0 
aktualisieren.

von Caesar (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Grunz!
Ein wunderschönes Wochenende! Ich habe Bascom 1.11.8.1. Muss mal eine 
neue Version laden...
Mit COMPARE1A lässt es sich kompilieren!!!!
Ich habe die Schaltung geändert! Es ist jetzt eine 7-Segment 
Multiplexuhr von 
http://blackstrom.derschwarz.de/avr/avr_uhr/index.shtml. Das macht aber 
nichts, denn das Lauflicht geht immer noch nicht! Der Taktgeber ist 
jetzt ein 1Mhz Quarzoszillator.
Das Lauflicht liegt an Ddrd = Bits(pb0 , Pb1 , Pb2 , Pb3 , Pb4)
und der Taster liegt an portb.5 gegen +.
Ich habe das Programm geändert, aber wenn ich auf den Taster drücke 
passiert nichts. Ich habe
Debounce Pinb.5 , 1 , Switch , Sub
geändert (0 auf 1). War es das nicht für einen Taster gegen +?

von grunz (Gast)


Lesenswert?

Wo fängt man da an? Am Besten fängst du mal an das Programm Zeichen für 
Zeichen, Zeile für Zeile zu verstehen; mit Datenblatt des Mega8 und der 
BASCOM Hilfe!

1. Aktualisieren von BASCOM. Aktualisieren des BASCOM Versions Remarks
   oben im Programm. Du siehst, daß es ein wichtiger Anhaltspunkt ist.

2. Das DDRD Register ist das Datenrichtungsregister für PortD. Die Namen
   PD0 bzw PB0 repäsentieren nur die Bitnummern im Register.
   Richtig wäre also DDRB = Bits( ... ) für PORTB. Alternativ auch das
   CONFIG PORTB.x Kommando.

3. Durch den geänderten Takt auf 1MHz muß die Konfiguration des Timers
   für 100ms  angepaßt werden:
   Config Timer1 = Timer , Clear Timer = 1 , Prescale = 8
   Compare1a = 12499

4. Debounce Pinb.5 , 1 , Switch , Sub 'Taster von PB5 nach Vcc
   In Ordnung, aber an PB5 muß dann noch ein externer Pulldown
   Widerstand von zB 10k nach GND geschaltet werden.
   Internen Pullup nicht einschalten! - OK

5. Dadurch, daß der Oszillator und der Taster auch an PortB liegen,
   dürfen die entsprechenden Pins natürlich nicht bei der
   Ausgangsschalterei verändert werden. Dadurch komplizieren sich
   alle entsprechenden Anweisungen. zB.:
   Portb = Portb AND &B11100000   'für Low-Schalten der unteren Bits
                                  'und Unverändern von PB7, PB6, PB5
   Case 3 : PortB = portB OR &B00000010  'für PB1 nach High und
                                         'Unverändern aller anderen.
   PortB.2 = 1                           'für zusätzliches High von PB2
   etc.
   Es gibt aber viele Wege nach Rom nichtwahr Cäsar :-)

Kein Ahnung ob ich alles beachtet habe. Bin doch auch nur ein non Pro. 
Jetzt bist du gefragt.

von Caesar (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Grunz!
Ich arbeite mich so Stückchenweise vor... Salamitaktik ;-) mit einer 
neuen Bascom Demoversion, die übrigens auch bei Attiny13 nicht meckert, 
so wie die alte!!! Aber zurück zu Atmega8:

- Der Timer 2 muss jetzt benutzt werden

Config Timer2 = Timer , Clear Timer = 1 , Prescale = 8
Compare1a = 12499
Stop Timer2
Timer2 = 0
Set Tifr.ocf1a
On Compare1a Isr_100ms_steps
Enable Interrupts

- In der Hauptschleife ist jetzt der Taster zum Auslösen (so wie auf dem 
Evaluationsboard von Pollin):

If Pinb.5 = 1 Then
Toggle Taster
Bitwait Pinb.5 , Reset
End If

- Wie funktioniert das Unterprogramm? Das soll bei Tastendruck oder zu 
jeder Stunde aufgerufen werden. Vielleicht 20 verschiedene 
Lauflichtspielereien, die über eine Zufallszahl ausgewählt werden, die 
Zufallszahl ist I = Rnd(21)

Sub Ketty
  If Output_active = 0 Then
      Output_active = 1
      100ms_steps = 1
      Portb = &B00000000
      Enable Compare1a
      Start Timer2
    Else
      Disable Compare1a
      Stop Timer2
      Timer2 = 0
      Set Tifr.ocf1a
      Output_active = 0
      Portb = &B00000000
  End If
End Sub


Isr_100ms_steps:
  If 100ms_steps <= 20 Then
      Select Case 100ms_steps
        Case 3 : Portb = &B01000000
        Case 6 : Portb = &B00100000
        Case 9 : Portb = &B00010000
        Case 12 : Portb = &B00001000
        Case 14 : Portb = &B00011000
        Case 16 : Portb = &B00111000
        Case 18 : Portb = &B01111000
        Case 20 : Portb = &B11111000
      End Select
    Else
      Select Case 100ms_steps
        Case 35 : Portb = &B00000000
        Case 41 : Portb = &B11111000
                  100ms_steps = 29
      End Select
  End If
  Incr 100ms_steps
Return

von grunz (Gast)


Lesenswert?

Caesar schrieb:
> Config Timer2 = Timer , Clear Timer = 1 , Prescale = 8
> Compare1a = 12499
> Stop Timer2
> Timer2 = 0
> Set Tifr.ocf1a
> On Compare1a Isr_100ms_steps

Die Anpassungen hier sind falsch bzw können für die 100ms Steps nicht 
funktionieren.
Ich habe nicht das Gefühl, daß ich dir weiter helfen kann.
Lerne BASCOM und schau ins Datenblatt.

von Caesar (Gast)


Lesenswert?

Vielen Dank trotzdem!
Ich freue mich, das ich ein paar Dinge lernen konnte, aber ich verstehe 
die Zusammenhänge nicht...
Vielleicht kann ich ja sagen

Const Load_timer2 = 15625
Config Timer2 = Counter , Prescale = 1024
Enable Timer2
On Timer2 Lauflicht

Lauflicht:
 If Taster = 1 Then
 Toggle Portb.1
 End If
Return

Das funktioniert ohne Waitms... Counter zählt doch etwas? Vielleicht 
könnte ich ja sagen, solange die Zahl zwischen 1 und 5 ist, Portb = 
&B00010000...

von Caesar (Gast)


Angehängte Dateien:

Lesenswert?

OK, nach einigem Knobeln habe ich es soweit, dass es läuft!
Und zwar mit Lauflicht zu jeder vollen Stunde oder durch Tastendruck. 
Das Lauflicht funktioniert dadurch:
 Select Case T
        Case 1 : Portb = &B00000001
        Case 5 : Portb = &B00000010
        Case 9 : Portb = &B00000100
        Case 13 : Portb = &B00001000
        Case 17 : Portb = &B00010000
        Case 21 : Portb = &B00010001
        Case 25 : Portb = &B00010010
        Case 29 : Portb = &B00010100
        Case 33 : Portb = &B00011000
        Case 37 : Portb = &B00011001
        Case 41 : Portb = &B00011010
        Case 45 : Portb = &B00011100
        Case 49 : Portb = &B00011101
        Case 53 : Portb = &B00011110
        Case 57 : Portb = &B00011111
        Case 61 : Portb = &B00000000
        Case 65 : Portb = &B00011111
        Case 69 : Portb = &B00000000
        Case 73 : Portb = &B00011111
        Case 77 : Portb = &B00000000
        Case 81 : Portb = &B00011111
        Case 85 : Portb = &B00000000
        Case 89 : Portb = &B00011111
        Case 93 : Portb = &B00001111
        Case 97 : Portb = &B00010111
        Case 101 : Portb = &B00000111
        Case 105 : Portb = &B00001011
        Case 109 : Portb = &B00010011
        Case 113 : Portb = &B00000011
        Case 117 : Portb = &B00000101
        Case 121 : Portb = &B00001001
        Case 125 : Portb = &B00010001
        Case 129 : Portb = &B00000001
        Case 133 : Portb = &B00000010
        Case 137 : Portb = &B00000100
        Case 141 : Portb = &B00001000
        Case 145 : Portb = &B00010000
        Case 149 : Portb = &B00000000
        End Select
Voila: Uhr von http://blackstrom.derschwarz.de/ mit Lauflicht.

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.