Forum: Mikrocontroller und Digitale Elektronik Einstieg mit BASCOM


von Robert E. (robs0412)


Lesenswert?

Hallo,

für eine Studienarbeit im Bereich KFZ Technik muss ich mich als
absoluter Einsteiger auf unbekanntes µC Gebiet begeben.

Ich nutze dazu das myAVR Board, da hier der Aufbau ja recht einfach ist
und zur „Programmierung“ BASCOM, da Basic für mich noch verständlich
ist.

Habe jetzt leider noch nichts mit meinem Board machen können, da mir
noch die Kabel zum PC fehlen (an was man eben nicht alles denkt…)

Dennoch war ich in BASCOM schon aktiv und habe den Simulator zum Testen
genutzt und mir auch schon mein Programmablauf zusammengestrickt.

Jetzt meine Bitte an euch: könntet Ihr bitte mal drüber schauen und
sagen, ob das so funktioniert bzw. ob vielleicht „was fehlt“.


Hier der Code mit ein paar Bemerkungen bzw. Fragen:

µC ist ein ATmega88


$regfile = "m88def.dat"
$crystal = 20000000    --> muss schnell laufen, da „Drehzahlkritische“
Anwendung


Config Timer1 = Timer , Prescale = 64 , Compare A = Clear       -->
Compare soll OC1A beim Erreichen des Comparewertes ausschalten (0V),
Timer darf schon loslaufen


Enable Interrupts    --> mit Interrupt Int0 soll Drehzahl bestimmt
werden
Enable Int0
Config Int0 = Change    --> Int0 jeweils bei sich ändernder Flanke des
Hall-Sensors
On Int0 Zuendimpuls    --> bei Int0 zu Zuendimpuls springen


Config Adc = Free , Prescaler = Auto , Reference = Avcc    --> ADC zum
Analogsignal messen, kontinuerliche Messung, für Berechnungen im
Hauptprogramm
Start Adc


Dim … As  …    --> verschiedenste Variablen für Berechnung definieren
Dim…


Ddrb.1 = 1    -->Port B1 (OC1A) als Ausgang deklarieren (muss ich das
tun?)
Portb.1 = 0    -->Port B1 (OC1A) auf aus (0V)



Hauptprogramm:

Do

…verschiedenste Berechnungen, die im Simulator bestens funktionieren…

Loop

End



Zuendimpuls:

T = Timer1    -->Zwischenspeichern des Timerwertes für neue Berechnungen
im Hauptprogramm

Timer1 = 0    -->Timer wieder von vorn loslaufen lassen

Compare1a = C    -->neuen Comparewert laden (C aus Berechnungen im
Hauptprogramm)

Portb.1 = 1    --> Port B1 (OC1A) auf an (5V), solange bis Comparewert
erreicht wird, dann CLEAR, wie beim Timer definiert (also aus)

Return


Zusammenfassung:

Immer, wenn ein Zündimpuls erkannt wird, soll Port B1 aktiviert werden
(5V) und solange anbleiben, wie zwischendurch in der Hauptschleife
berechnet wurde.
Port B1 soll dann mit Compare wieder ausgeschalten werden.

Ich benutze beim Compare Befehl nicht Toggle, da ich sicher sein muss,
dass, falls verfrüht wieder Compare auftritt, Port B1 auch wirklich aus
bleibt.

Würde mein Programm so funktionieren?

Vielen Dank!

Robert

von Karl heinz B. (kbucheg)


Lesenswert?

> $crystal = 20000000    --> muss schnell laufen,
>                            da „Drehzahlkritische“ Anwendung

Hier steckt wahrscheinlich schon der erste Denkfehler.
Du stellst hier keineswegs die Taktfrequenz des µC ein.
Die Taktfrequenz des µC richtet sich ausschliesslich nach dem
angeschlossenen Quarz (bzw. kann man bei Verwendung des internen
Taktgenerators zwischen ein paar Frequenzen per *Fuse* umschalten.

Die Angabe hier teilt einfach nur BASCOM mit, mit welcher Frequenz
der µC tatsächlich läuft. Dies deshalb damit BASCOM Warteschleifen
richtig dimensionieren kann.

von Robert E. (robs0412)


Lesenswert?

Hallo,

richtig, ich möchte auch nicht den externen Quarz nutzen, sondern den
internen, auch, wenn dieser ungenau ist. Für meinen Zweg benötige ich
kein genaues Signal, sondern nur den schnellen µC.

Klappt das mit Port B1 (OC1A) so, wie ich mir das vorstelle?

Danke und Grüße

Robert

von Paul Baumann (Gast)


Lesenswert?

Ich denke, daß der interne Oszillator mit 1Mhz schwingt. Wenn Du den
Professor schneller takten willst, mußt Du mit externem Quarz ans Werk
gehen oder den Takt mit einem anderen Generator (z.B. aus Logikgattern)
erzeugen.

mfG Paul

von Robert E. (robs0412)


Lesenswert?

Hi,

da muss ich nochmal schauen.

Muss ich den ADC Kanal vorher eigentlich noch als Eingang definieren?

Grüße

Robert

von johnny.m (Gast)


Lesenswert?

1.: Ja, der ADC-Kanal muss als Eingang definiert sein und es darf kein
Pull-Up an dem Pin aktiv sein (also PORTB.X = 0)!

2.: Der interne RC-Oszillator läuft mit 8 MHz. Wenn man die
CKDIV8-Fuse löscht, hat man die auch als Takt zur Verfügung. Im
Auslieferungszustand ist diese Fuse aber programmiert, so dass
tatsächlich ein Takt von 1 MHz als Taktquelle vorliegt. Man kann den
Oszillator auch auf Frequenzen höher als 8 MHz trimmen (mit dem
OSCCAL-Register), aber dann garantiert der Hersteller keine 100%ige
Funktionalität mehr.

von Hannes L. (hannes)


Lesenswert?

> 1.: Ja, der ADC-Kanal muss als Eingang definiert sein und es darf
> kein
> Pull-Up an dem Pin aktiv sein (also PORTB.X = 0)!

Völlig korrekt. Beim Mega 48/88/168 sollte man zusätzlich noch den
Digitalteil des Eingangs deaktivieren (DIDR0), um den Messeingang noch
weniger zu belasten und Strom zu sparen.

> 2.: Der interne RC-Oszillator läuft mit 8 MHz. Wenn man die
> CKDIV8-Fuse löscht, hat man die auch als Takt zur Verfügung.

Das Löschen der Fuse ist nicht erforderlich, man kann den Vorteiler
auch vom Programm auf 1:1 einstellen (CLKPR). Das sollte besonders Dem
helfen, der mit den Fuses noch nicht so vertraut ist.

@johny.m: Bitte nicht als Besserwisserei verstehen, nur als Ergänzung.

Bit- & Bytebruch...
...HanneS...

von johnny.m (Gast)


Lesenswert?

@Hannes:
Nö, ist kein Problem. Ich weiß, was das Forum und der Rest der Welt an
Leuten wie Dir haben. Wenn man es wirklich besser weiß (und das ist
bei Dir sicher der Fall, bei der Erfahrung...), dann soll man es auch
einbringen, gell?

von Robert E. (robs0412)


Lesenswert?

Danke!

werd mich weiter durcharbeiten und mein "Progrämmchen" erst mal mit
LEDs testen.

Super Hilfe!

Grüße!

Robert

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.