simples BASCOM Programm?!?!? könnt ihr mir beim erklären helfen???? Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
simples BASCOM Programm?!?!? könnt ihr mir beim erklären helfen???? |
|
|
|
|
BID = 374331
bastelheini Schriftsteller
Beiträge: 618 Wohnort: Sachsen
|
|
hallo
da ich nun in die welt der mikrocontroller einsteigen will und das ganze mit Bascom programmieren will hab ich mal im internet ein bisschen rumgesucht um ein tutorial zu finden.
ich bin auf diese seite gestoßen:
http://www.rowalt.de/index.htm
nun versteh ich aber einiges an diesem beispiel nicht:
(laut beschreibung soll bloß die rote led leuchten!)
'0001.BAS: Rote LED an Pin PD3, gelbe an Pin PD4, grüne an PD5
'--------------------------------------------------------------
$Regfile = "2313def.dat" 'AT90S2313
$Crystal = 3686400 'Quarz: 3.6864 MHz
DDRD = &B0001000 'Pin PD3 als Ausgang konfigurieren
PORTD = &B11111111 'PD0...PD7 auf High setzen
Do
Loop
End
wenn ich nun einen atmega8 programmieren will müsste die ersten zeile wiefolgt aussehen:
$Regfile = "2313def.dat" 'AT90S2313
$Crystal = 8000000 'Quarz: 8.0000 MHz
der befehl "DDRD=" legt nun fest ob und welcher pin ein ein- oder ausgang ist? stimmt das soweit?
wenn ich in den speicher schreibe, muss dann immer "&B" vorangestellt werden?
mit dem zeilenabschnitt "0001000" wird Pd3 als ausgang festgelegt.
wären dann bei "&B0001001" die pins Pd3 und Pd0 als ausgänge festgelegt? oder die pins PD3 und PD7???
und für was sind die PB pins da? (sieht man auf der experiementierplatine auf seiner website-->http://www.rowalt.de/mc/avr/avrboard/03/avrb03.htm)
------------------------------------------------
DDRD = &B0001000 'Pin PD3 als Ausgang konfigurieren
PORTD = &B11111111 'PD0...PD7 auf High setzen
in der ersten zeile wird PD3 als ausgang konfiguriert.
in der zweiten zeile werden aber alle auf high gesetzt...demzufolge liegt doch eigentlich an allen pins (PD0 bis PD7) eine spannung von 5 volt an--> demzufolge sind es ja doch ausgänge....
----------------
Do
Loop
End
heist das der status (die eine led an PD3 ist angeschaltet) immer wieder überprüft wird oder?
----------
dann hätte ich noch eine abschließende frage: wie kann ich das programm in bascom simulieren....also es soll auch zb eine led angehen...das entsprechende menü ist hja vorhanden ich komme nur nicht wirklich damit klar:-(
schon mal vielen dank fürs helfen
mfg bastelheini |
|
BID = 374337
Her Masters Voice Inventar
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 5308 Wohnort: irgendwo südlich von Berlin
|
|
Lies das Datenblatt zum Controller und die Hilfe zum BASCOM.
Wenn du einen M8 programmieren willst solltest du Diesen auch initialisieren.
Die Schlussschleife macht einfach nur garnix ausser immer wieder durchzulaufen, kann man auch getrost weglassen, dann wird das Programm durch die END Anweisung gestoppt.
_________________
Tschüüüüüüüs
Her Masters Voice
aka
Frank
***********************************
Der optimale Arbeitspunkt stellt sich bei minimaler Rauchentwicklung ein...
*********************************** |
|
BID = 374339
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Hallo Bastelheini,
Du musst für den ATmega8 auch die entsprechende Definitionsdatei einbinden:
$regfile = "m8def.dat"
Dann musst du deine Taktfrequenz dem Compiler übergeben, nicht stumpf abschreiben, was im Tutorial steht:
(Aus den PNs habe ich erfahren, dass es 8MHz sind):
$crystal = 80000000 '8MHz
So, dann geht das Programm los:
Ich empfehle wärmstens, immer das passende Datenblatt im Hintergrund laufen zu haben, dann kann man sich schnell helfen:
Das Register DDRx legt fest, ob der entsprechende PIN ein Ein- oder Ausgang ist. Ist der Pin ein Eingang (entsprechendes Bit ist dann 0), dann lässt sich noch ein sog. Pull-Up-Widerstand an- oder ausschalten, indem man das entsprechende Bit im PORTx-Register setzt.
Es gibt also für alle IO-Pins 3 Register:
* Das DDRx-Register (Data Direction Register) für Einstellung ob Ein- oder Ausgang
* Das PORTx-Register für die Datenausgabe (wenn du hier ein Bit setzt, dann geht der entsprechende Pin auf High) (Wenn der Pin als Eingang definiert wurde und man die gleiche Bitposition in PORTx auf 1 setzt, dann wird der Pullup eingeschaltet. Weitere Kombinationen dieser beiden Register PORTx und DDRx bitte im Datenblatt nachsehen!)
* Das PINx-Register für Dateneingabe (wenn ein Pin/bzw. der ganze Port) als Eingang definiert wurde, dann kannst du ihn hier auslesen.)
Das &B... ist ein Präfix für Binäre Schreibweise.
Es gibt auch z.b. noch &H für hexadezimale Zahlen.
Zur Sprache allgemein:
Ich halte nicht viel von BASCOM, aber ich versuche dir, auch da zu helfen, wo ich kann. Habe damit nur ca. 1 Monat gearbeitet, danach habe ich zu Assembler gewechselt.
Edit:
Simulation:
In der simulation kannst du unter "Register" alle Registerinhalte betrachten, unter "IO" kannst du dir alle IO-Register anzeigen lassen. So einfach ne LED zum Leuchten bekommst du das nicht aber du kannst die Hex-Werte ins binärsystem umrechnen, dann siehst du, ob das Bit gesetzt ist oder nicht. Sonst würde es auch ein anderer, viel besser Simulator tun, nämlich der von ATMEL selbst. Ist im AVR Studio 4 integriert.
Mit den Watches kannst du deine Variableninhalte betrachten und loggen. Unter "µP" kannst du dir das Statusregister und diverse Parameter wie Programmadresse und Stackpointer anzeigen lassen.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 2 Okt 2006 13:51 ]
|
BID = 374343
bastelheini Schriftsteller
Beiträge: 618 Wohnort: Sachsen
|
$regfile = "m8def.dat"
oh ja ich hab noch dran gedacht...abe dann isses mir entfallen...
@DonComi
"Dann musst du deine Taktfrequenz dem Compiler übergeben, nicht stumpf abschreiben, was im Tutorial steht:
(Aus den PNs habe ich erfahren, dass es 8MHz sind):
$crystal = 80000000 '8MHz"
hab ich ja gemacht-->"$Crystal = 8000000 'Quarz: 8.0000 MHz "
-->"Das DDRx-Register (Data Direction Register) für Einstellung ob Ein- oder Ausgang
" welche möglichkeiten gibt es für "x"? "D" weis ich ja schon
-----------------
aha also bei DDRD = &b1001011 weist PD0,PD1,PD4 und PD7 als ausgänge aus?
und mit der nächsten zeile:"PORTD = &b0000001" ist zb nur PD0 high und bei "PORTD = &b0001010" PD1 und PD3?
wenn ja hab ich schon mal was gelernt
------------------
"Das PINx-Register für Dateneingabe (wenn ein Pin/bzw. der ganze Port) als Eingang definiert wurde, dann kannst du ihn hier auslesen.)"
wie wird das dann geschrieben? also wenn ich zb den PD 2 einlesen will?
ich schreib gleich mal zur übung alles mit
$regfile = "m8def.dat" 'def datei einlesen
$crystal = 8000000 'taktfrequenz 8MHz festlegen
DDRD = &b11111011 'alle der sieben ausgänge außer PD2 als ausgänge festlegen
'un wie gehts nun weiter? in basic wohl so:
a=PIND &b00000100 'aber ich glaub nicht das man das so machen kann...
ich bin jetzt mal davon ausgegangen das der ATmega8 nur 7 ausgänge hat....in wirklichkeit sinds ja 23 I/O ports.....würde das dann so geschrieben:
" DDRD= &b00101010010101011101010"
(null und eins sind willkürlich gewählt)
mfg bastelheini
|
BID = 374346
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Zitat :
|
aha also bei DDRD = &b1001011 weist PD0,PD1,PD4 und PD7 als ausgänge aus?
und mit der nächsten zeile:"PORTD = &b0000001" ist zb nur PD0 high und bei "PORTD = &b0001010" PD1 und PD3?
|
Exakt! Stimmt alles!
Zitat :
|
[...]wie wird das dann geschrieben? also wenn ich zb den PD 2 einlesen will?
[...]a=PIND &b00000100 'aber ich glaub nicht das man das so machen kann... [...]
|
Fast, aber nicht ganz:
Das wars. In A steht nun der Wert des Eingangsregisters.
Wenn dich nur ein Bit davon interessiert, dann maskiert man heraus:
A = A AND &B00001000 (Jedes Bit wird mit AND verknüpft. Nur 1 AND 1 ergibt 1, also sind alle Bits außer BIT3 0 und BIT3 nur dann 1, wenn auch BIT3 in PINx gesetzt ist.)
Zitat :
| ich bin jetzt mal davon ausgegangen das der ATmega8 nur 7 ausgänge hat....in wirklichkeit sinds ja 23 I/O ports.....würde das dann so geschrieben:
" DDRD= &b00101010010101011101010" |
Alle IO-Ports sind aufgeteil in 8Bit breite Einheiten.
Schau ins Datenblatt, es gibt teilweise für PortA nur wirklich 3 physikalisch existierende Pins.
Anfangen tuts bei PortA, PortB, PortC, PortD, ... ,
Zitat :
|
$crystal = 80000000 '8MHz"
hab ich ja gemacht-->"$Crystal = 8000000 'Quarz: 8.0000 MHz "
|
Mein Fehler
Das Datenblatt hilft weiter, unter "Pin Configurations" siehst du, welche IO-Pins wirklich vorhanden sind.
Daraus entsteht dann dein Programm.
_________________
|
BID = 374349
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
So, hier mal der interessante Auszug:
(Quelle: ATmega8-Datenblatt, vollständige Version Seite 2)
_________________
|
BID = 374353
bastelheini Schriftsteller
Beiträge: 618 Wohnort: Sachsen
|
das es VB so ähnlich ist hab ich gar net gedacht....aber umso besser!!! da freu ich mich jetzt richtig...
"A = A AND &B00001000 (Jedes Bit wird mit AND verknüpft. Nur 1 AND 1 ergibt 1, also sind alle Bits außer BIT3 0 und BIT3 nur dann 1, wenn auch BIT3 in PINx gesetzt ist.)" das hab ich jetzt wieder mal nicht verstanden....
kannste da noch mal 2 verscjiedene beispiele schreiben? das ich direkt vergleichen kann? währe schön....
mfg bastelheini
edit:
ach jetzt hab ichs begriffen mit DDRD xyz weiße ich die PDx ausgänge aus mit DDRA die PAx ausgänge un das gleiche mit b, c,...
[ Diese Nachricht wurde geändert von: bastelheini am 2 Okt 2006 14:40 ]
|
BID = 374360
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Zitat :
|
das hab ich jetzt wieder mal nicht verstanden....
kannste da noch mal 2 verscjiedene beispiele schreiben? das ich direkt vergleichen kann? währe schön....
|
Hallo.
Wenn dich innerhalb eines Ports nur ein Bit interessiert (z.b. bit4), und die anderen komplett nichts mit dem bit4 zu tun haben und deren Status dich auch nicht interessiert, dann maskiert man diese Bits alle raus. Das bedeutet, ich lösche alle bits (die mich ja eh nicht interessieren) und prüfe, ob das Ergebnis günstig oder ungüstig ist:
Es hängt jetzt z.b. an PINA3 ein Taster, dessen Status ich wissen will. (Alle anderen Bits können Werte haben, die micht nicht interessieren, bzw. die meinen späteren Vergleich beeinträchtigen könnten):
Dim A As Byte
A = PINA 'Einlesen
A = A And &B00001000 'ich verknüpfe Bitweise alle Stellen von 0 bis 7
Jetzt gehen alle anderen Bits in A auf 0, da ja 1 oder 0 and 0 immer 0 gibt.
Angenommen, Der Taster ist an und führt nun 1-Pegel, dann steht in A nach der AND-Verknüpfung 0b00001000 (entspricht in Hex dann 0x8.
Ist Der Taster aber nicht gedrückt, dann ist A=0b00000000 (das entspricht in Hex dann 0)
Jetzt kann ich mit einer If-Abfrage ganz einfach rausfinden, ob die Taste gedrückt ist oder nicht:
If A = &H8 Then
...
End If
Würde ich vorher nicht alle anderen Bits rausschmeißen, dann müsste ich das ganze viel komplizierter machen.
---
Das war jetzt vllt. kein gelungenes Beispiel. Es soll nur verdeutlichen, dass man mit gezielten Bit-Manipulationnen schneller zum Erfolg kommt, als mit irgendwelchen komplizierten, ressourcenfressenden Funktionen oder anderen Klimmzügen.
Dazu solltest du dir bei gegebener Zeit auch mal die Operatoren:
XOR
OR
AND
anschauen.
Edit:
Zitat :
|
ach jetzt hab ichs begriffen mit DDRD xyz weiße ich die PDx ausgänge aus mit DDRA die PAx ausgänge un das gleiche mit b, c,...
|
Genau.
Mit z.b. PORTxn beschreibt man Sachen allgemein.
Konkret wird es, wenn ich PORTA3 oder so meine (x=A, n=3)
Das zu der Schreibweise im Datenblatt.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 2 Okt 2006 14:56 ]
|
BID = 374382
bastelheini Schriftsteller
Beiträge: 618 Wohnort: Sachsen
|
nein jetz hab ich alles geschrieben und dann kommt "Fehler auf der Seite".......das passiert mir jetzt zum 7. mal grrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
das ko*** mich jetzt an
also noch mal etwas kürzer:
dim b as byte
c:
b=PINB
b=b AND &b00100100
if a = &h24 then goto a else goto b
a:
......
goto end
b:
......
goto c
end:
end
das rote ist also der vergleichswert? die schleife macht solange das was in b: steht bis der wer gleich ist also die eingänge PB2 und PB5 high sind, erst dann springt er zu a
richtig/falsch?
mfg bastelheini
|
BID = 374387
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Nein, da wird der Compiler aber rummeckern...
Du hast ein Label, dass die gleiche Bezeichnung hat, wie eine Variable, du veränderst die Variable b und prüfst a, du springt zu einem Label 'end', dass es so nicht geben darf, da es bereits einen Befehl gibt, der End lautet.
Außerdem wird goto sehr ungern benutzt, weil es einfacher geht:
Dim A As Byte
Do While A<>&H24 'Schleife machen, solange A!=&H24 (sprich: Schleife, solange A ungleich &H24)
A=PINB AND &B00100100
Loop
...
Oder:
Dim A As Byte
Do
If (A And &B00100100) = &H24 Then
Exit Do
End If
Loop
Edit:
Zitat :
|
das rote ist also der vergleichswert?
|
Ja, unter anderem. Der andere Vergleichswert ist die Variable b.
Das Ergebnis dieser Verknüpfung ist danach in b gespeichert.
Mein Tipp: Vergiss erstmal diese Operatoren und widme dich leichteren Sachen. Diese Operatoren brauchst du noch früh genug. Erstmal Grundlagen, auch und vorallem in Basic lernen.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 2 Okt 2006 16:16 ]
|
BID = 374391
bastelheini Schriftsteller
Beiträge: 618 Wohnort: Sachsen
|
ok dann mach ich mich mit der DO LOOP schleife noch ma schlau....
ich machs bloß gern ausführlicher......aber wenns dann später ball um die letzten speicherrest geht un man nichts anderes weis seh ich das ein....
wie gesagt ich geh immer von VB 6.0 aus....da geht das nämlich...
ich meine den variablen einen anderen wert zu geben sollte kein problem sein....
"du veränderst die Variable b und prüfst a" hast ja recht.....wie sagt unser info lehrer in der ersten stunde"...und ihr werdet merken, 99% aller Fehler beruhen auf Tippfehlern."
wenn man ein ängeres projekt hat sucht man
sich dusselig...
nenne wir das label halt ende...
mfg bastelheini
|
BID = 374393
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Zitat :
|
wie gesagt ich geh immer von VB 6.0 aus....da geht das nämlich...
|
Natürlich geht das mit Goto.
Und im Endeffekt werden deine Basiczeilen in teils hunderte Assemblerbefehle zerlegt, wo u.U. sehr viele Sprünge gemacht werden.
Insofern war das auch alles OK, nur das mit den Labelnamen hätte beim Kompilieren einen Fehler verursacht.
Aber ich weiß nicht, ich mag bei Hochsprachen den GOTO-Befehl nicht so gern .
Wenns später um jedes 2. Byte im ROM des Controllers geht, schreibt man meist sowieso in Assembler.
(OK, mittlerweile sind die Speichergrößen so groß, dass es meist keine Rolle mehr spielt, Platz zu sparen. Da zählt dann als Hauptargument für Hochsprachen die Portierbarkeit auf andere Maschinen.)
_________________
|
BID = 374395
bastelheini Schriftsteller
Beiträge: 618 Wohnort: Sachsen
|
ok gibts noch irgendwas was man am anfang brauchen könnte?
oder ne seite wo man übungsaufgaben hat und sich die lösung später angucken kann?
mfg bastelheini
|
BID = 374409
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Ich habe Programmiersprachen immer so gelernt, dass ich ein Problem hatte und dieses irgendwie lösen musste.
Meistens habe ich nur in die Hilfe geschaut. Dann ließt man solange, bis man die Lösung gefunden hat.
Insofern halte ich auch nicht viel von Tutorials. Meiner Meinung nach sollte man sowas selbstständig lernen, dann lernt man es auch wirklich. Abschreiben bringt nicht viel.
---
So habe ich es gemacht, dass muss nicht unbedingt der richtige Weg sein .
_________________
|
BID = 374413
bastelheini Schriftsteller
Beiträge: 618 Wohnort: Sachsen
|
ich sagte ja....:"oder ne seite wo man übungsaufgaben hat und sich die lösung später angucken kann?"
mfg bastelheini
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag heute wurden bisher 6 Beiträge verfasst © x sparkkelsputz Besucher : 182394431 Heute : 1627 Gestern : 7548 Online : 452 25.11.2024 10:19 8 Besucher in den letzten 60 Sekunden alle 7.50 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0791831016541
|