PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Serielle Kommunikation Mega 16 - Mega 162, für mich unerklärbarer Fehler



#fritz#
28.03.2012, 21:08
Ich benutze einen Mega 16 zur Steuerung in einem Wochenendhaus. Die Anlage ist kurz vor Fertigstellung und soll demnächst eingebaut werden.
Der Mega 16 überwacht Türen, Bewegungsmelder, Akkuspannung.... und sendet die Ereignisse seriell an einen Mega 162, der dann ein Modem steuert. Die Ereignisse werden dann per Mail weitergeleitet.
Die Ereignisse (Tür auf, Bewegungsmelder aktiv...) werden als String 20 Zeichen lang, bestehend aus Datum, Uhrzeit und entsprechende Nummern für die Ereignisse gesendet.

Folgendes funktioniert fehlerfrei:
stündliche Übermittlung der Akkuspannung
Meldung wenn Bewegungsmelder aktiv
Meldung wenn Türklinke gedrückt oder Tür geöffnet

Wenn aber der Akku vom Netz nachgeladen wird, dann werden nur 10 oder 11 Zeichen des Strings gesendet. Danach ist Schluß. Die restlichen 9-10 Zeichen fehlen.

Das verstehe ich nicht.

Die Sendung der Daten erfolgt immer aus dem gleichen Unterprogramm "Daten_senden", welches aus den verschiedenen Programmbereichen aufgerufen wird. Die Ereignisnummer (für Akkuladung -> 6) wird an das UP übergeben.
Selbst wenn ich aus dem Programmbereich "Akku laden" direkt sende und auf den Sprung zum Unterprogramm verzichte, dann werden auch nur maximal 11 Zeichen gesendet.

Es macht auch keinen Unterschied ob der fehlerhaften Übermittlung schon mehrere Sendungen vorausgegangen sind oder nicht. Wenn ich sofort nach Programmstart eine Akkuladung simuliere, wird auch nur die Hälfte übermittelt. Ist danach der Bewegungsmelder aktiv, dann läuft alles wie gaplant.

Es ist schwer, so etwas aus der Ferne zu beurteilen. Vielleicht hat jemand eine Idee?

Danke

PS:

Programmiert wird in BASCOM

Zum besseren Verständnis:

Programmschleife:

1. Bewegungsmelder prüfen
aktiv --- > Ereignis = 3, gosub daten_senden

2. Türkontakt prüfen
Tür auf--- > Ereignis = 4, gosub daten_senden

3. Akkuspannung prüfen
<11,8 V--- > Relais einschalten
--- > Ereignis = 6,gosub daten_senden

Schleifenende

Unterprogramm Daten_senden
Print, #1 Datum, Uhrzeit, Ereignis
return
--------------------------------------------------------------------------

1. und 2. Funktioniert, die Daten werden wie gewünscht gesendet
3. funtioniert nicht, nur 10 od. 11 Zeichen werden gesendet

peterfido
29.03.2012, 07:19
Ohne Code fehlt mir die Grundlage zu helfen.

Searcher
29.03.2012, 07:31
Ja, ohne Code und vielleicht später auch Schaltplan kann man nur raten. Ich sag mal: Stacküberläufe

PicNick
29.03.2012, 09:21
Spekulation: Wenn der Check-Akku-Spannung-Routine beim Messen WÄHREND des Ladens durchdreht und die Kiste mit Interrupts vollstopft, kann SW-Uart senden beeinträchtigt werden, weil das Timing im A... ist.

Die Zeichen, die fehlen : ist das eine geschlossene Folge oder verteilen sich die über den gesamten String ? (Also z.b. nur jedes zweite Zeichen )

#fritz#
01.04.2012, 22:15
Hallo,
zunächst vielen Dank für die Hinweise.

Ich bin der Sache noch einmal nachgegangen:
Ich habe die Akkuladung bisher nur durch eine SMS ausgelöst. Der Befehl wird seriell vom Modem an den AVR übermittelt.
Der Fehler tritt also nur auf, wenn der Sendung ein serieller Dateneingang vorausgeht.
Dann werden die ersten 10-11 Zeichen lückenlos gesendet. Die restlichen Zeichen fehlen komplett.

Wenn die Spannung tatsächlich abfällt und dadurch die Akkuladung ausgelöst wird, dann wird der
komplette String (20 Zeichen) fehlerfrei gesendet.


Es sind wirklich mehrere Interrupts aktiv - alle 3 Timer - durch Funkuhr und die restlichen 2 durch mich programmiert.

Aber ich komme damit klar. Ich brauche ja nur eine E-Mail, wenn die Akku-Spannung wirklich abfällt.

Ich möchte Euch nicht zumuten, den ganzen Code zu analysieren.

Danke