Takt - Definition und Fuses
Hallo @Stein...,
erst einmal herzlich willkommen im Forum.
Nun, Deine Bemerkung über BASCOM war vielleicht nicht ganz so despektierlich gemeint,
wie es wohl rübergekommen ist. (Auch von @N...) Kraftausdrücke sind aber bislang in diesem Forum noch nie gefallen, wenn auch einige User manchmal kurz vor der "grünen Minna" waren.
Dirk mußte da wohl auch noch etwas zu bemerken. Insofern nicht gleich übel nehmen.
Da ich von BASCOM null Ahnung habe, kann ich nichts dazu sagen.
Hab natürlich auch mit GWBASIC und QBASIC noch ein paar Experimente gemacht, dieser "Spaghetti-Code" ist aber keineswegs vergleichbar mit BASCOM.
Fest steht, das steht sogar im "Schmitt", dem schlauen Buch, daß einige Anwendungen auch in C sich von den ASM-Anweisungen nicht unterscheiden. Wie @Markus schon bemerkte, ist es ein unschlagbarer Vorteil, daß man also in BASCOM auch in ASM werkeln kann, ohne, daß es einem Fehlermeldungen bringt. (Unknown statement, unknown code, code mismatch oder dergleichen.)
Nun zu Deiner Frage:
Die Bedeutung einer Direktive mit Crystal sagt nur aus, wie die hernach im Programm folgenden Baudratenteiler und die Timer, vielleicht Zeitschleifen arbeiten sollen.
Dafür habe ich ein Uhren-ASM-Proggi schnipselweise hier parat.
Prinzipiell gilt das wohl auch für BASCOM:
PHP:
;
.nolist
.include "2313def.inc"
.list
;
.equ daten = portb
.equ mctakt = 4000000 ;Quarzfrequenz
.equ baud = 9600 ;Baudrate
.equ bdteiler = 25 ;(mctakt/(16*baud))-1 ;Baudratenteiler
;....
ldi temp, bdteiler ; Baudratengenerator
out UBRR, temp ; Teiler setzen
ldi temp, 0x18 ; enablen TX und RX
out UCR, temp ; an UART Control-Register
ldi temp, high(39998) ; Timer 1 einrichten
out OCR1AH, temp ; Output Compare Register
ldi temp, low(39998) ; in CTC-Modus, Vorteiler 1:1
out OCR1AL, temp
ldi temp, 0x09 ; TCCR1B in CTC-Modus
out TCCR1B, temp ; WGM12 und CS10 setzen
ldi temp, 0x40 ; Timerinterruptmaskierungsregister
out TIMSK, temp ; auf OCIE1A einrichten
;......
Wie ich im Experiment feststellte - das ist genau Deine Frage wohl - kann man die Toleranz des Quarzes nun per "Software" finetunen, ohne das Quarz nachzupolieren (kleiner Scherz).
Da die Uhr nachgeht, habe ich mal am Timer Comparewert herumgespielt.
Die Uhr geht dann vor, wenn der Wert verkleinert wird, mehr nach, wenn er vergrößert wird.
Normalerweise müßte der Comparewert auf 40000 stehen, damit ich hinterher den Hundertstelsekunden-Takt rausbekomme, - ist hier nicht zu sehen - da folgt nämlich noch eine Teilerschleife durch hundert, um auf die Sekunden zu kommen.
Bei BASCOM mußt Du nun nicht extra noch in bestimmte zeitabhängige Terme manuell reingehen, das macht dann das Crystal-Statement ein für allemal.
Im ASM-Prog hab ich's schon rausgeremt, weil im vorausgegangenen Versuch der Assembler mir das Ergebnis schon lieferte. Die Denkweise ist ja folgendermaßen:
Beim Compilieren bzw. Assemblieren können auch beim AVR-ASM Anweisungen erfolgen, die nicht im Befehlssatz der Mnemonik enthalten sind. Auch IF und dergleichen, sowie besondere Statements zur Erzeugung von MAKROS. Es werden auch Fehlermeldungen dann unter Umständen ausgegeben.
Das hat aber mit dem Programm hinterher nichts zu tun. Die MCU "rechnet" diese Dinge nicht aus, die arbeitet dann mit dem "Ergebnis", deswegen oben schon direkt die 25 als Baudratenteilerwert konkret reingesetzt.
.equ bdteiler = 25 ;(mctakt/(16*baud))-1 ;Baudratenteiler
Man könnte auch anders vorgehen, nämlich die folgende Definition
.equ mctakt = 4000000 ;Quarzfrequenz
abändern, also auf beispielsweise 3999800.
Dann würden sich alle "Rechenvorgänge", die sich auf diese Konstante beziehen, beim Assemblieren/Compilieren dementsprechend ändern. (Und natürlich bleibt der Timer-Comparewert dann bei 40000 !)
Die Einstellung der tatsächlichen Taktgenerierung erfolgt beim ATMEL-Studio4 über die Fuses-Maske. (Obiges Programm läuft mit einem fabrikneuen ATTiny2313 nicht. Wieso? Ich muß erst den standardmäßig gesetzten Prescaler durch 8 rausnehmen in den Fuses. Bingo!)
(Hier im Offline-Modus, da ich die serielle Schnittstelle ja für das Modem brauche..)
Siehe angehängtes Bildchen
Gruß von Oskar01