Thema von diezel im Forum Empfänger, Servos, Mul...
Huhu,
ich bin momentan dran, ein Servo im XC50-Stil zu bauen. Dazu würde ich gerne mehr über das Original wissen. Im Netz sind die Angaben zu den Innereien eher dürftig. Vielleicht hat ja noch jemand ein defektes in einer Kellerschublade liegen oder kann sich noch erinnern. Besonders würden mich die Zähnezahlen, Module und die Zahnradarten (Kronenzahnrad?) interessieren.
Ich hab aber schon mal angefangen, ein erster Entwurf im CAD steht. Ich hab einen 4mm Motor genommen, auf die Welle ein Zahnrad M0,2 Z8 geplant. Dieses treibt ein Kronenzahnrad mit Z30 an. Danach folgen 2 Zahnradstufen in M0,15 mit Z9/Z40. Insgesamt komm ich also auf eine Übersetzung von 1:74. Die Aussenmaße mit Motor sind 5,7 x 7,5 x 23. Dazu kommt noch ne kleine Platine, die das Poti ausliest und den Motor steuert. Im CAD fehlen die Achsen und die Durchkontaktiernieten. Ich hoffe, ihr könnt es euch vorstellen. [[File:CAD.jpg|none|auto]][[File:CAD2.jpg|none|auto]]
Und rein "zufällig" hab ich heute die ersten Gehäuseteile drucken lassen. Fragt bitte nicht nach der Quelle, das war ne einmalige Hauruck-Aktion. Leider. Nächstes mal muß ich wohl auf Shapeways ausweichen, oder ich fräse die Teile. Mal sehen. Auf der Münze liegt auch ein gedrucktes Kronenrad, das zwar für´s erste reichen wird, das werd ich aber aus Messing fräsen. [[File:20150416_204301.jpg|none|auto]] Ich warte jetzt noch auf Zahnräder von Mikroantriebe, dann steigt der erste Versuch.
hab im Web was gefunden, das für Euch vielleicht interessant sein könnte. Es gibt von Franzis ein Lernpaket "Mikrocontroller programmieren". Darin geht es aber weniger darum, selbst einen Code in Bascom oder C usw. zu erzeugen, sondern es ist eher mit einer CNC-Steuerung vergleichbar. Mit nur wenigen Befehlen, die mit nur 2 Tastern eingegeben werden, kann damit ein eigenes Ablaufprogramm geschrieben werden. Im Original besitzt die Platine 4 digitale Eingänge, für z.B. Taster oder Read-Kontakte, 2 analoge Eingänge um Spannungen zu messen oder Potis einzulesen, 4 Ausgangsports zum Schalten von irgendwelchen Verbrauchern und einen PWM-Ausgang, z.B. zum Licht dimmen. Als Anwendungsbeispiel seh ich dafür unsere Landschafts-Module. Hier gibt´s ne schöne Beschreibung: http://www.elektronik-labor.de/Lernpakete/TPS/HandbuchTPS.htm http://www.elektronik-labor.de/Lernpakete/TPS/TPS0.html Es gibt auch einen Emulator, um das Programm schon auf dem PC zu testen: http://www.elektronik-labor.de/Lernpakete/TPS/TPS20.html
Das schöne daran ist, daß Burkhard Kainka alle nötigen Infos frei zugänglich gemacht hat, so daß jeder selbst dies so nachbauen kann. http://www.elektronik-labor.de/Projekte/TPS5.html#v3 Ich werd irgendwann mal das Programm erweitern, um damit auch normale RC-Servos anzusteuern. Also eine Art "Servo-Sequenzer" dazu programmieren, um z.B. beim überfahren eines Read-Kontaktes auf dem Modul eine Schranke zu öffnen und nach bestimmter Zeit wieder zu schließen.
Thema von diezel im Forum Bascom - Unser Einstei...
Hallo,
dieses Thema paßt gerade recht schön rein. Wir haben ja im Kursteil 9 per PWM eine LED auf- und abgedimmt. Wer ganz genau hinschaut, sieht daß die Helligkeitszunahme der LED nicht linear erscheint. Das liegt daran, daß unser Auge Helligkeitsunterschiede nicht linear empfindet. Wer es genau nachlesen möchte: http://www.mikrocontroller.net/articles/LED-Fading
In dem Artikel ist auch recht schön die Lösung beschrieben. Es wird in Excel eine Tabelle angelegt, in der mit einer Exponentialfunktion neue Werte berechnet werden. Diese Werteliste kann nun in Bascom importiert werden.
Was uns noch fehlt, ist eine Nachschlagefunktion in Bascom. Der Befehl hierzu heißt "Lookup", ein Beispiel:
1 2 3 4
neuer_Wert = Lookup (5, dta)
dta: Data 10 , 20 , 30 , 40 , 50 , 60 , 70
Ich beschreib mal die Befehlssyntax von hinten: - dta: wir müssen Bascom sagen, wo es die Werteliste findet. Dazu muß der Name einer Sprungmarke angegeben werden. Ich hab sie "dta" genannt. - 5: hier sagen wir, welcher Eintrag gesucht werden muß. Wir suchen den fünften in der Liste. - neuer_Wert: hierrein wird die Antwort der Funktion übergeben, in unserem Bsp. die 50
Ich hab das Beispiel aus BEK09 genommen und um die Lookup-Funktion erweitert. Ihr werdet sehen, daß es den Speicherplatz Wert ist. Die LED fadet viel schöner.
'*** Ein/Ausgänge deklarieren ************************************************** Config Portb.0 = Output 'PortB als Ausgang Led1_pin Alias Portb.0 'Ausgang PortB.0 heitßt ab jetzt "Led1"
'*** Variablen definieren ****************************************************** Dim Zaehler As Byte Dim Led1 As Byte 'Auflösung 0 - 49 Dim Timerzaehler As Byte 'Maximalwerte wie LED1 Dim Lookup_wert As Byte
Do 'Beginn Hauptschleife For Zaehler = 0 To 49 'in ca. 1sec aufdimmen Lookup_wert = Lookup(zaehler , Dta) Led1 = Lookup_wert 'hier wird der Schleifenwert der LED zugewiesen Waitms 20 Next Zaehler
Wait 1 '1sec halten
For Zaehler = 49 To 0 Step -1 'in ca. 1sec abdimmen Lookup_wert = Lookup(zaehler , Dta) 'aus Wertetabelle neuen Wert holen Led1 = Lookup_wert 'hier wird der Schleifenwert der LED zugewiesen Waitms 20 Next Zaehler
Wait 1 Loop 'Ende Hauptschleife
End
'*** Subs ********************************************************************** Timerroutine: 'Beginn Subroutine Timer0 = 205 Incr Timerzaehler If Timerzaehler = 50 Then Timerzaehler = 0 'Timerzaehler auf LED-Auflösung begrenzen If Timerzaehler < Led1 Then Led1_pin = 0 Else Led1_pin = 1 'Vergleich Timerzähler mit LED-Wert -> LED Ein- od. Ausschalten Return 'Ende Subroutine
Thema von diezel im Forum Bascom - Unser Einstei...
Hallo,
heute möchte ich Euch zeigen, wie man Pulsweitenmodulation (PWM) erzeugt. PWM? Das ist ein Rechtecksignal mit fester Frequenz, bei dem die Ein- und Auszeiten variert werden können. Damit kann man dann z.B. eine LED in der Helligkeit steuern. Wird die Ein-Zeit länger gemacht, bekommt die LED länger Strom und leuchtet länger. Da die Frequenz aber so schnell ist, kommt unser Auge da gar nicht mit und erkennt nur eine LED, die eben in der Helligkeit variiert.
Wir haben 2 Möglichkeiten diese PWM zu erzeugen. Als erstes machen wir dies, in dem wir die Hardware-PWM unseres Atmega nutzen. Wir können die Timer auch so konfigurieren, daß sie an vorgegebenen Pins ein PWM-Signal ausgeben. Der Atmega8 hat 3 Ausgänge für Hardware PWM: Timer1 gibt sie auf den Pins PB1 und PB2 aus, Timer2 belegt PB3. Seht euch doch bitte im Datenblatt die "Pin configurations" auf Seite 2 an. Dort sind diese Pins so bezeichnet: OC1A, OC1B und OC2. Also Timer1 hat 2 PWM-Kanäle, Timer2 hat einen und Timer0 kann gar keine Hardware-PWM.
Config Timer1 = PWM: hier sagen wir dem Timer1 daß er im PWM-Modus arbeiten soll PWM = 10: hier wird bestiimt, wie fein abgestuft die PWM sein soll. Hier können 8-Bit, also 256 Stufen, 9-Bit = 512 Stufen und 10 Bit = 1024 Stufen konfiguriert werden. Compare A Pwm = Clear Down: ääähhhh ja. Seht euch mal schnell auf Seite 111 des Datenblattes die Grafik an. Der Timer ist ja ein Zähler. Er zählt bei unserer 10-Bit-PWM von 0 bis 1023 und von 1023 wieder zurück auf 0. Also diese Zickzack-Linie "TCNTn" im Bild. Der jeweilige Zählerstand wird fortlaufend mit einem Vergleichswert, den wir vorgeben, verglichen. In der Grafik ist der Vergleichswert bei den ersten 2 Zacken auf maximal, also Wert 1023, danach in der Mitte und zum Schluß bei ca.80%. Wir sehen uns die mittleren beiden Punkte an und erkennen, daß wenn der Timer runterzählt und mit dem Vergleichswert gleich ist, wird der Ausgang auf High gesetzt. Beim nächsten Treffer ist der Zähler beim raufzählen und der Ausgang wird Low. Dieser Modus nennt sich in Bascom "Compare A Pwm = Clear Up". Eine invertierte PWM erhält man bei "Clear Down", und genau brauchen wir wegen der invertierten Logic der LED (0=Ein, 1=Aus) Achtung: seit Bascom Version 2.0.7.1 ist diese Einstellung wie beschrieben, bei älteren Versionen war Clear Up/Down getauscht.
Prescale = 64: wie schon bei der normalen Timer-Konfiguration, können wir auch hier einen Prescaler benutzen. Ich rechne wieder: 8 MHz Systemtakt, 256 Prescale und 1024 PWM Auflösung. Das Ergebnis hiervon müssen wir nochmals halbieren: wer die Grafik aufmerksam anschaut, bemerkt daß der Timer von 0 - 1023 und wieder zurück zählen muß, damit ein PWM-Signal entsteht: 8000000 / (64 * 1024 * 2) = 61Hz
Do 'Beginn Hauptschleife For Zaehler = 0 To 1023 'in ca. 1sec aufdimmen Pwm1a = Zaehler Waitms 1 Next Zaehler
Wait 1 '1sec halten
For Zaehler = 1023 To 0 Step -1 'in ca. 1sec abdimmen Pwm1a = Zaehler Waitms 1 Next Zaehler
Wait 1 '1sec halten
Loop 'Ende Hauptschleife
End
Der große Nachteil an der Hardware-PWM ist, daß für 2 PWM-Kanäle ein Timer belegt ist. Da Timer aber eh meist zu wenige sind und wir gar keine so hohe Auflösung für ne LED brauchen, zeig ich euch morgen, wie man das "von Hand" machen kann, ähhm, die PWM mein ich.
Do 'Beginn Hauptschleife Toggle Led1 Waitms 500 Loop 'Ende Hauptschleife
End
Hallo,
seht Euch mal das Beispiel oben an. Was macht es? Genau, eine LED blinkt mit 1Hz. Mehr nicht. Schade eigentlich, weil während dem "Waitms 500" verbringt der µC fast 4 Millionen Takte mit nix tun.
Ich will Euch nun zeigen, wie man das besser macht. Das Mittel der Wahl nennt sich "Timer".
Ein Timer ist ein Zähler, der die Systemtakte mitzählt. Und das macht er von ganz alleine, unser eigentliches Programm läuft gleichzeitig weiter, weil der Timer in einer eigenen "Baugruppe" des µC verbaut ist. Die Atmels haben (fast) alle mehrere Timer. Wieviele sagt Euch das Datenblatt. Unser Atmega8 hat 3 Stück, die da heißen: Timer0, 1 und 2. Es gibt noch Unterschiede, wie weit die Timer zählen können: Timer 0 und 2 sind 8-Bit-Timer, können also von 0 bis 255 zählen, der Timer 1 hat 16 Bit, kann also von 0 bis 65535 zählen.
Als weiteres Gimmick kann man "Prescaler" einschalten. Diese Vorteiler bewirken, das nur jeder x-te Systemtakt den Timer weiterzählen läßt. Mögliche Prescaler beim Atmega8 sind 8, 64, 256 und 1024. Z.B. wird Prescaler 8 konfiguriert, zählt der Timer nur bei jedem 8ten Systemtakt weiter. Die neueren Atmels haben übrigends noch mehr Prescaler die feiner abgestuft und größer sein können -> Datenblett gucken!
Während dem Programmlauf kann jederzeit der aktuelle Zählerstand des Timers ausgelesen werden. Ist ein Timer voll, bspw. der Timer0 hat bis 255 gezählt, kann er einen "Interrupt" auslösen. Dadurch wird der aktuelle Programmablauf unterbrochen, ein definierter Programmteil wird abgearbeitet und nach Erledigung geht´s an der vorherigen Stelle weiter.
Keine Angst, sooo schlimm ist´s gar nicht :-)
Jetzt mal zu unserem Beispiel: wir wollen ein Timer so konfigurieren, daß er uns alle 500ms einen Interrupt auslöst. Unser Atmega8 rennt mit 8MHz, er macht also je Sekunde 8 Millionen Takte. Wir müssen jetzt also 4 Millionen Takte mitzählen. Ich nehm jetzt mal den Timer1, der bis 65535 zählen kann. Jetzt stellt sich die Frage, wie groß der Prescaler sein muß. Ich rechne kurz: 4000000 / 65536 = 61,03 Der Prescaler muß größer sein, wir nehmen also Prescaler = 64. Gegenrechnung: wir teilen die 4 Millionen Takte durch den Prescaler: 4000000 / 64 = 62500 Paßt. Die 62500 sind kleiner als die 65535, die unser Timer zählen kann. Ganz zufällig ist mit 62500 ein genauer Wert rausgekommen. Meist kommt dort eine Kommazahl raus, man muß sich dann entweder mit der daraus entstehenden Ungenauigkeit zufrieden geben oder man versucht durch Auswahl eines anderen Timers oder Prescalers genau hinzukommen.
Eine kleine Hürde haben wir jetzt noch. Der Timer kann nur einen Interrupt auslösen, wenn er voll ist, also bis an seine Grenze gezählt hat. Dies umgeht man so, in dem man den Timer nicht bei 0 zu zählen beginnen läßt, sondern ihn vorlädt. Bei wieviel? Wir rechnen wieder: 65536 - 62500 = 3036 Wir sagen also dem Timer am Programmanfang und jedesmal, wenn er wieder bei 0 anfangen will, das ist gleich nachdem er den Interrupt ausgelöst hat, daß er bei 3036 anfängt.
Hier die Umsetzung des oben beschriebenen in Bascom:
'*** Subs ********************************************************************** Timerroutine: 'Beginn Subroutine Timer1 = 3036 'Timer auf neuen Startwert einstellen Toggle Led1 Return 'Ende Subroutine
Der Code sollte jetzt eigentlich für Euch nachvollziehbar sein. Achtet bitte im Bereich "Timer konfigurieren" auf die richtige Schreibweise. Das "Enable Interrupts" wird gerne vergessen, bewirkt dann, daß keine Interrupts ausgeführt werden.
Und schaut genau hin: unser Hauptprogramm ist leer! Dort könnte irgend etwas anderes passieren.
Thema von diezel im Forum Bascom - Unser Einstei...
Hallo,
entschuldigt bitte, daß ich Euch so lang hab warten lassen. Leider passieren Dinge, die man nicht beeinflußen kann. Jetzt hat´s mich (mal wieder) erwischt gehabt, für solche Sachen hier war leider keine Zeit mehr übrig. Aber mittlerweile hat sich die Lage wieder gebessert und wir können weiter machen.
Bevor wir ans Thema "Timer" gehen, sollten wir dieses Thema unbedingt noch durchkauen.
In Bascom hat man paar Möglichkeiten, ein bischen Struktur in den Code zu bringen. Das erleichtert einem das Leben ungemein. Z.B. bei der Fehlersuche, oder wenn man bestimmte Programmteile wiederverwenden möchte, empfiehlt es sich, das Programm modular aufzubauen.
Die schlechteste Möglichkeit ist hierbei der Befehl "Goto". Mit diesem Befehl wird der Programmablauf auf eine feste Sprungmarke umgeleitet. Der Code wird aber dadurch sehr verschachtelt, eine Wartung oder spätere Änderung wird dadurch sehr schwer bis unmöglich. Bitte verwendet diesen Befehl am Besten gar nicht, oder nur sehr sehr sparsam.
Ein besserer Stil ist, das Programm in mehrere Unterprogramme aufzubauen. Das Programm wird dadurch viel leichter zu lesen und verstehen. In diese Unterprogramme, kann man z.B. wiederkehrende Befehlsfolgen oder auch ganze Programmteile schreiben. Hier mal ein Beispiel:
If Zaehler = 1 Then Led1 = 0 Elseif Zaehler = 2 Then Led2 = 0 Else Led3 = 0 End If
Wait 1
Return
ist zwar ein relativ sinnfreies Beispiel, aber ihr solltet sehen, wie es abläuft: Durch das "Gosub Ausgaenge_setzen" leiten wir den Programmablauf um. Damit wird direkt auf die Sprungmarke "Ausgaenge_setzen" gesprungen. (Achtet auf den Doppelpunkt hinter der Sprungmarke, beim Gosub darf es nicht dabeistehen.) Jetzt wird der Code zwischen der Sprungmarke und dem "Return" abgearbeitet. Hier gibt´s nichts weiter zu beachten, alle Variablen die oben gegolten haben, gibt´s auch hier. Sie gelten also "global". Nach dem "Return" wird wieder direkt hinter dem Gosub weitergemacht, in unserem Beispiel das "Next Zaehler".
Noch einen neuen Befehl hab ich Euch untergejubelt. Bei der Definition der Ein/Ausgänge habe ich das "Alias" verwendet:
1
Led1 Alias Portb.0
Wir geben dadurch dem Ausgang PortB.0 einen Namen. Wir können diesen im Code genauso verwenden, als würden wir PortB.0 schreiben. Für uns wird´s dadurch aber viel leserlicher. Ein späteres Ändern, z.B. wenn LED1 mal einen anderen Ausgang kommen soll, wird viel einfacher, weil es nur einmal geändert werden muß.
Bascom bietet noch 2 weitere Möglichkeiten, den Code zu strukturieren: "Sub" und "Function". Darauf geh ich mal später drauf ein, sind jetzt noch nicht passend.
ich hab einen BlaulichtTiny neu in´s Programm aufgenommen. Der BlaulichtTiny steuert Rundumlichter und Frontblitzer an. Über das Empfängersignal kann zwischen Doppelblitz und klassischem Rundumlicht für die Rundumkennleuchten auf dem Dach gewählt werden. Für die Frontblitzer können 3 verschiedene Blinkmuster gewählt werden. Dazu müssen die LEDs am entsprechenden Pin des Tinys gelötet werden. Eine Auswahl zur Laufzeit ist hier nicht möglich.
Die Schaltfunktionen: 1x Links: Rundumlicht ohne Frontblitzer An/Aus 1x Rechts: Doppelblitz ohne Frontblitzer An/Aus 2x Links: Rundumlicht mit Frontblitzer An/Aus 2x Rechts: Doppelblitz mit Frontblitzer An/Aus 3x Links od. Lang links: Alles Aus 3x Rechts od. Lang rechts: Alles Aus
Standmodell-Funktion ist auch enthalten: wenn 1 Sekunde nach dem Einschalten kein Signal kommt, werden alle Funktionen eingeschaltet. Bleibt der Signal-Eingang offen, sind die Rundumlichter aktiv. Wird der Signal-Eingang mit GND verbunden, sind die Doppelblitzer aktiv. Der Signal-Eingang darf nicht direkt mit Plus verbunden werden !!!
Zu den Blinkmustern für die Frontblitzer: - Front 1 entspricht dem bekannten Doppelblitz - Front 2 hat schon fast amerikanischen Einfluß, hab ich aber auch in Youtube-Videos in Deutschland gesehen. Dort kommen erst 4 einzelne Blitze und dann ein Dreifachblitz - Front 3 ist wie der Doppelblitz, jedoch mit langsam Auf- und Abdimmenden Leuchten, z.B. in diesem Video.
Thema von diezel im Forum Bascom - Unser Einstei...
Hallo,
heute das Thema For-Next-Schleife. Kennen bestimmt einige von Euch z.B. aus VBA. Die vorgeschriebene Schreibweise in Bascom lautet:
1 2 3
FOR var = start TO end [STEP value] ... Next var
Dieses Konstrukt läßt einen Befehlsblock beliebig oft nacheinender ausführen. Dazu wird eine Variable von einem Startwert bis zu einem Endwert gezählt, die Schrittweite kann vorgegeben werden. Wird diese nicht angegeben, wird mit +1 gearbeitet. Die Variable kann natürlich innerhalb der Schleife verwendet werden. Hier mal ein Beispiel-Programm:
'*** Variablen definieren ****************************************************** Dim Raufrunter As Integer 'Integer kann Ganzzahlen von -32768 bis +32767 enthalten Dim Zaehler As Byte
'*** Hauptschleife ************************************************************* Portb.3 = 1 'LED an PB3 aus
Do 'Beginn Hauptschleife For Raufrunter = 1 To 10 'Schleife zählt von 1 bis 10 mit Schritt 1 Print Raufrunter Wait 1 Next Raufrunter
For Raufrunter = 10 To -10 Step -2 'Schleife zählt von +10 nach -10 mit Schritt -2 Print Raufrunter Wait 1 Next Raufrunter
For Zaehler = 2 To 7 Step 2 'Schleife zählt von 2 bis 7 in 2er-Schritten Portb.3 = 0 'LED kurz Ein Waitms 300 Portb.3 = 1 'LED wieder aus Waitms 500 Next Zaehler
Loop 'Ende Hauptschleife
End
Der Programmkopf dürfte klar sein. Die Variable Raufrunter hab ich als Integer dimensioniert, sie kann somit Ganzzahlen von -32768 bis +32767 enthalten.
Zeile 19 - 22 beschreibt eine Schleife, die die Variable von 1 bis 10 raufzählt, Schrittweite ist +1, weil nicht extra angegeben. Mit jedem Mal raufzählen werden die Befehle, die zwischen For und Next aufgeführt sind, jeweils mit der aktuellen Variable ausgeführt. Den Verlauf könnt ihr ja im Terminal beobachten, wenn die Prints ausgeführt werden.
Zeile 24 - 27 ist recht ähnlich, nur wird hier die Variable von +10 nach -10 runtergezählt. Will man, daß die Variable kleiner wird, sie muß dabei gar nicht ins Minus kommen, muß der angegebene Step-Wert negativ sein, bei uns im Beispiel Step -2. Die Variable wird also folgende Werte haben: 10, 8, 6, 4, 2, 0, -2, -4, -6, -8, -10.
Zeile 29 - 34 nutzt die For-Next-Schleife, um bestimmte Befehle mehrmals auszuführen, ohne dabei den Inhalt der Variablen zu benutzen. Wir lassen hier die LED an PB3 mehrmals aufblinken. Als gaaanz kleine Aufgabe für euch, zählt die Schleife von 2 bis 7 in Schrittweite 2. Wie oft wird die LED blinken?
Thema von diezel im Forum Bascom - Unser Einstei...
Hallo,
heute will ich euch mal zeigen, wie man auf bestimmte "Ereignisse" im Programm reagieren kann. Ereignisse für den µC sind eigentlich immer die Zustände an den Pins oder der Inhalt einer Variablen. Baut bitte wieder das STK auf und stellt alle Verbindungen her. Wie beim letzten Mal, verbindet bitte den Sockel mit der Beschriftung "LEDS" mit dem "PORTB" und den "SWITCHES" mit "PORTD" mit den Flachbandkabeln.
Bei Verwendung von Tastern ganz wichtig ist das Thema PullUps. Bin grad faul und zitier mich grad mal schnell selbst:
Zitat von diezel im Beitrag RE: [BEK03] der EinstiegFür den µC ist es wichtig, klare Verhältnisse vorzufinden. Stellt euch mal vor, er soll auf das Verändern eines Zustandes eines Pins reagieren, aber dieser Zustand ändert sich laufend. Das gibt nur Probleme. Um dies zu vermeiden werden große Widerstände gegen Plus geschaltet, die den Pin immer gegen VCC ziehen. Da der Widerstand aber recht groß ist, kann der Zustand des Pins leicht geändert werden, z.B. in dem ihn ein Schalter gegen GND zieht, der Strom, der durch den Widerstand nach VCC fließt, spielt dann keine Rolle mehr
Diese Pullups kann man wie schon gezeigt per Portregister intern im Atmega einschalten, oder man macht es extern, wie auf dem STK500 gemacht: [[File:switches.png|none|fullsize]] Das heißt für uns, daß der µC an seinem Eingang ein logisches High-Signal sieht, wenn der Taster NICHT gedrückt ist. Wird der Taster gedrückt, liegt ein Low-Signal an. Der µC schreibt uns diese Information dann in das entsprechende Register: PINx.y Beispiel an unserem Aufbau: wir beobachten den Taster, der an PinD.3 angeschlossen ist: Taster nicht gedrückt: PinD.3 = 1 Taster gedrückt: PinD.3 = 0 Also: Verdrehte Logik beachten!
Bei den LEDs gibt´s natürlich auch wieder was zu beachten. Lasten werden am µC bevorzugt über GND geschaltet. Damit will man die Versorgungsspannung des µC möglichst nicht mit externen Lasten beeinträchtigen. Was ich meine seht ihr am folgenden Bild: [[File:led.png|none|fullsize]] Quelle des Bildes: www.ne555.at Heißt für uns: Ist ein Ausgang auf High geschaltet, fließt kein Strom durch die LED, sie bleibt dunkel. Ist der Ausgang Low, kann der Strom durch den Atmega nach GND abfließen, sie leuchtet. Beispiel: die LED an PortB.3: PortB.3 = 1 --> LED leuchtet nicht PortB.3 = 0 --> LED leuchtet Also auch hier: Verdrehte Logik beachten!
Das Bild der Schalter hab ich wieder aus der Hilfe des AVR-Studios. Schadet nicht wenn ihr da mal durchblättert!
Thema von diezel im Forum Bascom - Unser Einstei...
Hallo,
ein wichtiges, aber auch oft heikles Thema, gerade wenn man nicht weiß was man tut. Darum nehmen wir dieses Thema gleich mal zu Anfang mit dran. Die Fusebits sind eine Art Grundeinstellung des µC, mit denen man bestimmte Funktionen einstellen kann. Heikel daran ist, daß man sich durch falsche Einstellungen "aussperren" kann, d.h. man kann mit dem normalen ISP nicht mehr drauf programmieren und somit auch nicht mehr die Fusebits ändern. Das STK500 bietet zwar noch die Möglichkeit der "High-Voltage"-Programmierung (nachfolgend "HV"-Programmierung" genannt) und hat auch noch 2 Taktquellen drauf, jedoch wenn der µC in der Zielschaltung verlötet ist, kann z.B. "High-Voltage"-Programmierung nicht mehr möglich sein. Hintergrund: während der HV-Programmierung liegen am Reset-Pin 12V an. Kann sein, daß dort angeschlossene Bauteile diese Spannung nicht überleben, oder andere Bauteile leiten die Spannung ab, so daß am µC nicht mehr die vollen 12V ankommen und damit die HV-Programmierung nicht mehr funktioniert. Also gaaaanz wichtig: bevor man an den Fuse-Bits was verstellt, !!!GEHIRN EINSCHALTEN!!!
Wenn man jedoch weiß was man tut, ist´s halb so schlimm.
Thema von diezel im Forum Bascom - Unser Einstei...
Hallo,
möchte mich bei Euch entschuldigen, der Start hat sich jetzt doch länger verzögert, als befürchtet. Hatte in letzter Zeit "paar" Probleme im Privaten, die mir einerseits kaum Zeit übrig gelassen haben und andererseits meinen Kopf für sich beansprucht haben. Aber jetzt soll es mal los gehen...
Ich möchte gleich mal mit diesem Programm starten, um es für Euch greifbarer zu gestalten:
'*** Variablen definieren ****************************************************** Dim Zaehler As Byte
'*** Hauptschleife ************************************************************* Do 'Beginn Hauptschleife Toggle Portb 'PortB Toggeln (Ein/Aus) Print "Hallo" '"Hallo" über die serielle schicken Incr Zaehler 'Variable Zähler um 1 erhöhen Print Zaehler 'Inhalt Zähler über serielle schicken Waitms 100 Loop 'Ende Hauptschleife
End
Nachfolgend kommen dann die Erklärungen zu den einzelnen Zeilen.
1. $regfile = "m8def.dat" Hiermit sagen wir Bascom, mit welchem Mikrocontroller wir arbeiten wollen. Bascom lädt dann diese Datei "m8def.dat", in der die Konfiguration für unseren Atmega8 enthalten ist. Schaut mal bei euch unter "C:\Programme\BASCOM-AVR_2_0_7_5". Dort sind etliche *.dat-Dateien enthalten, z.B. "ATtiny25.dat" für den Attiny25 "m8def.dat" für unseren Atmega8 "xm128a3def.dat" für den AtXmega128A3 die entsprechenden Brüder haben dann entsprechende Namen. Achtung: es gibt z.B. einen Atmega8A, dieser braucht dann die Datei "m8Adef.dat" der Atmega8L hingegen läuft mit dem normalen "m8def.dat". Es gibt keine "L"-Version der Dat-Datei, da die L-Version nur für niedrigere Spannungsbereiche spezifiert ist. Genauso ist beim Attiny25v.
2. $crystal = 1000000 dies gibt die Arbeitsfrequenz des µC an. (µC ist Abkürzung für Mikrocontroller) Bascom weiß nicht, wie der µC konfiguriert ist. Da gibt´s diverse Einstellmöglichkeiten, die wir später mal durchkauen. Die "1000000" entsprechen 1MHz, der Grundeinstellung des Atmega8.
Thema von diezel im Forum Bascom - Unser Einstei...
Hallo,
auf geht´s! Als erstes laden wir uns, wer es noch nicht gemacht hat, die aktuelle Bascom-Demo herunter und installieren diese: Link zur Bascom-Demo, dort auf "Download Demo now"
Dann geht´s weiter mit dem AVR-Studio. Dieses brauchen wir, da damit die Treiber-Software für´s STK installiert wird ("Jungo"-Treiber)und in der Hilfe des AVR-Studios eine Anleitung für´s STK500 beinhaltet. Nachfolgend der Link zur Version 4. Ist eine ältere Version, für die man sich noch nicht registrieren muß. Ist aber für uns ausreichend:Direktlink zum Atmel.com download
Weil wir grad am Downloaden sind, ist´s auch immer ganz nützlich, die Datenblätter der µC zur Hand zu haben. Atmega8 Datenblatt
mein aktuelles Werk: ich habe versucht die Funktion vom LichtBlinkTiny selbst zu programmieren und dabei aber den Mangel am Reset-Pin ausgemerzt. Wenn er schon nicht als Ausgangs-Pin taugt, dann nehm ich ihn halt als Eingang her. Somit reicht für ein normales Fahrzeug ein Tiny ohne Fets drauf, ist dann schöne 5x10mm klein. Und die LEDs werden wie üblich über GND geschaltet. Je Ausgangs-Pin können max. 40mA gezogen werden, der ganze Tiny kann gut 150mA abgeben. Sollte also reichen :-)
Hab den Tiny wie bei mir üblich nach einem möglichen Verwendungszweck genannt, “FeuerwehrTiny”.
Hier die Steuerungs-Mimik: 1x Links: Blinker links An/Aus 1x Rechts: Blinker rechts An/Aus 2x Links: Warnblinker An/Aus 2x Rechts: Licht An/Aus 3x Links: Blitzer als Rundumlicht An/Aus 3x Rechts: Blitzer als Doppelblitz An/Aus 4x Links: Alles Aus 4x Rechts: Alles Ein
Und im Anhang das Anschlußbild.
Hab mittlerweile paar Leute angeschrieben, die den Tiny testen. Wenn sich noch jemand berufen fühlt, bitte Melden!!! Der Tiny darf natürlich nach dem Test behalten werden!
Thema von diezel im Forum Bascom - Unser Einstei...
Hallo,
zur Vorbereitung auf den Kurs, hier die Beschreibung der BEVORZUGTEN Hardware. Wir hatten uns ja schon im Vorfeld auf das STK500 geeinigt. Auf diesem sollen dann mit dem Atmega8 die Grundlagen durchgearbeitet werden. Da wir für den Mikromodellbau wohl hauptsächlich später mit dem Attiny25 (8-Pins) oder Attiny24(14-Pins) arbeiten werden, hat Martin alias Xenton eine kleine Platine gelayoutet, mit der auf dem Ziel-Controller entwickelt werden kann. Link zum Beitrag Von der Nutzung dieser Platine als Einstiegs-Entwicklungs-Umgebung rate ich wegen fehlender serieller Schnittstelle ab, aber umso interssanter ist diese für spätere Entwicklungen. Nützlich dagegen ist der untere Teil seiner Platine, eine H-Brücke mit der ein Motor angesteuert werden kann. Der Aufbau einer solchen ist empfehlenswert. Ich habe Martin gerade gebeten, eine Bauteilliste zu erstellen. Paar Tinys würd ich mir gleich mal für später besorgen. Als Motor für Entwicklungen verwende ich gerne ein kleines und vor allem billiges Servo, bei dem die Elektronik entfernt ist und der Motor direkt mit meiner H-Brücke verbunden ist. Durch die große Getriebeübersetzung sind Drehbewegungen gut sichtbar.
Thema von diezel im Forum Bascom - Unser Einstei...
Hallo,
Sven, unser Cheffe, hat uns für den Bascom Einsteigerkurs ein eigenes Unterforum erstellt. Ich bitte euch der Übersichtlichkeit wegen, in diesem Unterforum nur Beiträge zu erstellen, die auch wirklich mit dem Kurs zu tun haben. Die Kursbeiträge werden im Titel immer mit [BEKxx] beginnen, wobei gilt : BEK = BascomEinsteigerKurs xx = vortlaufende Nummer Ich werde zum Ende dann noch ein Inhaltsverzeichnis erstellen, falls mal später jemand den Kurs selbst durcharbeiten möchte, und er/sie dann die Reihenfolge rausfindet.
ich schmeiß jetzt mal einfach eine Idee in den Raum. Bin gespannt auf Eure Antworten. Wer hätte Interesse an einem gemeinsamen Bascom-Kurs hier im Forum? Inhalte schlage ich auf den Mikromodellbau zugeschnitten vor. Ziel könnte der Open-Source-Fahrtregler und/oder ein Lichttiny sein. Die nötigen Funktionen würde ich dann Schritt für Schritt herleiten.
Wir müssten uns dann halt auf eine gemeinsame Entwicklungs-Umgebung einigen, damit auch jeder alles mitmachen kann und Hardware-Konflikte ausgeschlossen sind.
immer wieder mal kommt bei mir der Wunsch nach einer eigenen Modellbahn hoch. Nicht nur so ein kleines Modul, sondern schon bischen größer. Dafür durchsuche ich jetzt schon tagelang das Internet nach guten Beispielen, bin dabei aber noch nicht so richtig fündig geworden. Die meisten Modellbahner bauen doch mit Schwerpunkt Eisenbahn, Straßen dienen meist nur als Lückenfüller. Ich möchte aber viel mehr mit PKW, LKW und Baumaschinen drauf fahren und spielen. Eckdaten, die ich mir so vorstelle: Maßstab H0, Größe 2m x 4m
Wer kennt Bilder einer solchen Anlage die mir als Inspiration dienen könnte?
Als Beispiel nenn ich mal die Bahn von Alex alias Menck M90, die für mich aber schon zu groß wäre. Er hat, wie ich finde, den Spagat zwischen Schiene und Straße super umgesetzt. Von der technischen und optischen Umsetzung ganz zu schweigen Eine Modellbahn mehr in diesem Forum
den ideal passenden Lipo zu finden ist immer blöd. Hab mir heute gedacht, eine Excel-Tabelle wäre toll. Im Anhang der erste Entwurf. Bisher hab ich folgende Shops mit aufgenommen: - Sol-Expert - Mikroantriebe.de - Mikromodellbau.de - Hobbyking.com - epp-fly.de
Wer kennt noch gute Quellen, die ich mit aufnehmen soll?
Gruß Gerhard
P.S.: für alle Nicht-Excel-Benutzer hab ich auch eine PDF erstellt. Dort fehlt halt die Sortiermöglichkeit von Excel
gerade von der Rückseite bin ich irgendwie enttäuscht. Diese paßt in meinen Augen nicht zum Vorderwagen, der einen moderneren Eindruck macht. Bild ich mir das nur ein, oder gibt´s sowas auch in Echt? Bei meiner Internet-Recherche bin ich nur auf sowas gestoßen:
Was würdet´s ihr tun? So bauen wie Herpa es verkauft, oder auf modern bauen so wie das Beispiel oben? 2te Frage: woraus könnte ich die hinteren Blaulichter herstellen? ich bräuchte da irgendwie blau eingefärbtes Plexiglas. Wer hat nen Tipp???