Anmeldungsdatum: 03.12.2006 Beiträge: 1195 Wohnort: Klinik der misshandelten Kuscheltiere
Verfasst am: So 09.März 2008 21:16:18 Titel:
Ich nochmal
Ich habe mir grad vor ein paar Tagen das Arduino Board (das alte einseitige) nachgebaut .
Das läuft mit einem ATmega 8 und es gibt eine menge Aufsteckboards (shields genannt) und auch fertige Anwendungen und Entwicklungssoftware im Netz.
Am besten gefällt mir das Programmpaket 'Liberlab' ,es liest 4 ADC kanäle und 6 IO Pins mit 56700 baud über die serielle Schnittstelle und stellt das in einer schönen Grafischen anwendung auf dem PC - (mac) in windoof oder linux dar . Diese erfordert allerdings die Installation von Pyhton auf dem Rechner dafür bringt das dann aber 500 messungen in der Sek. (theoretisch). Es ist zwar nicht direkt für den Arduino geschrieben aber geht trotzdem super.
Ich betreibe das mit einem Bootloader über rs232 ,sodas man zum programmieren kein extra Programmiergerät benutzen muss.
Ich muss nooch anmerken das ich nicht die Programmierumgebung/programmiersprache von Arduino benutze,weil das einfach zuviel wäre nu noch irgend so ein prohibitäres c++/basic gemisch reinzuziehen. Aber man findet doch schon einige nette Lösungen oder anregungen für eigene Entwicklungen .
http://www.liberlab.net/ ' homepage von liberlab ,franz. + eng. _________________ Eine Weiterverbreitung ohne ausdrückliche Genehmigung ist untersagt. Für Schäden, lehnen wir jegliche Haftung ab.
PS: Dieses "liberlab" behalte ich mir im Hinterkopf. Das scheint ein recht interessantes Stück Software zu sein. _________________ http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Zuletzt bearbeitet von gerold am Mo 10.März 2008 10:27:41, insgesamt 2-mal bearbeitet
Anmeldungsdatum: 27.07.2007 Beiträge: 925 Wohnort: Oberhofen im Inntal (Tirol)
Verfasst am: So 09.März 2008 21:59:42 Titel: Hallo Welt
Hallo!
Jetzt, da Bascom installiert ist, der Programmer funktioniert und geklärt wurde, wie der AVR-µC angeschlossen werden muss, könnte man schon mal mit einer kleinen "Hallo Welt"-Anwendung los legen.
Ich möchte dich aber vorher nochmal kurz mit ein wenig Theorie langweilen. Es geht darum, wie so ein AVR-Controller die Aussenwelt sieht und wie man diese beeinflussen kann. Es geht darum, wie man einen Pin als Eingang oder als Ausgang verwenden kann.
In den AVR-µControllern wird jede Information im Speicher abgelegt. Ob an einem Pin ein Signal anliegt oder ob ein Analog-Digital-Wandler herausfinden soll, wieviel Volt an einem Pin anliegen -- alles steht im Speicher. Man kann diesen Speicher auslesen und man kann in diesen Speicher schreiben. Um sich die Adressen der Speicherbereiche nicht merken zu müssen, wurden den einzelnen Speicherbereichen Namen gegeben. Diese Speicherbereiche nennt man REGISTER. Ein Register enthält acht einzelne Ja/Nein-Werte (Bit). Deshalb nennt man die AVR auch 8-Bit Mikrocontroller.
8 Bit = 1 Byte = 1 Register
Und auch für die Pins gibt es solche Register. Es wurden immer bis zu acht Pins zusammengelegt und können über ein dafür festgelegtes Register angesprochen werden. Diese Register nennt man I/O-Register (Input/Output).
Der ATmega8 hat drei solche Register die für die Pins zuständig sind. Das sind PORTB, PORTC und PORTD. Und das muss man sich noch merken: Wenn man aus diesen I/O-Registern etwas lesen möchte, dann spricht man sie nicht mit PORTx, sondern mit PINx an. PINB, PINC und PIND.
In diesem Bild wird statt PORT/PIN einfach "P" verwendet.
Die einzelnen Pins werden mit 0 beginnend numeriert. So ist PORTB.0 die Adresse mit der man den Status des Pins PB0 setzen kann. Und mit PINB.0 liest man aus, ob am Pin PB0 ein HIGH oder LOW anliegt. Ach ja, das hätte ich fast vergessen: Wenn ich von HIGH und LOW schreibe, dann meine ich damit, dass entweder Spannung an den Pin gelegt wird (HIGH) oder der Pin gegen GND gezogen wird (LOW).
Wenn ich in Bascom PB0 auf HIGH setzen möchte, dann schreibt man:
Code:
PORTB.0 = 1
Mit diesem Befehl setzt man PB0 auf LOW:
Code:
PORTB.0 = 0
Und wenn ich z.B. PB1 auf HIGH setzen möchte, wenn PB0 LOW ist und umgekehrt, dann sieht das so aus:
Code:
IF PINB.0 = 0 THEN
PORTB.1 = 1
ELSE
PORTB.1 = 0
END IF
Bevor man allerdings mit einem der Pins arbeitet, muss man festlegen, welche Pins eines PORTs Eingänge und welche Ausgänge sind. Wenn man nichts verändert, dann sind nach dem Start des Programms alle Pins Eingänge.
Ob ein Pin des PORTB ein Eingang oder ein Ausgang ist, wird im Register DDRB gespeichert. Jeder Pin entspricht einem Bit dieses Registers. So gibt es für den ATmega8 noch die Register DDRC und DDRD in denen die Ausrichtungen der Pins gespeichert werden. DDR steht hier für "Data Direction Register".
Diese Anweisung kennzeichnet PB1 und PB2 als Ausgänge. Alle anderen Pins bleiben Eingänge.
Code:
DDRB = &B00000110
Erst jetzt kann mit ``PORTB.1 = 1`` der Pin PB1 auf HIGH gesetzt werden.
Es gibt noch eine andere Art, einen Pin als Eingang oder als Ausgang zu kennzeichnen.
Manchmal ist es einfacher, wenn man es so macht und manchmal ist es einfacher, wenn man direkt in das DDRx-Register schreibt. Das muss man selber entscheiden.
Mit diesem Wissen könnte man also schon eine LED anschließen und ein- bzw. ausschalten. Jetzt fehlt uns nur noch das Grundgerüst des Programms.
Minimales Grundgerüst eines Programms:
Code:
$regfile = "M8def.dat" 'es handelt sich um einen ATmega8
$crystal = 1000000 'der eingebauter RC-Oszillator läuft mit 1 Mhz
$hwstack = 32 'im Speicher werden für den Hardware-Stack 32 Byte reserviert
$swstack = 10 'im Speicher werden für den Software-Stack 10 Byte reserviert
$framesize = 40 'im Speicher werden für den Frame 40 Byte reserviert
Ddrb = &B00000010 'PB1 ist Ausgang. Die anderen Pins sind Eingänge
Portb.1 = 1 'Signal auf PB1 einschalten (HIGH)
End 'Ende des Programms
Dieser Code schaltet PB1 auf HIGH. Damit könnte an PB1 eine LED angeschlossen werden und sie würde leuchten.
Ein Pin des ATmega8 kann mit bis zu 40 mA belastet werden. Allerdings darf die Gesamtbelastung des ATmega8 (je nach Gehäusetyp) nicht über 200 mA steigen. Es gibt da auch noch Unterschiede zwischen den einzelnen Anschlüssen. Wer es genau wissen will, sollte ins Datenblatt schauen. Eine LED würde also leuchten. Aber um den µC zu schonen, sollte man einen Pin nicht immer unter Vollast betreiben. Wenn schon direkt eine LED angeschlossen werden soll, dann bitte eine Low Current LED.
Ich muss jetzt Schluss machen. Morgen geht es mit diesem "Hallo Welt"-Programm weiter. Dann erkläre ich wie man das Programm eingibt, abspeichert, kompiliert und zum µC überträgt. Ich werde dann auch genauer auf das Programm-Grundgerüst eingehen und einen Schaltplan für den Anschluss einer LED zeichnen.
Anmeldungsdatum: 27.07.2007 Beiträge: 925 Wohnort: Oberhofen im Inntal (Tirol)
Verfasst am: Mo 10.März 2008 10:19:48 Titel: mySmartUSB mit Bascom
Hallo!
Ich habe vor ein paar Tagen ein Email an den mySmartUSB-Support geschrieben. Dieses möchte ich euch nicht vorenthalten:
Frage:
Zitat:
Hallo!
Ich bin gerade dabei, eine Anleitung für AVR-Beginner zu schreiben.
Jetzt fehlt mir noch die Information, wie lange es noch dauern wird, bis
das "myAVR ProgTool" auch *per Kommandozeilenparameter* zum Übertragen
von HEX- oder BIN-Dateien herangezogen werden kann. In der Hilfe steht
zumindest, dass daran gearbeitet wird. Und viele Bascom-Benutzer warten
schon sehr darauf.
Es geht mir besonders um die Einbindung des mySmartUSB in Bascom. Diese
läuft ja derzeit über die Einstellung "AVR ISP Programmer". Das ist
nicht besonders schnell. Schneller geht es mit dem "myAVR ProgTool",
aber dieses Tool nimmt noch keine Kommandozeilenparameter an, so dass
man den Pfad zu den HEX-Dateien nicht beim Aufruf übergeben kann.
Ich wäre ihnen sehr dankbar, wenn sie mir mitteilen könnten, wie lange
es noch dauern wird, bis diese Möglichkeit in das "myAVR ProgTool"
eingebaut ist, oder ob es gute Alternativen gibt, die ich in meinem
Tutorial ansprechen kann.
mfg und vielen Dank,
Gerold Penz
Antwort:
Zitat:
Hallo Herr Penz,
sie können das "myAVR ProgTool" auch jetzt schon als externen Programmer
einstellen. Sie müssen dann lediglich beim ersten brennen eines
Projektes die zu brennende(n) Datei(en) auswählen.
Das ProgTool soll jetzt noch eine bessere Konfiguration für Fuse- und
Lock-Bits erhalten. Es wird also noch so 2-3 Wochen dauern, bis es eine
neue Version gibt.
Anmeldungsdatum: 27.07.2007 Beiträge: 925 Wohnort: Oberhofen im Inntal (Tirol)
Verfasst am: Mo 10.März 2008 17:40:43 Titel: Hallo Welt - Fortsetzung
Hallo!
In diesem Beitrag möchte ich erklären, wie man das Programm eingibt, speichert, kompiliert und zum µC überträgt.
Starte Bascom-AVR. Über das Menü "Datei/Neu" wird ein neues Programm erstellt. Damit hast du in der linken Seite schon mal ein weißes Fenster in das du den Programmcode eingeben kannst. Gib diesen Code ein:
Code:
$regfile = "M8def.dat" 'es handelt sich um einen ATmega8
$crystal = 1000000 'der eingebaute RC-Oszillator läuft mit 1 Mhz
$hwstack = 32 'im Speicher werden für den Hardware-Stack 32 Byte reserviert
$swstack = 10 'im Speicher werden für den Software-Stack 10 Byte reserviert
$framesize = 40 'im Speicher werden für den Frame 40 Byte reserviert
Ddrb = &B00000010 'PB1 ist Ausgang. Die anderen Pins sind Eingänge
Portb.1 = 1 'Signal auf PB1 einschalten (HIGH)
End
Speichere das Programm unter dem Namen "hallo_welt_v01.bas" in den Ordner Eigene Dateien\Bascom-Programme\Hallo Welt\ ab.
Wenn du nun auf das Symbol zum Kompilieren klickst, dann wird das Programm in Maschinensprache umgewandelt.
Im Ordner Eigene Dateien\Bascom-Programme\Hallo Welt\ befinden sich nun ein paar Dateien mehr. Die HEX-Datei und die BIN-Datei enthalten jetzt das fertige Programm. Dieses muss jetzt nur noch zum µC übertragen werden.
Dafür müssen wir den µC über den Programmer an den Computer anschließen. Ich nehme für solche Testaufbauten gerne ein Steckbrett (Breadboard). Damit kann man die Schaltung recht einfach aufbauen und testen. Wenn man schon ein Experimentierboard wie das von Roland Walter oder das "ATMEL Evaluations-Board Version 2.0" von Pollin hat, dann sind solche Aufbauten noch viel einfacher. Dann muss man sich nicht mehr um so grundlegende Dinge wie Stromversorgung und Stecker für den Anschluss des Programmers kümmern.
Diese Schaltung sieht auf einem Steckbrett so aus:
Wenn der mySmartUSB in den Programmiermodus geschalten wurde, dann leuchtet die rote LED auf dem Programmer auf (das wurde in einem der vorherigen Beiträge erklärt).
Mit einem Klick auf die grüne Schaltfläche sollte das Übertragen des Programms beginnen. Und wenn alles geklappt hat, dann sollte jetzt auch die Low Current LED leuchten. "Hallo Welt!"
Ich denke mal, dass jetzt ein paar Fragen auftauchen könnten. Dann mal raus damit.
Anmeldungsdatum: 27.07.2007 Beiträge: 925 Wohnort: Oberhofen im Inntal (Tirol)
Verfasst am: Mo 10.März 2008 18:15:59 Titel:
Hallo!
Dieses Beispiel kann man natürlich auch ein wenig ausbauen:
Code:
'es handelt sich um einen ATmega8
$regfile = "M8def.dat"
'der eingebaute RC-Oszillator läuft mit 1 Mhz
$crystal = 1000000
'im Speicher werden für den Hardware-Stack 32 Byte reserviert
$hwstack = 32
'im Speicher werden für den Software-Stack 10 Byte reserviert
$swstack = 10
'im Speicher werden für den Frame 40 Byte reserviert
$framesize = 40
'PB1 ist Ausgang. Die anderen Pins sind Eingänge
Ddrb = &B00000010
Do
'PB1: Signal einschalten (HIGH)
Portb.1 = 1
'Eine Sekunde Warten
Wait 1
'PB1: Signal ausschalten (LOW)
Portb.1 = 0
'Eine Sekunde Warten
Wait 1
Loop
'Ende des Programms
End
Und hier sieht man auch wie ein Programm normalerweise aufgebaut ist. Jedes Programm hat eine MainLoop -- eine Hauptschleife. Das Programm in der Hauptschleife wird so lange wiederholt, bis entweder Reset gedrückt wird oder der µC keinen Strom mehr bekommt.
Anmeldungsdatum: 27.07.2007 Beiträge: 925 Wohnort: Oberhofen im Inntal (Tirol)
Verfasst am: Di 11.März 2008 08:01:47 Titel: Größere Last über einen Transistor anschließen
Hallo!
Wenn man nicht nur eine Low Current LED anschließen möchte, dann muss man das Ausgangssignal verstärken. Das Einfachste ist, wenn man einen Transistor zum Verstärken verwendet.
Folgender Schaltplan zeigt auf, wie man eine normale 20 mA LED an den µC anschließen kann.
R3 habe ich im Schaltplan mit "1k - 10k" angegeben. Das hat einen Grund.
Ist ein als Ausgang definierter Pin des µC auf LOW geschaltet, dann zieht dieser Pin gegen GND. Das hat den Vorteil, dass man die Basis des Transistors nicht zusätzlich über einen Widerstand gegen GND ziehen muss um diesen zu entstören. Bei einem 2N2222-Transistor genügt ein 10k-Widerstand um die LED in voller Stärke leuchten zu lassen. Aber bei 10k ist die Basis des Transistors nicht so stark entstört wie es bei einem 1k-Widerstand der Fall wäre.
Nimmt man 10k als Basiswiderstand, dann braucht die Schaltung sehr wenig Strom, ist aber nicht so gut entstört. Nimmt man 1k als Basiswiderstand, dann braucht die Schaltung mehr Strom, ist dafür aber gut entstört.
Man muss also von Fall zu Fall entscheiden, wie wichtig die Entstörung der Transistor-Basis ist und kann mit diesem Wissen zwischen 1k und 10k variieren. Außerdem wird es ja nicht so oft vorkommen, dass man mit dem Finger direkt an die Transistor-Basis greift.
Anmeldungsdatum: 27.07.2007 Beiträge: 925 Wohnort: Oberhofen im Inntal (Tirol)
Verfasst am: Di 11.März 2008 08:26:58 Titel:
Hallo passat2001!
Im nächsten Beitrag möchte ich noch erklären, wie man Schalter an den µC anschließen kann.
Danach möchte ich näher auf deine Aufgabenstellung eingehen. Könntest du uns vielleicht ein wenig genauer erklären, was du genau machen möchtest. Welche Signale in welcher Stärke und in welcher Schaltgeschwindigkeit bekommst du und was soll damit zu welchem Zeitpunkt geschaltet werden?
Anmeldungsdatum: 27.07.2007 Beiträge: 925 Wohnort: Oberhofen im Inntal (Tirol)
Verfasst am: Di 11.März 2008 14:16:58 Titel: Es geht auch billiger
Hallo!
Ich muss doch noch einen Beitrag zwischenschieben. Mir ist aufgefallen, dass sich zwar viele für die Mikrocontrollerprogrammierung interessieren, sich aber die von mir beschriebene Basisausstattung nicht leisten können.
Ich bin von der Ausstattung ausgegangen, die am wenigsten Probleme macht und dem Lernenden am meisten hilft. Dafür ist nun mal ein Buch notwendig, das nicht nur die Grundlagen vermittelt und dafür braucht man (außer man hat wirklich viel Phantasie) auch das zugehörige Experimentierboard. Ich spreche vom "AVR - Mikrocontroller Lehrbuch".
Natürlich kann man die Mikrocontrollerprogrammierung auch ohne diese Ausstattung lernen. Man braucht aber erheblich länger dafür, da man sich die Informationen aus dem Internet zusammensuchen muss und nicht Kapitel für Kapitel *nur* neues lernt.
Weiters kann man zur Not auch auf den von mir vorgeschlagenen mySmartUSB-Programmer verzichten. Es gibt Programmer für den Parallelport und für den Seriellen Port, die man sich selber zusammenlöten kann. Wenn man sich das "ATMEL Evaluations-Board Version 2.0" von Pollin besorgt, dann hat man so einen Seriellen Programmer sogar mit an Board. Man kann das Programm damit zwar nicht direkt aus Bascom heraus zum µC übertragen, aber die von Bascom erzeugten HEX-Dateien können mit dem Programm "PonyProg" http://www.lancos.com/prog.html zum µC übertragen werden.
Das ist zwar für Vielprogrammierer nicht angenehm und auf keinen Fall schnell, aber es ist billig.
Ich hoffe, damit mehr Hobby-Elektroniker zum Einstieg in die µC-Programmierung zu bewegen.
Anmeldungsdatum: 27.07.2007 Beiträge: 925 Wohnort: Oberhofen im Inntal (Tirol)
Verfasst am: Di 11.März 2008 19:59:58 Titel: Schalter an den µC anschließen
Hallo!
Letztens habe ich erklärt, wie man über ein digitales Signal des µC eine LED oder ein Relais ansteuern kann. Heute ist es so weit, dass ich in die andere Richtung gehen möchte. Wie schließt man einen Schalter an?
Es gibt zwei grundsätzliche Möglichkeiten. Entweder der Schalter zieht gegen VCC oder er zieht gegen GND. Beides lässt sich detektieren. Und was passiert wenn der Schalter nicht gedrückt wird? Das wird oft nicht bedacht. Und erst heute (wie peinlich) ist es mir selber passiert, dass ich mich nicht darum gekümmert habe. Und statt 10 Hz hatte ich schwankende 2600 Hz an einem Eingang und wusste nicht warum.
Wenn der Schalter gegen VCC zieht, dann sollte man den Eingang über einen PullDown-Widerstand gegen GND ziehen. So ist sicher gestellt, dass am Eingang LOW anliegt und erst wenn der Schalter gedrückt wird zu HIGH wird. Zieht der Schalter gegen GND, dann sollte ein PullUp-Widerstand gegen VCC ziehen.
Und wenn man Bauteile sparen möchte, dann kann man den in den µC eingebauten PullUp-Widerstand softwaremäßig aktivieren. Es gibt also für jeden möglichen Eingangspin auch die Möglichkeit, einen PullUp-Widerstand zu aktivieren. Dieser ist bei den AVRs zwischen 20 und 50 kByte groß.
So sieht es aus, wenn der Schalter gegen VCC zieht:
So sieht es aus, wenn der Schalter gegen GND zieht:
Zwar hat der Reset-Eingang auch einen PullUp-Widerstand eingebaut, aber beim Reset machen wir eine Ausnahme und beschalten ihn trotzdem zusätzlich noch mit einem externen PullUp-Widerstand.
Es gibt mehrere Möglichkeiten, um festzustellen, ob der Taster gedrückt wird oder nicht. Die einfachste ist die, den Status des Eingangspins abzufragen. Dieses kleine Beispielprogramm steuert zwei LEDs an. Im Ausgangszustand leuchtet die LED1. Drückt man den Taster dann leuchtet die LED2.
Dieses Beispiel geht davon aus, dass der Taster den Eingangspin gegen VCC zieht.
'LED1 an PB1
Led1 Alias Portb.1
Config Led1 = Output
'LED2 an PB2
Led2 Alias Portb.2
Config Led2 = Output
'TASTER1 an PD2
Taster1 Alias Pind.2
Config Pind.2 = Input
Do
If Taster1 = 1 Then
Led1 = 0
Led2 = 1
Else
Led1 = 1
Led2 = 0
End If
Loop
End
Und so sieht es aus, wenn man mit dem Taster den Eingangspin gegen GND zieht. Es wird der interne PullUp-Widerstand aktiviert um den Eingang in einem definierten Zustand zu halten. Das Einschalten des internen PullUp-Widerstand: Zuerst wird der Pin als Eingang definiert und dann setzt man den Pin auf HIGH. So als wäre dieser ein Ausgang. Aber statt dass am Pin ein HIGH angelegt wird, wird damit der PullUp-Widerstand aktiviert.
'LED1 an PB1
Led1 Alias Portb.1
Config Led1 = Output
'LED2 an PB2
Led2 Alias Portb.2
Config Led2 = Output
'TASTER1 an PD2
Taster1 Alias Pind.2
Config Pind.2 = Input
Portd.2 = 1 'PullUp-Widerstand einschalten
Do
If Taster1 = 0 Then
Led1 = 0
Led2 = 1
Else
Led1 = 1
Led2 = 0
End If
Loop
End
Du hast sicher schon bemerkt, dass noch etwas hinzugekommen ist. Mit ALIAS kann man einer Variable einen zusätzlichen Namen geben. Schlüssige Namen erleichtern das Programmieren und sollten oft eingesetzt werden.
Versuche doch mal zum Test diese Zeile aus dem Code raus zu nehmen:
Code:
Portd.2 = 1 'PullUp-Widerstand einschalten
Drücke nach dem Übertragen des Programms mehrmals den Taster. Dann weißt du was es bedeutet, den PullUp-Widerstand zu vergessen.
Anmeldungsdatum: 27.07.2007 Beiträge: 925 Wohnort: Oberhofen im Inntal (Tirol)
Verfasst am: Mi 12.März 2008 08:53:00 Titel: Variablen
Hallo!
In diesem Beitrag geht es wieder um reine Theorie. Aber bitte trotzdem durchlesen, da dieses Thema sehr wichtig ist. Es geht um Variablen.
Was ist eine "Variable"? In der µC-Programmierung ist eine Variable ein Name für einen Speicherbereich. Außerdem ist in Bascom an die Variable auch noch der Datentyp gebunden, der in dem Speicherbereich gespeichert werden kann.
In Bascom gibt es mehrere mögliche Datentypen.
- 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. Dafür wird im Speicher immer ein Zeichen mehr als die Länge des Textes benötigt, da der Text immer mit einem 0-Byte abgeschlossen wird.
Man muss Bascom mitteilen, welche Variablen mit welchem Datentyp man benutzen möchte. Das passiert mit dem Befehl DIM und sieht z.B. so aus:
Code:
DIM my_bit_var as BIT
DIM my_byte_var as BYTE
DIM my_byte_array(3) as BYTE
DIM my_word_var as WORD
DIM my_single_var as SINGLE
DIM my_string_var as STRING * 10
Die Besonderheit des STRING-Datentyps ist die, dass man mit ``*`` die Länge des Textes angeben kann. ``my_string_var`` braucht im Speicher 11 Byte, da noch ein 0-Byte dazu kommt um den Text abzuschließen.
Dann gibt es noch eine Besonderheit. Die Variable ``my_byte_array`` wurde als Array definiert. Damit wurden intern drei Speicherbereiche mit dem gleichen Namen reserviert. Und man kann auf die einzelnen Speicherbereiche über den in Klammern geschriebenen Index zugreifen. ``my_byte_array(1), my_byte_array(2), my_byte_array(3)``. Das ist von Vorteil, wenn man sich später Schreibarbeit sparen möchte und immer wiederkehrende Aufgaben in einer Schleife abarbeiten möchte. Aber das ist jetzt noch nicht wichtig.
Man muss aber aufpassen! Man darf einer Variable keinen Wert übergeben, der nicht in die Variable rein passt. Schreibt man den Wert einer WORD-Variable in eine BYTE-Variable, dann werden nur die unteren 8 Bit übernommen. Die oberen 8 Bit werden einfach abgeschnitten.
Dieser Code funktioniert:
Code:
my_word_var = 100
my_byte_var = my_word_var
Die Zahl 100, in einen Code aus Nullen und Einsen (Binärsystem) umgewandelt, sieht so aus:
Code:
1100100
Das sind 7 einzelne Bits. Diese 7 Bits haben in einer BYTE-Variable Platz, da der Speicherbereich für ein Byte 8 Bit groß ist.
Dieser Code funktioniert nicht:
Code:
my_word_var = 1000
my_byte_var = my_word_var
Die Dezimalzahl 1000, umgewandelt in eine Binärzahl (0/1), sieht so aus:
Code:
1111101000
Das sind 10 einzelne Bits. 10 Bits haben nicht mehr in einer BYTE-Variable Platz. Es werden die linken 2 Bit abgeschnitten. Im Speicher steht jetzt:
Code:
11101000
Wenn man diese Binärzahl in eine Dezimalzahl umwandelt, dann kommt die Dezimalzahl ``232`` dabei raus. In der Variable steht jetzt der Wert 232 und nicht wie erwartet der Wert 1000.
Das Binärsystem und die Umrechnung von Binär nach Dezimal und umgekehrt erkläre ich hier nicht. Das wird sowiso in vielen Computerbüchern erklärt und Wikipedia hat dazu auch noch etwas zu sagen:
http://de.wikipedia.org/wiki/Dualsystem
Der Windows-Taschenrechner kann verschiedene Zahlensysteme umwanden. Man muss ihn dafür nur in die wissenschaftliche Darstellung umschaltet.
Da wir ab jetzt in fast jedem weiteren Beispielprogramm mit Variablen arbeiten werden, macht es früher oder später garantiert "Klick" und du wirst verstehen.
Anmeldungsdatum: 27.07.2007 Beiträge: 925 Wohnort: Oberhofen im Inntal (Tirol)
Verfasst am: Mi 12.März 2008 18:00:09 Titel: Schalter an den µC anschließen - Fortsetzung
Hallo!
Es gibt noch mehr Möglichkeiten wie man auf einen Schalter reagieren kann. Hier ist die nächste Möglichkeit: BITWAIT
BITWAIT ist ein Befehl der so lange an einer Stelle wartet, bis die übergebene Variable oder ein Pin auf 0 oder auf 1 gesetzt wird. Dieser Befehl blockiert das gesamte Programm. Dessen muss man sich bewusst sein.
'LED1 an PD7
Led1 Alias Portd.7
Config Led1 = Output
'LED2 an PD6
Led2 Alias Portd.6
Config Led2 = Output
'TASTER1 an PD2
Taster1 Alias Pind.2
Config Pind.2 = Input
Portd.2 = 1 'PullUp-Widerstand einschalten
Dim Status As Bit
Do
'Warten bis der Taster1 gegen GND zieht
Bitwait Taster1 , Reset
'Warten bis der Taster1 gegen VCC zieht
Bitwait Taster1 , Set
'Wenn die Variable Status...
If Status = 0 Then
'...auf 0 gesetzt ist, dann LEDs wechseln...
Led1 = 0
Led2 = 1
'...und Status-Variable auf 1 setzen.
Status = 1
Else
'...auf 1 gesetzt ist, dann LEDs wechseln...
Led1 = 1
Led2 = 0
'...und Status-Variable auf 0 setzen.
Status = 0
End If
Loop
End
Wenn man den Taster drückt, dann wechseln die LEDs hin und her. Experimentiere damit ein wenig. Lasse doch mal die Zeile ``Bitwait Taster1 , Set`` weg und schau was dann passiert. Versuche es dir zu erklären.
Und eines dürfte bei diesem Beispiel ziemlich schnell auffallen. Wenn man den Taster drückt, dann wird normalerweise die LED gewechselt. Aber ab und zu passiert nichts oder es blinkt nur kurz auf.
Die meisten Taster oder Schalter "prellen". Das kommt daher, dass der Taster beim Schalten ein wenig nachschwingt. Das Signal eines Tasters oder Schalters ist beim Schalten nicht rein.
Das kann man auf der Hardwareseite umgehen, wenn man einen kleinen Keramikkondensator (sagen wir mal 10 nF -- je nach Qualität des Schalters muss man diesen Wert evt. ein wenig erhöhen) parallel zum Taster schaltet. Man kann dieses Problem auch softwareseitig aus der Welt schaffen. Aber darauf möchte ich erst später eingehen.
Hier der Schaltplan mit entprelltem Taster:
ACHTUNG! Wenn die Schaltung Strom bekommt, dann läd sich der Kondensator C3 über den internen PullUp-Widerstand auf. Das bedeutet, dass in diesem Moment PD2 nach GND gezogen wird. Sobald der Kondensator aufgeladen ist, zieht der PullUp PD2 nach VCC. Da die zwei Prüfungen mit BITWAIT so ziemlich das Erste sind was ausgeführt wird, wird die Schleife einmal durchlaufen ohne einen Tastendruck abzuwarten. Möchte man das vermeiden, dann sollte man mit ``WAITMS`` ein paar Millisekunden warten bevor man die MainLoop loslegen lässt.
'LED1 an PD7
Led1 Alias Portd.7
Config Led1 = Output
'LED2 an PD6
Led2 Alias Portd.6
Config Led2 = Output
'LED3 an PD5
Led3 Alias Portd.5
Config Led3 = Output
'TASTER1 an PD2
Taster1 Alias Pind.2
Config Pind.2 = Input
Portd.2 = 1 'PullUp-Widerstand einschalten
Dim Status As Byte
Do
Bitwait Taster1 , Reset
Bitwait Taster1 , Set
If Status = 0 Then
Led1 = 1
Led2 = 0
Led3 = 0
Status = 1
Elseif Status = 1 Then
Led1 = 0
Led2 = 1
Led3 = 0
Status = 2
Else
Led1 = 0
Led2 = 0
Led3 = 1
Status = 0
End If
Loop
Anmeldungsdatum: 27.07.2007 Beiträge: 925 Wohnort: Oberhofen im Inntal (Tirol)
Verfasst am: Mi 12.März 2008 20:26:16 Titel:
Hallo!
Ich brauche Rückmeldungen, damit ich weiß ob ich auf dem richtigen Weg bin. Bitte teilt mir mit ob es Probleme gibt oder ob alles bis jetzt problemlos läuft.
lg
Gerold
PS: Sobald hier Rückmeldungen kommen, schreibe ich den nächsten Beitrag. _________________ http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Alle Zeiten sind GMT + 1 Stunde Gehe zu Seite Zurück1, 2, 3, ... 17, 18, 19Weiter
Seite 2 von 19
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum nicht posten Du kannst Dateien in diesem Forum nicht herunterladen