PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timing Probleme nach Powersave Modus



tttobi
07.03.2016, 08:32
Hallo zusammen,

ich verzweifle gerade an einem Problem mit dem Powersafe Modus. Ich möchte einen Futterautomaten bauen der sich per Bluetooth programmieren lässt. Da das Gerät später per Akku betrieben wird möchte ich möglichst energiesparend arbeiten. Inzwischen habe ich den Programmcode soweit gekürzt wie es nur geht um mögliche Fehlerquellen auszuschließen. Mir ist schon klar das er so keine sinnvolle Funktion mehr erfüllt, es geht mir nur um das Phänomen.
Die $PROG Zeile ist drin damit klar ist das auch die Fuse-Bits korrekt gesetzt sind.



$prog &HFF , &HE2 , &HDF , &HFF
$regfile = "m48def.dat"
$crystal = 8000000
$baud = 9600
$hwstack = 32
$swstack=24
$framesize=24

Config Portd.2 = Input

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 64
Stop Adc
Stop Ac
Stop Watchdog

Config Date = Dmy , Separator = Dot
Config Clock = Soft
Date$ = "19.02.16"
Time$ = "12:00:00"

Enable Interrupts

'Variable
Dim Menge1 As Word
Dim Alarm1 As String * 8
Dim N As Word
Alarm1 = "12:00:05"
Menge1 = 10

'Programmbeginn
Waitms 1500
Do
If Time$ = Alarm1 And Menge1 > 0 Then
'Motoranlaufen lassen ca. 3Sek
For N = 120 To 255
Pwm1a = N
Waitms 22
Next N
Wait Menge1
End If
Pwm1a = 0
If Pind.2 = 0 Then Config Powermode = Powersave Else Config Powermode = Idle
Loop

End

Vergessen wir mal die ganze Bluetooth-Geschichte, die ist ja hier gar nicht mehr drin und war offensichtlich nicht für den Fehler verantwortlich.
Das Programm funktioniert jetzt folgendermaßen.
Der Chip wacht jede Sekunde aus dem Powersave Modus auf, da dann ein Pufferüberlauf an Timer2 stattfindet. Der wird durch die Config Clock Routine ausgelöst. Dazu habe ich einen Uhrenquartz an TOSC1 und TOSC2 angeschlossen.
Das Aufwachen funktioniert offensichtlich, da der Motor um "12:00:05" auch anläuft.
Was mir ein Rätsel bleibt ist warum es einen Unterschied macht ob der Chip aus dem Powersafe Modus, oder aus dem Idle Modus aufwacht.

Liegt an Pind.2 eine logische 1 an klappt alles wunderbar, der Motor dreht sich insgesamt ca. 13Sekunden. (Idle Modus)
Liegt an Pind.2 eine logische 0 an läuft der Motor ca. 95 Sekunden. (Powersafe Modus)
Ich kann mir dieses Verhalten beim besten Willen nicht erklären. Es muss etwas damit zu tun haben das der Chip nach dem Idle Modus scheinbar nicht mehr mit 8MHz arbeitet...

Hat jemand eine Idee woran das liegen kann?

Viele Grüße,
Tobias

peterfido
07.03.2016, 15:37
Hallo,

ich kann Timer2 nirgends im Code entdecken.

tttobi
10.03.2016, 09:02
Hallo Peterfido,

der Timer2 wird von der Config Clock Routine benutzt und automatisch gesetzt.

peterfido
10.03.2016, 16:37
Hallo,

ja klar. :-b

Im Datenblatt unter Errata steht so einiges mit dem asynchronen Timer. Ansonsten würde ich probieren, nach dem Aufwachen die CLKPR-Clock Prescale Register nochmals zu setzen. Evtl. wird da was beim 'Schlafenlegen' geändert. Im Datenblatt Punkt 6.11.