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.
6. $baud = 4800 die Geschwindigkeit, mit der Daten über die serielle Schnittstelle geschickt werden. Dazu sind noch Einstellungen in den Bascom-Optionen nötig: bascom comm.png - Bild entfernt (keine Rechte) hier wichtig, den richtigen Com-Port einzutragen (im Geräte-Manager zu finden). Den Rest einfach abschreiben :-)
Morgen früh geht´s weiter, versprochen!!!
Gruß Gerhard
Nachtrag: die Baudrate und die Taktfrequenz des µC müssen ziemlich genau zusammenpassen, sonst ergeben sich Abweichungen in den Geschwindigkeiten zwischen dem, was gesendet wird und dem, mit welcher Geschwindigkeit der Empfänger die Daten haben möchte. Bei zu großer Abweichung klappt dann die Datenübertragung nicht mehr. Darum habe ich im Beispielprogramm und auch in den Bascom-Optionen die Baudrate gegenüber dem ursprünglichen Post herabgesetzt. Hier ein paar Beispiele, wie weit man da daneben liegen kann: Taktrate 1MHz, Baudrate 19200 -> Abweichung 7,84% Taktrate 1MHz, Baudrate 4800 -> Abweichung 0,16%
Wer es ganz genau haben möchte, der nimmt am Besten einen externen Quarz, der genau hierfür ausgelegt ist. Diese nennt man Baudratenquarz. Sie haben eine Frequenz von 3,6864 MHz oder einem vielfachen davon.
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
9. Config Portb = Output Hier wird dem µC gesagt, daß er alle Pins des PortB auf „Ausgang“ setzt. Dahinter steckt aber noch mehr, wir müssen dazu mal gaaanz vorne anfangen: Der µC speichert alle Daten, Einstellungen usw. in „Register“. Der Inhalt dieser Register entspricht einer Binärzahl mit 8 Bit. Das Binär-Zahlensystem dürfte Euch schon bekannt sein, das ist das Zahlensystem im dem es nur die Ziffern 0 und 1 gibt. Beispiele in Dezimal und Binär: 0 = 00000000 1 = 00000001 2 = 00000010 255 = 11111111
Damit Bascom die Zahlensysteme auseinanderkennt, muß bei Binärzahlen ein „&B“ vorausgestellt werden. Hexadezimale Zahlen werden mit „&H“ gezeichnet, verwende ich aber ganz ungern, da ich mir darunter einfach nix vorstellen kann. Dezimalzahlen werden ohne einer solchen Kennung eingegeben. Beispiel:
1
159 = &B10011111 = &H9F
Um jetzt wieder zu den Ein- und Ausgängen zu kommen: wenn Bascom diese „Config PortB = Output“ liest, schreibt es in das entsprechende Register, in dem die Information gespeichert wird, die passenden Daten rein. Dieses Register heißt „DDRB“, DataDirectionRegister für PortB. Darin ist für jeden Pin des PortB gespeichert, ob dieser als Ein- oder Ausgang fungiert. In unserem Beispiel:
1
DDRB = &B11111111
Heißt für uns, wenn an eine Stelle eine 1 geschrieben wird, wird dieser Pin als Ausgang geschaltet, eine 0 bedeutet Eingang. Das Bit für den Portb.0 ist das ganz rechte, das für den PB7 ist ganz links.
Wir könnten auch schreiben:
1 2 3
Config Portb.1 = Output ' oder so: DDRB.1 = 1
Hier wird nur der Pin PB1 auf Ausgang gestellt, der Rest der Pins wird nicht verändert.
Achtung: Wollen wir einen Pin als Eingang definieren, darf man nicht Port sondern muß PIN schreiben:
1
Config Pinb.1 = Input
Welche Schreibweise ihr jetzt für Euch bevorzugt, bleibt euch überlassen. Ich mach ganz gern die binäre Schreibweise direkt in´s Register, ist für mich übersichtlicher. Im Hinterkopf könnt ihr Euch auch mal merken, daß diese Konfiguration zur Laufzeit verändert werden kann.
In unserem Beispiel nicht enthalten, aber ganz passend dazu ist das Thema „Pullups“: Fü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. Um den PinB.1 als Eingang mit aktiviertem PullUp zu definieren, schreibt man:
1 2
Config Pinb.1 = Input Portb.1 = 1
Beachtet hier die verschiedenen Schreibweisen PIN und PORT.
Hier in Binärer Schreibweise direkt in´s Register:
1 2
DDRB.1 = 0 Portb.1 = 1
Weiteres Beispiel, ganzer PortB als Eingang mit PullUp:
1 2
Config Pinb = Input PortB = &B11111111
Das alles kann man 1 zu 1 auf andere Ports übertragen, je nachdem welcher µC verwendet wird. Beim Atmega 8 gibt es also auch noch DDRC, Portc, DDRD und Portd !!!
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
12. Dim Zaehler As Byte jetzt sind wir bei den Variablen angekommen. Eine Variable ist der Name für einen Speicherbereich. Wo dieser zu finden ist, braucht uns nicht zu kümmern, das übernimmt Bascom für uns. Wir müssen nur noch den Variablentypen definieren. In Bascom gibt´s: - BIT: besteht aus nur einem Bit und kann 0 oder 1 enthalten - BYTE: besteht aus 8 Bit und kann Ganzzahlen von 0 bis 255 enthalten - WORD: besteht aus 16 Bit und kann Ganzzahlen von 0 bis 65535 enthalten - INTEGER: besteht aus 16 Bit und kann Ganzzahlen von -32768 bis +32767 enthalten - LONG: besteht aus 32 Bit und kann Ganzzahlen von -2147483648 bis 2147483647 enthalten - SINGLE: besteht aus 32 Bit und kann Fließkommazahlen von 1,5 x 10^–45 bis 3,4 x 10^38 enthalten - DOUBLE: besteht aus 64 Bit und kann Fließkommazahlen von 5,0 x 10^–324 bis 1,7 x 10^308 enthalten - STRING: Dieser Datentyp kann Text mit der Länge von bis zu 254 Zeichen enthalten.
Besonderheit hier stellt der Datentyp String dar, denn man muß noch die Länge des Strings definieren, für den der Platz reserviert werden muß. Die Definition sieht z.B. so für eine Stringvariable aus, in der Text mit 5 Zeichen gespeichert werden kann:
1
DIM Text as String * 5
Als weiteres gibt´s noch die Möglichkeit, Arrays zu definieren:
1
DIM Byte_array(3) as Byte
Hier werden mehrere gleichnamige Variablen angelegt, in unserem Beispiel 3. Diese kann man z.B. so ansprechen:
15. Do ... 21. Loop das Do-Loop bezeichnet Anfang und Ende einer endlosen Schleife, die immer wieder abgearbeitet wird. Kommt in den allermeisten Programmen vor. Wenn sich z.B. Variablen zur Laufzeit verändern, können auch andere Aufgaben erledigt werden.
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
16. Toggle Portb das ist der erste "richtige" Befehl, den wir kennenlernen. Toggle bedeutet, invertier den Inhalt einer Speicherzelle: mach aus ner 0 eine 1 oder umgekehrt (Binärsystem!!!) Wendet man das Toggle auf ein einzelnes Bit an, invertiert es dieses eine Bit, könnte z.B. ein einzelner Pin des Ports B sein:
1
Toggle Portb.1
oder bei einer Bit-Variablen
1 2
Dim Testbit as Bit Toggle Testbit
oder man wendet es auf ein ganzes Byte an:
1 2 3 4
Dim Testbyte as Byte Testbyte = &b01010101 Toggle Testbyte 'Ergenis: Testbyte = &b10101010
genausogut könnte man auch nur ein einzelnes Bit des Testbytes umdrehen:
1 2 3 4
Dim Testbyte as Byte Testbyte = &b01010101 Toggle Testbyte.0 'invertiere nur das letzte Bit vom Testbyte 'Ergenis: Testbyte = &b01010100
in unserem Beispiel "Toggle Portb" bedeutet dies, daß bei Programmstart alle Register auf &b00000000, also alle Ausgänge auf Low stehen. Nach dem toggeln: &b11111111, sind also Ausgänge auf High geschaltet.
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
17. Print "Hallo" heißt: schicke das Wort "Hallo" über die serielle Schnittstelle raus. Gerne wird auch der Begriff UART, "Universal Asynchronous Receiver Transmitter". Dieser UART sendet Daten an die RS-232-Schnittstelle Eures PCs, auf die Ihr dann über die COM-Schnittstelle zugreifen könnt. Zum Anzeigen auf dem PC braucht ihr dann ein Hyperterminal-Programm, oder ihr verwendet das Hyperterminal von Bascom, genannt "Terminal Emulator". Dies öffnet ihr im Menü unter "Werkzeuge", oder ihr sucht das entsprechende Symbol in der Symbolleiste. Die nötigen Einstellungen haben wir in den Optionen schon gemacht.
[Hintergrundwissen EIN] Beim senden des "Hallo" wird jeder Buchstabe einzeln gesendet, und zwar als ASCII-Code. Als Abschluß jeder Datenübertragung folgt noch ein "Carriage Return" (entspricht dem Wagenrücklauf bei den alten Schreibmaschinen) und ein "Line Feed" (neue Zeile). Dies dient dazu, das Ende einer Übertragung zu erkennen. [Hintergrundwissen AUS]
Mit "Hallo" haben wir einen String gesendet, genausogut kann man auch einen numerischen Wert übertragen, z.B. den Inhalt eines Bytes. Da wären wir dann wie im Beispiel beim
1
Print Zaehler
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
@Michael: warte kurz, 2 Befehle kommen noch schnell:
18. Incr Zaehler ein ganz einfacher Befehl: erhöhe den Inhalt einer Variablen um 1. Im Beispiel wird die Variable "Zaehler" hochgezählt. Wer lang genug zusieht, wird bemerken, daß irgendwann folgende Zählfolge kommt: ... 253, 254, 255, 0, 1, 2 ... das liegt daran, daß die Variable "Zaehler" nur als Byte dimensioniert ist. Es kann also nur Zahlen von 0 bis 255 enthalten. Beim "Überlauf" geht´s wieder bei 0 los. Behaltet Euch das im Hinterkopf, ist eine häufige Fehlerquelle!!!
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
20. Waitms 100 der Wait-Befehl bedeutet wie zu erwarten: Warte eine bestimmte Zeit. Das Programm wird an dieser Stelle einfach gestoppt. Wenn die Arbeitsfrequenz des µC und die Angabe bei $Crystal übereinstimmen, stimmt diese Zeit auch ziemlich genau.
Zitat von Tüftler_Senior im Beitrag #7sehe aber nur Zeichen im Terminal! Keinen Wert noch das Hallo
sieht für mich aus, als würde irgend eine Geschwindigkeit nicht stimmen. Entweder Du hast in den Fusebits schon ne andere Frequenz eingestellt oder die Baudrate paßt nicht zusammen. Hab´s grad bei mir getestet, hier läuft´s wie erwartet.
Edit: hab im letzten Post der Vollständigkeit halber noch das "End" ergänzt.
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
für all die anderen heißt´s jetzt, das Programm aus dem ersten Post in Bascom reinzukopieren, dann auf "Compile Program" drücken. Jetzt will Bascom die Datei speichern. Sucht euch einen passenden Ordner und Dateinamen aus. z.B. BEK03.bas Danach compiliert Bascom den Basic-Code nach AVR-Maschinencode.
Jetzt geht´s noch drum, das Programm in den µC zu übertragen. Drückt dazu auf die übernächste, die grüne Schaltfläche bei der beim drüberfahren "Programm chip (F4)"
Sobald ihr die Stromversorgung auf dem STK hergestellt habt, die LEDs mit dem Portb verbunden sind und die Pins PD0 und PD1 mit RX und TX verbunden sind, solltet ihr im Bascom-Terminal abwechselnd "Hallo" und eine steigende Zahl lesen und die LEDs sollten blinken.
Jetzt versucht mal die einzelnen Befehle zu verstehen und beginnt mal mit dem Experimentieren. Z.B. den Befehl "Incr" durch "Decr" ersetzen (Decr heißt eins runter zählen) Oder schreibt mal in Zeile 10
1
Portb = &b01010101
oder ersetzt mal Zeile 16:
1
Toggle Portb.1
oder mal die "Zaehler"-Variable z.B. als Word dimensionieren. Dazu am besten noch den Waitms ganz klein oder ganz raus werfen.
Beobachtet was jeweils passiert und versucht zu verstehen was und warum es passiert.
Bitte um Rückmeldung!!!
Gruß Gerhard
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
die Low-Fuses mit 0xEO heißt, daß Du auf externe Clock gestellt hast. Du hast also eine Taktquelle dran, die die Frequenz vorgibt. Ändere doch die Low-Fuses auf 0xE1, dann läuft er mit internen 1MHz. High-Fuse kannst Du lassen.
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
Hallo Gerhard, schön das es weiter geht (Familie und so geht halt vor) Deine Erklärungen sind sehr gut, auch wenn es blutige Anfänger etwas abschrecken könnte, bei den vielen neuen Begriffe. Also wer bis hier her gelesen hat, lasst Euch nicht abschrecken. Mit ein bissel Übung und Experimentierlust kann das eigentlich jeder lernen.
@Gerhard, Wir(Martin Kai....) haben ein kleines Privates Forum vom selben Anbieter wie dieses hier. Dort ist mir aufgefallen das Texte die in den Code Tags geschrieben werden, am rechten Rand abgeschnitten werden. Damit gehen dann sehr oft die Kommentare flöten. Gerade für ein Einsteiger sind die Kommentare natürlich wichtig. Darum meine Bitte, die Testprogramme als Text Datei mit hoch zu laden (.txt da .bas nicht zulässig ist im Forum)