mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer1: Compare-mode spinnt


Autor: Mario Mauerer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend zusammen,

ich versuche gerade, Timer1 dazu zu bewegen, mir bei seinem Durchlauf 2
Interrupts auszulösen. Kurz: Ich krieg das Compare-Zeugs nicht gebacken.
Ich programmiere mit Bascom.
Kann jemand schnell die passenden Codeschnipsel posten?
Wie initialisiere ich den Timer?
Wie schreibe ich die Vergleichs-Register in der Interrupt-Routine?

In der Bascom Hilfe kommt der Compare-Mode nur in Zusammenhang mit Pins
(an-abschalten) vor, ich brauch aber Interrupts....

Kann mir ein Bascom-Wissender helfen?

Herzliche Grüsse
Mario

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wärs, wenn du mal angibst, welchen Controller du verwendest?
Ausserdem wärs nicht schlecht, wenn du deinen Code postest, dann würden
wir vielleicht gleich sehen, wo der Fehler liegt. Und es ist auch nicht
schlecht, wenn du sagst, warum du das so brauchst. Könnte ja sein, dass
man es einfacher bzw. ohne Timer oder was weiss ich lösen kann.

Schließlich können wir nicht hellsehen... Ist nicht bös gemeint, aber
ich glaube, wenn du so drüber nachdenkst, kommst du auch zu dem
Schluss, dass das besser wäre, hm?

Ralf

Autor: Mario Mauerer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann bestätigen, ich komm zu dem Schluss! :)

Also:
Ich verwende den Mega8 und Bascom
Ich brauch halt einfach den Timer1 mit zwei Interrupten, ich möchte das
auch aus lerntechnischen Gründen nicht mit zwei Timern lösen.

Hier mal mein Code bisher:
(ist nur ein "Testprogramm" für diese Timer-Funktion)
Das LCD wird vorher korrekt initialisiert, hier nur die Timer-Sequenz
des Codes.

Config Timer1 = Timer , Prescale = 8
Enable Timer1
Enable Interrupts

On Compare1a Eins
On Compare1b Zwei

Dim X As Long
Dim Y As Long
X = 10
Y = 16
Compare1a = X
Compare1b = Y
Start Timer1

Cls

Locate 2 , 1
Lcd "LCD-Runs!"

Do
Loop

Eins:
disable Interrupts
X = X + 10
Compare1a = X
Cls
Locate 1 , 1
Lcd "Eins"

Enable Interrupts
Return

Zwei:
disable Interrupts
Y = Y + 5
Compare1b = Y
 Cls
Locate 1 , 1
Lcd "Zwei"
Enable Interrupts
Return

End

Doch: die Interrupts werden nicht ausgelöst! Es kommt keiner. Das LCD
funktioniert, es liegt am Timer.

Ich entschuldige mich für die knappe Ausdrucksweise, ich war in Eile.

Herzlichen Gruss
Mario

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Autsch, mit AVR's kenn ich mich nun gar nicht aus, ich bin auf 8052er
getrimmt ;-)

Musst ein bisschen warten, da schaltet sich bestimmt noch jemand dazu,
der sich mit AVR's auskennt...

Gruß Ralf

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was erwartest du eigentlich vom Timer?

Ein Compare-match-Interrupt tritt auf, wenn der Zählerstand von
tcnt1(h:l) den Stand von ocr1a(h:l) bzw. ocr1b(h:l) erreicht.
Du addierst jeweils 5 oder 10 zu den OCR1xx-Registern. Das sind bei
Vorteiler 8 40 bzw. 80 Prozessortakte.

Dann schreibst du noch in der ISR Text auf das LCD.
- Wieviele Takte braucht diese Textausgabe eigentlich?
- Wieviel Zeit hast du überhaupt in der ISR, wenn du nach 40 bzw. 80
Takten schon den nächsten Interrupt erwartest? Dabei kostet der Aufruf
eines Interrupts und der Rücksprung alleine schon 10 Takte in ASM, ich
glaube kaum, dass BASCOM das schneller kann.

Vielleicht solltest du BASCOM erstmal (nur vorübergehend) beiseite
legen und die Hardware-Features des Controllers mittels Datenblatt und
Assembler (AVR-Studio) kennen lernen. Dann bekommst du vielleicht ein
Gefühl für das Machbare...

...

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hat HanneS völlig recht.

In Interrupts so schnarchlahme Sachen zu machen, wie LCD-Ausgaben ist
ganz ganz schlecht.


Auch solltest Du daran denken, daß ein Text mindestens 500ms stehen
bleiben sollte, damit Du ihn auch ablesen kannst.


D.h. die Interrupts kommen schon, aber viel langsamer als Du willst und
das Display kann keinen der Texte anzeigen, da Du ihn ja sofort wieder
löschst.


Peter

Autor: Mario Mauerer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, ich vergass zu erwähnen, dass ich das Programm bis jetzt nur im
Bascom-Simulator laufen liess, und der taktet ja nicht mit einem
Megahertz...
Daher die struben Werte, mit höheren Zahlen gings auch net....

