Forum: Mikrocontroller und Digitale Elektronik Timer1-Routine in BASCOM


von günter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo - insbesondere BASCOM-Anwender

Für die Erweiterung einer Schaltung in der bisher einzelne Baugruppen
(insbesondere PCF8574) über den I2C-Bus betrieben werden, möchte ich
jetzt einen AT90S2313 (hat leider keinen Hardware TWI) einbinden:

Aufgabe

Empfangen der Daten über I2C-Bus
--------------------------------

Hierfür habe ich einen Software-I2C-Lösung mittels der -
kostenpflichtigen - I2CSLAVE.lib von MCS-Electronic realisiert und
erfolgreich getestet

(siehe Programm-Code  -- BLINKEN  funktioniert / Portb.0)


TIMER1
------

Im Rahmen meines Projektes benötige ich jetzt jedoch den Timer1 !!

Und den konnte ich bisher nicht überreden,
seinen Dienst anzutreten. :-(

(siehe Programm-Code -- TIMER1_isr: Portb.7 ein / aus
wird nicht aktiv)

Kann mir jemand weiterhelfen ???

Besten Dank im Voraus

Günter

von PeterK (Gast)


Lesenswert?

Ich habe das Programm jetzt nicht genau durchforstet aber ich würde
sagen:
a) Es fehlt mir "On Timer1 Timer1_isr"
damit diese Routine überhaupt angeprungen wird
b) und selbst dann:
Durch den Prescale wird Timer1_isr vermutlich bereits angesprungen,
bevor dort überhaupt dort die 2x100ms für das Blinken abgelaufen sind.
D.h. es wird immer nur
   Portb.7 = 0
   Waitms 100
abgearbeitet, während der 100ms Wartezeit wird die Routine bereits das
nächste Mal angesprungen. Tipp: In Interrupt-Routinen immer so wenig
Zeit wie möglich verbraten.
Idee: In der Timerroutine einfach nur
Incr X (temp. Variable hochzählen)

In der Do/Loop Schleife:
If X >10.000 (oder so - korrekter Wert je nach Prescaler) then
X=0
toggle Portb.0 (abwechselnd 1 und 0)
endif

Dann werden keine "Wait" Befehle gebraucht, die das ganze System
solange lahmlegen.

Viel Glück
PeterK

von Ralf K. (Gast)


Lesenswert?

Hi Günter,
folgende Fehlerchen sind mir in deinem Code aufgefallen:
Timer1 ist nicht richtig konfiguriert, hast vergessen die OCR Register
zu setzen, somit haben sie bei dir zufällige Werte.
Schau dir bitte folgendes Beispiel an:

' Timer1 Einstellungen für 1s
Config Timer1 = Timer , Prescale = 64
Ocr1ah = &H3D                     'für 1MHz
Ocr1al = &H09
Set Tccr1b.3                      'für Waveformgenerator, wichtig!!!
On Compare1a Timer1_isr
Enable Compare1a

Tja Bascom ist nicht perfekt, aber diese Lösung läuft! ;-)

Du hast Timer1 als Variable verwendet, das geht nicht.
Mußt schon eine Variable definieren und sie bei jedem Timertick
erhöhen.

Dann kann ich Peter nur zustimmen: Interruptroutinen müssen knapp
gehalten werden!
Kannst Variablen erhöhen, LEDS togglen usw. aber auf keinen Fall nen
Waitms100 einbauen.
Könnte passieren, daß deine Routine dann rekursiv aufgerufen und
irgendwann läuft der Stack über -> Absturz.
Also alles was länger dauert muß aus Interruptroutinen raus, denn sie
soll ja brav im Hintergrund laufen.

Was ich noch vermisse in deinem Progrämmchen sind die Aufrufe der I2C
Routinen, denn sonst sind sie wirkungslos.

Wünsche dir viel Erfolg
lg Ralf

von günter (Gast)


Lesenswert?

Hallo PeterK
Hallo RalfK


Die Ergänzungen für die Timer-Konfiguration und die Hinweise 'nur
kurze Interrupt-Routinen' zu realisieren, werde ich beachten.

>Was ich noch vermisse in deinem Progrämmchen sind die Aufrufe der I2C
>Routinen, denn sonst sind sie wirkungslos.

das Programm wird von einem I2C-Master angesprochen:
entweder 'Master has Data' beim Daten-Empfang bzw. 'Master need
Data'
wenn der Master Daten abruft (Software-I2C mit I2Cslave.lib von MCS)
Dieser Teil des Programms funktioniert einwandfrei.

Vielen Dank nochmals für euere Bemühungen

Günter

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.