www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einstieg mit BASCOM


Autor: Robert Ehrhardt (robs0412)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Robert Ehrhardt (robs0412)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Robert Ehrhardt (robs0412)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

da muss ich nochmal schauen.

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

Grüße

Robert

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Robert Ehrhardt (robs0412)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

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

Super Hilfe!

Grüße!

Robert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.