Mich interessiert, ob der Code so korrekt ist... Dann werd ichs nämlich
mal mit Leds testen, aber wenns der Sim net frisst, wirds in Realität
wohl auch net anders gehen, oder doch?

Herzlichen Gruss
Mario

Autor: Mario Mauerer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, ich bau jetzt einfach mal das Ding mit Leds nach. Ich hab die
Comparewerte zu klein gewählt (auch für den Sim). Stimmt der obige
Code?

Autor: Mario Mauerer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, ich hab das Programm jetzt mal gebaut.
Ich möchte mit einem Compare-Interrupt eine Led an- und ausschalten.
Hier ist der Code:

$regfile = "m8def.dat"
$crystal = 1000000
Ddrd.7 = 1
Portd.7 = 0
Config Timer1 = Timer , Prescale = 8
Enable Interrupts
On Compare1a An

Dim X As Long

X = 1500

Compare1a = X

Enable Timer1
Do
Loop

An:
Disable Interrupts
X = X + 1500
Compare1a = X

Toggle Portd.7
Enable Interrupts
Return

End

Doch: die Led bleibt ausgeschaltet!

Warum? Könnt ihr mir helfen, dieses Compare-Zeug zum laufen zu bringen?
Ich komm sonst net weiter... Es hat doch sicher jemand das schon mal so
gemacht....

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne mich in Basic nicht aus und ohne Kenntnis der
Basic-Spezialfunktionen kann man da nichts erkennen.

Was merkwürdig aussieht:

"On Compare1a An"

definiert wohl einen Interrupthandler (wird damit auch der Interrupt
enabled ?).

Aber:

"Compare1a = X"

weißt dem Interrupthandler einem Wert zu ???

Man sollte schon für Variablen und Funktionen unterschiedliche Namen
nehmen (unter C ginge sowas erst garnicht).


Wenn man Basic-Spezialfunktionen nimmt, muß man auch genau das Manual
dazu durchlesen bzw. es gibt bestimmt auch Beispiele dazu.

Unter C nimmt man keine Spezialfunktionen sondern man setzt alle
IO-Register selber, wie es laut Datenblatt zu erfolgen hat.
Damit hat man keinen Trouble, daß ein anderer es nicht verstehen kann
oder irgendwas anders erfolgt, als man vermutet.


Peter

Autor: Mario Mauerer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Hilfe zum Compiler steht dazu eben nichts!!
Darum frage ich hier ja an!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mario...

Es ist ganz einfach:

In die dementsprechenden I/O-Register müssen die dementsprechenden
Werte gesetzt werden (einzelne Bits setzen).
Diese I/O-Register und deren Bits haben eindeutige Namen, die man im
Datenblatt nachlesen kann. Diese Namen sind verbindlich, egal ob man
(wie ich) in Assembler "rumgurkt" oder (wie Peter) in C
programmiert.

Eine Hochsprache, die ihre eigenen Namen verwendet, ist untauglich!
Daher verwendet hier auch kaum jemand dieses BASCOM.

Ich habe gewiss nix gegen BASIC als Hochsprache, ich benutze es z.B.
auf dem PC und auf dem Commodore Plus/4, aber das BASCOM für AVRs ist
eher eine Bremse als eine Hilfe. Es suggeriert zwar aufgrund der
mitgelieferten Bibliotheken schnellen Erfolg, aber sobald es ins Detail
geht, wird man verdummt. Sorry, das ist mir irgendwo zuviel BASIC, zu
weit weg von der Hardware, deshalb verzichte ich freiwillig darauf...

...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"In der Hilfe zum Compiler steht dazu eben nichts!!"

Wirklich nicht ?
Hast Du denn überhaupt im Bascom-Verzeichnis gesucht ?
Und auch keine Beispiele gefunden ?

Dann ist Bascom aber große Scheiße.


Vielleicht Datenblatt lesen und selber machen, also:

TCCR1A =
TCCR1B =
TIMSK =
OCR1A =
usw.

Bascom versteht doch wenigstens die IO-Registernamen, die Atmel
vordefiniert hat ?


Peter

Autor: Mario Mauerer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, ich hab schon probiert die Werte ins OCR1a- Register zu schmeissen,
hat er nicht gefressen, obwohl man auch ASM programmieren kann (mit
Bascom, er versteht es). (Also: OCR1A=X, das frisst er net)

Die anderen Register für den Timer (TIMSK, TCCR1A etc. ) gehen gut mit
der Hochsprache, das ist das "config Timer1" etc....


??

Autor: Mario Mauerer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, falls das mit dem Compare-Zeugs jemand in ASM da hat, kann er mir
den Codeschnipsel schicken? Dann würde ich direkt den Assemlber-Code
einbinden...

Herzlichen Gruss
Mario

Autor: Hannes Lux (hannes)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Willst du dir das wirklich antun???

Dann viel Spaß...

...

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.