Sie sind vermutlich noch nicht im Forum angemeldet - Klicken Sie hier um sich kostenlos anzumelden Impressum 
Sie können sich hier anmelden
Dieses Thema hat 16 Antworten
und wurde 4.503 mal aufgerufen
 Bascom - Unser Einsteigerkurs
Seiten 1 | 2
diezel Offline



Beiträge: 709

18.01.2013 00:09
[BEK03] der Einstieg Antworten

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
$regfile = "m8def.dat"                                      'Mikrocontroller ist Atmega 8
$crystal = 1000000 'Arbeitsfrequenz 1 MHz
$hwstack = 40 'Hardware-Stack
$swstack = 32 'Software-Stack
$framesize = 60 'Frame
$baud = 4800 'serielle Übertragungsgeschwindigkeit
 
'*** Ein/Ausgänge deklarieren **************************************************
Config Portb = Output 'ganzer PortB als Ausgang
 
'*** 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.

3. $hwstack = 40
4. $swstack = 32
5. $framesize = 60

hiermit wird der interne Speicher verteilt. Dies jetzt schon zu erklären wäre zu früh, heben wir uns für später auf. Wer es wissen will, kann z.B. hier mal spicken:
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/speicher_hwstack_swstack_frame/

-------------------------------------------------------------------------------------------
hier mein aktueller TinyKatalog


diezel Offline



Beiträge: 709

18.01.2013 00:19
#2 RE: [BEK03] der Einstieg Antworten

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


diezel Offline



Beiträge: 709

18.01.2013 12:05
#3 RE: [BEK03] der Einstieg Antworten

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


diezel Offline



Beiträge: 709

18.01.2013 12:30
#4 RE: [BEK03] der Einstieg Antworten

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:

1
2
3
 
Byte_array(1) = 100
Byte_array(2) = 123
Byte_array(3) = 5
 


Vorteil ist, daß es dadurch übersichtlicher werden kann und das man diese z.B. in Schleifen direkt ansprechen kann:

1
2
3
 
For I = 1 To 3
Byte_array(I) = 100
Next I
 


(Dieses Beispiel macht wohl keinen Sinn, aber ihr seht wohl auf was ich rauswill).

Mahlzeit...

-------------------------------------------------------------------------------------------
hier mein aktueller TinyKatalog


diezel Offline



Beiträge: 709

18.01.2013 21:21
#5 RE: [BEK03] der Einstieg Antworten

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


diezel Offline



Beiträge: 709

18.01.2013 21:38
#6 RE: [BEK03] der Einstieg Antworten

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


Tüftler_Senior Offline




Beiträge: 79

18.01.2013 21:40
#7 RE: [BEK03] der Einstieg Antworten

Hallo Gerhard

Habe jetzt gerade gesehen das es weiter geht!

Das Programm ist aufgespielt die Pin`s PD0 mit RXD
und PD1 mit TXD verbunden, sehe aber nur Zeichen im Terminal!
Keinen Wert noch das Hallo

Gruß Michael


diezel Offline



Beiträge: 709

18.01.2013 22:10
#8 RE: [BEK03] der Einstieg Antworten

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


diezel Offline



Beiträge: 709

18.01.2013 22:19
#9 RE: [BEK03] der Einstieg Antworten

@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


diezel Offline



Beiträge: 709

18.01.2013 22:24
#10 RE: [BEK03] der Einstieg Antworten

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.

Den Wait-Befehl gibt´s für 3 Zeitbasen:
"Wait 1" bedeutet: Warte 1 Sekunde
"Waitms 1" bedeutet: warte 1 Millisekunde
"Waitus 1" bedeutet: warte 1 Mikrosekunde


23. End
dies bezeichnet das Ende des Hauptprogramms. Unterprogramme werden dahinter geschrieben.

-------------------------------------------------------------------------------------------
hier mein aktueller TinyKatalog


diezel Offline



Beiträge: 709

18.01.2013 22:36
#11 RE: [BEK03] der Einstieg Antworten

Zitat von Tüftler_Senior im Beitrag #7
sehe 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


diezel Offline



Beiträge: 709

18.01.2013 23:00
#12 RE: [BEK03] der Einstieg Antworten

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


Tüftler_Senior Offline




Beiträge: 79

18.01.2013 23:13
#13 RE: [BEK03] der Einstieg Antworten

Hallo Gerhard

Habe mir mit AVR Studio die Fuse Bits angeschaut.
High ist 0xD9
LOW ist 0xEO

Kannst du mir sagen ob die Werte stimmen??

Gruß Michael


diezel Offline



Beiträge: 709

18.01.2013 23:41
#14 RE: [BEK03] der Einstieg Antworten

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


Scotch Offline




Beiträge: 415

19.01.2013 09:27
#15 RE: [BEK03] der Einstieg Antworten

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)

PS. Dein Testprogramm läuft bei mir.
Gruß Ingo

------------------------------------------

Meine Webseite


Seiten 1 | 2
 Sprung  

disconnected Mikromodell-Chat Mitglieder Online 3
Xobor Xobor Community Software
Datenschutz