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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.