PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 5 Minuten Timer mit Attiny 13



John13
02.04.2011, 23:46
Hallo,

vielleicht könnt Ihr mir bei folgendem Problem weiterhelfen. Ich würde gerne einen 5 Minuten Timer für den Attiny 13 Programmieren mit folgenden Anforderungen.

Beschreibung:

-Wenn ein Taster S1 (Eingang 1) betätigt wurde, sollen die 5 Minuten ablaufen.
-Wärend die 5 Minuten ablaufen, werden 2 Ausgänge (Ausgang 1 und 2) geschaltet.
-Nachdem die 5 Minuten abgelaufen sind, sollen die 2 Ausgänge (Ausgang 1 und 2) wieder abgeschaltet werden.
-Daraufhin soll ein weiterer Ausgang (Ausgang 3) für (1-2sek.) einen Piezo - Summer ansteuern.
-Danach soll man den Ablauf mit (S1) neu starten können.

Ich habe mir die Belegung der Ports so vorgestellt:

18402

Eingang 1 = PB1
Ausgang 1 = PB2
Ausgang 2 = PB3
Ausgang 3 = PB4

Wie kann ich das Programm in z.B Bascom Programmieren? Ich habe leider kaum Ahnung vom Programmieren. Kann mir vielleicht einer weiterhelfen?

Gruß
John13

Searcher
03.04.2011, 07:13
Hallo John,

...Wie kann ich das Programm in z.B Bascom Programmieren? Ich habe leider kaum Ahnung vom Programmieren. Kann mir vielleicht einer weiterhelfen?...
Um Programmieren zu können muß man das erst mal lernen. Meine ersten Schritte zum AVR Programmieren habe ich zB mit dem RN-Wissen Artikel AVR-Einstieg_leicht_gemacht (http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht) getan.

Dort wird zwar mit Mega16 bzw Mega32 gearbeitet. Eine Anpassung der einfachen BASCOM Übungen auf ATtiny13 sollten aber kein Problem darstellen und Fragen dazu werden hier sicher auch beantwortet.

Ansonsten solltest Du uns mehr über Deine Voraussetzungen erzählen.

zB Hast Du BASCOM schon auf dem PC installiert und damit schon den ATtiny13 geflasht?


Gruß
Searcher

John13
03.04.2011, 11:22
Hallo Searcher,

Danke für den Link. Ich besitze das Mikrocontroller Lernpaket von Franzis und habe damit auch schon die Grundschaltungen Programmiert. Auf meinem Rechner habe ich übrigens Bascom, AVR Studio 4 und WinAVR. Mit Bascom und AVR Studio 4 habe ich auch schon kleine Programme (Blinkschaltung) geflasht. Natürlich alles nach dem Handbuch von Franzis.

Gruß
John13

dolivo
05.04.2011, 09:27
Hallo, John13,
das ist so ein schönes Anfängerproblem, dass Du das in kurzer Zeit selbst schaffst. Für den Anfang kannst Du es ja mit wait (Puristen weghören!) probieren, aber dann auf jeden mit dem Timer.

John13
05.04.2011, 14:54
Hallo dolivo,

ich habe mal versucht das programm zu schreiben, aber irgendwie haut das noch nicht so richtig hin.
den quellcode habe ich im Anhang.


'5 Minuten Timer für Attiny13 05.04.2011'

'Einstellungen ---------------------------------------------------------------------------'

$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 0
$swstack = 0
$framesize = 0

Config Portb.1 = Input ' Taster(S1)
Config Portb.2 = Output ' LED1
Config Portb.3 = Output ' LED2
Config Portb.4 = Output ' Piezo-Summer
Config Timer0

'Hauptprogramm ---------------------------------------------------------------------------'

Do
if Portb.1 = 1 then
Portb.2 = 1
Portb.3 = 1
Waitms 300000
then Portb.4 = 1
Portb.2 = 0
Portb.3 = 0
Waitms 1000
then Portb.4 = 0
Loop

Die Grundlagen habe ich mir übrigens auch schon durchgelesen.
Ich hoffe einer von euch kann mir da weiter helfen

Gruß
John13

