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?
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!
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.
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
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
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.
@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.
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.
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.
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
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.
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
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?
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 +?
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.
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
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.
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...
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.