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!
>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. :)
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.
grunz schrieb: > Alle Pins sind standartmäßig Inputs. Schlaumeier. Nicht in seinem Programm. Was soll's. Caesar fragt bestimmt schon anderswo...
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.
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.
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.
Mindestens ein Fehler ist schon drin: Alle beiden "SET OCF1A" mit "SET TIFR.OCF1A" ersetzen
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.