lokirobotics
05.04.2011, 15:21
Ich hab die Bascom Feinheiten jetzt nicht im Kopf, aber wenn du einen Eingang abfragen willst, musst du das über PIN.X machen.

oZe
05.04.2011, 15:34
Hallo!
Also du hast ein paar Fehler in deinem Programm. Zunächst musst du lernen die If Abfrage richtig anzuwenden. Das Grundkonstrukt sieht folgendermaßen aus:


If BEDINGUNG then
Hier der code der ausgeführt werden soll wenn If zutrifft
End If

Bei dir kommt das Wort "then" mehrfach vor. Das ist nicht notwendig, da alles was zwischen If und End If steht ausgeführt wird. Korrigiert würde dein Code so aussehen:


if PINB.1 = 1 Then
Portb.2 = 1
Portb.3 = 1
Waitms 300000
Portb.4 = 1
Portb.2 = 0
Portb.3 = 0
Waitms 1000
Portb.4 = 0

Unter das letzte Loop gehört zusätzlich noch das Wort END. Was du auch noch beachten musst ist die richtige Schreibweise der eingebundenen Bibliothek.
Du hast attiny13.dat geschrieben aber die Datei heißt glaube ich ATtiny13.dat. Also groß und kleinschreibung beachten!
Das Confic Timer0 in deinem Quellcode ist überflüssig da du keinen Timer in deinem Programm benutzt ;-) und wie schon erwähnt wurde: Bei Inputs nimmt man
PinX.X anstelle von PortX.X auch wenn viele sagen das es auch anders geht.
Hoffe ich konnte helfen!

dolivo
05.04.2011, 17:28
nicht vergessen, den Summer wieder auszuschalten.

KingSauce
05.04.2011, 20:33
kann man eigentlich irgendwie errechnen, wie weit der waitms-Befehl vom wirklichen Timer abweicht? Ich habe die Timerfunktion noch nie benutzt / benötigt würd mich aber mal interessieren, damit ich weiß, wann es Zeit wird sich das mal anzuschauen ;)

John13
05.04.2011, 20:55
Hallo,

ich habe den Quellcode nun folgendermaßen Programmiert:



'10 Minuten Timer mit 2 Schaltausgängen PB2 und PB3 / Buzzer an PB4
'Taktfrequenz 1200 KHz
'-------------------------------------------------------------------------------
'Grundeinstellungen
'-------------------------------------------------------------------------------

$regfile = "attiny13.dat"
$crystal = 1200000 'Standard- Takt 9,6 MHz / 8
$hwstack = 0
$swstack = 0
$framesize = 0
Baud = 9600

Config Pinb.1 = Input 'Taster(S1)
Config Portb.2 = Output 'Schaltausgang1
Config Portb.3 = Output 'Schaltausgang2
Config Portb.4 = Output 'Buzzer

'-------------------------------------------------------------------------------
'Hauptprogramm
'-------------------------------------------------------------------------------

Do 'Beginn der Schleife
If Pinb.1 = 1 Then 'Anfang Der If Bedingung
Portb.2 = 1 'Schaltausgang1 wird gesetzt
Portb.3 = 1 'Schaltausgang2 wird gesetzt
Wait 600 '10 Minuten warten
Portb.2 = 0 'Schaltausgang1 wird resetet
Portb.3 = 0 'Schaltausgang2 wird resetet
Portb.4 = 1 'Buzzer wird gesetzt
Wait 2 '2 Sekunden warten
Portb.4 = 0 'Buzzer wird resetet
End If 'Ende der If Bedingung
Loop 'Ende der Schleife

End 'Programm Ende

Dieser funktioniert nun auch schon sehr gut. Deshalb schon einmal ein großes Danke für die Hilfe.

Mich würde aber auch noch einmal interessieren, wie man das mit dem Ton für den Buzzer programmiert? Und was müsste ich ändern wenn ich zwei Zeiten haben möchte ( 5 Minuten über einen Taster S1 einschaltbar und 10 Minuten über einen Taster S2 einschaltbar ). Den Taster S2 würde ich dann an PB0 anschließen.

Gruß
John13

Searcher
06.04.2011, 11:14
Hallo,
es ist nicht einfach auf Deine Fragen zu antworten, weil sie sehr allgemein sind.

