mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer1-Routine in BASCOM


Autor: günter (Gast)
Datum:
Angehängte Dateien:

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

Autor: PeterK (Gast)
Datum:

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

Autor: Ralf K. (Gast)
Datum:

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

Autor: günter (Gast)
Datum:

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

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.