Ton für Buzzer: es gibt so viele Töne... Wie funktioniert Dein Buzzer (wie muß der angesteuert werden)? Anscheinend, nach Deinem Programm (Gratuliere übrigends), hast Du den ja schon in Betrieb.
Zwei Zeiten: ???
Müßtest genau, Schritt für Schritt beschreiben, was genau passieren soll wenn Du was machst.

Danach kannst Du das Programm schon fast selbst schreiben. Konkrete Fragen zu einem geposteten Programm lassen sich viel einfacher beantworten.

Gruß
Searcher

John13
12.04.2011, 16:20
Hallo Searcher,

ich habe mal das Datenblatt von meinem verwendeten Piezo Signalgeber angehängt. Dann werde ich jetzt mal die gewünschte Funktion beschreiben:

Wenn ich den Taster (S1) kurz betätige, soll eine Zeit von 5 Minuten ablaufen. Wird anstatt dem Taster (S1) der Taster (S2) betätigt sollen 10 Minuten ablaufen. Wärend dieser Zeit sollen die Schaltausgänge 1 und 2 geschaltet werden. Nachdem die Zeit Abgelaufen ist, sollen die Schaltausgänge 1 und 2 wieder abgeschaltet werden. Sobalt die Schaltausgänge 1 und 2 abgeschaltet wurden soll am Schaltausgang 3 ein Piezo Signalgeber / Summer für 2 Sekunden angesteuert werden. Den Port ( PB5) habe ich mir als Reset Option überlegt.

Taster (S1) --> PB0
Taster (S2) --> PB1
Taster (S3) (Reset) --> PB5
Schaltausgang 1 --> PB2
Schaltausgang 2 --> PB4
Schaltausgang 3 (Piezo Signalgeber / Summer) --> PB3

Gruß
John13

Bernd_Stein
12.04.2011, 16:40
Hallo,
...

Wie kann ich das Programm in z.B Bascom Programmieren? Ich habe leider kaum Ahnung vom Programmieren. Kann mir vielleicht einer weiterhelfen?

Gruß
John13

Hallo,

da das Programm nicht allzu kompliziert erscheint, solltest Du nach einem ähnlichen Programm für den ATtiny13 suchen, das dann umgestrickt werden kann.
D.h. nach Monoflop, Zeitrelais und dergleichen suchen. Ich selbst übe mich in Assembler, eine andere Programmiersprache kann ich nicht. Lass Dich für dein Problem nicht von Assembler abhalten, da z.B. ein Monoflop in ASM nicht so das Problem sein dürfte.


Bernd_Stein

Searcher
12.04.2011, 17:24
Hi,
ich versuch's mal auf die Schnelle im Groben und ohne Gewähr. Zum Testen die wait Zeiten auf einstellige Sekundenzeiten begrenzen ;)
PRG ist sehr einfach aufgebaut, sicher verbesserungswürdig und Du hast auch noch was zu tun; während die Zeiten laufen kann man nur die RESET Taste drücken um alles abzuschalten.

Der Summer braucht nach Datenblatt nur 2mA. Spannung paßt auch und kann direkt an PB3 und GND angeschlossen werden. Sobald PB3 auf high geht sollte der schon einen ca 4kHz Ton ausgeben.

Tasten prellen beim Drücken. Hier ist im Kapitel 21 etwas dazu: http://halvar.at/elektronik/kleiner_bascom_avr_kurs/ Sollte hier aber zunächst nichts machen.


BASCOM Header

dim S1 as byte
dim s2 as byte

s1 = 0 'variable initialisieren, eigentlich nicht notwendig jedoch sicher
s2 = 0

config PORTB.0 (für S1) = input
config PORTB.1 (für S2) = input
PORTB.0 (für S1) = 1 'Pullup Widerstand ein - PIN ist high (S1 schaltet GND bei Drücken)
PORTB.1 (für s2) = 1 'Pullup Widerstand ein - PIN ist high (S2 schaltet GND bei Drücken)

config PORTB.2 (Schaltausgang 1) = output
config PORTB.4 (schaltausgang 2) = output
config PORTB.3 (schaltausgang 3) = output 'Summer

PORTB.2 = 0 'Schaltausgang 1 auf low
PORTB.4 = 0 'Schaltausgang 2 auf low
PORTB.3 = 0 'Schaltausgang 3 auf low '(Summer)


DO
s1 = PINB.0 'Einlesen Zustand von Schalter 1 an PORTxn
S2 = PINB.1 'Einlesen Zustand von Schalter 2 an PORTxn

if S1 = 0 then
PORTB2 = 1 'Schaltausgang 1 schalten
PORTB4 = 1 'Schaltausgang 2 schalten
wait 300
PORTB.2 = 0 'Schaltausgang 1 abschalten
PORTB.4 = 0 'Schaltausgang 2 abschalten
PORTB.3 = 1 'Summer ein
wait 2
PORTB.3 = 0 'Summer aus
endif

if S2 = 0 then
PORTB.2 = 1 'Schaltausgang 1 schalten
PORTB.4 = 1 'Schaltausgang 2 schalten
wait 600
PORTB.2 = 0 'Schaltausgang 1 abschalten
PORTB.4 = 0 'Schaltausgang 2 abschalten
PORTB.3 = 1 'Summer ein
wait 2
PORTB.3 = 0 'Summer aus
endif
LOOP

John13
20.04.2011, 11:04
Hallo,

Danke schon mal für die super Hilfe. Es würde mich nur noch interessieren, ob es schlimm ist den Reset Taster zu benutzen?

Gruß
John13

DanielSan
20.04.2011, 12:26
Nein das ist nicht so ohne weiteres möglich. Du kannst zwar die Fuses so setzen, das du ihn verwenden kannst. Dann fällt allerdings die möglichkeit den µC seriell zu flashen weg. Dann benötigst du ein anderes Programmiergerät und die sind ziemlich teuer!

Also versuch einen anderen Pin zu nutzen. Wenn dir die Pins ausgegangen sind, kauf dir nen größeren µC ;-)
Evtl. kann man dann auch mit Multiplex o.ä. arbeiten. Das hängt dann von der jeweiligen Situation ab.

Gruß Daniel

dussel07
20.04.2011, 13:03
Wenn ein Port fehlt dann einfach deine Zwei Ausgänge zusammenlegen - machen ja eh das Gleiche - gibt keinen Sinn die seperat anzusteuern. Sollten die 40mA pro Pin nicht reichen dann einfach ein Transitortreiber nachschalten.
Ansonsten: Reset Pin nutzen kein Problem - nur sollte dann das Programm nicht laufen, muß man sich ein HVProgrammer kaufen um wieder auf den MC zugreifen zu können. In der Praxis würde das bedeueten: Attiny wegschmeißen und ein Neuen nehmen.

Searcher
20.04.2011, 13:21
Hallo John,
wie möchtest Du den Reset Taster nutzen?

...während die Zeiten laufen kann man nur die RESET Taste drücken um alles abzuschalten.... Damit meinte ich, daß Du über RESET den µC zurücksetzt, wenn da eine Taste dran ist, eben über Drücken der Taste zum resetten, damit er wieder von vorne mit dem Programm beginnt. Da wäre nichts schlimm dran und ist normal.

Man kann den RESET Pin auch anders nutzen durch Umstellen der Fuses. Ist jedoch erstmal nichts empfehlenswert und macht man erst, wenn man es wirklich braucht.

Gruß
Searcher

John13
20.04.2011, 18:40
Hallo Searcher,


Damit meinte ich, daß Du über RESET den µC zurücksetzt, wenn da eine Taste dran ist, eben über Drücken der Taste zum resetten, damit er wieder von vorne mit dem Programm beginnt.

genau so habe ich das auch gemeint. Die Frage hat sich also erledigt.

Gruß
John13

Bow-Hunter
23.12.2013, 16:29
Hi, ich habe gerade versucht deinen Aufbau nachzustellen. Es gelingt aber nicht ihn zu starten. Ich habe den Code in Bascom-Avr eingegeben, eine Hex Datei erstellt und diese in den Chip geladen mit der Software von Franzis.
Nun wollte ich den Chip ohne Verbindung zum PC testen. (will ihn im Gartenhaus verbauen) Aber ich bekomme die LEDs nicht ans laufen. Welchen Aus/Eingang hast du mit was angeschlossen? Gruß Glenn