PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Power Down Mode ATmega8 - aufwecken durch Neustart



spelli2001
20.04.2012, 15:13
Hallo,

eigne kleine Verständnisfrage:

ich arbeite u. a. an einer LiPo-Schaltung. Hierbei soll ein Verbraucher bei Unterschreiten einer bestimmten Spannung abgeschaltet werden und der Atmega8 in den Power Down Modus gehen - der Atmega8 kann über einen Interrupt aufgeweckt werden.

Wird der Atmega8 auch aufgeweckt, wenn ich die Schaltung neu bestrome also einen "frischen" Akku anlege? - also ohne einen Interrupt?

Danke und Gruß

Kampi
20.04.2012, 15:36
Wenn kein RESET oder Interrupt ausgelöst wird, wird er nicht aufgeweckt.
Wenn das Akku wechseln beinhaltet, dass die Spannung wegbricht klärt sich die Frage wohl von selbst :)

spelli2001
20.04.2012, 16:15
Okay, danke! :o

spelli2001
23.04.2012, 09:35
Hallo,

jetzt habe ich an meinem Atmega8 Int0 und Int1 als Output konfiguriert. Die Interrupts werden fürs Aufwecken nicht benötigt, da ein LiPo vor Tiefentladung geschützt werden soll...

Jedoch will "Power Powermode" nicht so richtig...

In folgender Sub rufe ich den Befehl auf:


Lipo_saver_off:
Quittierung = "LiPo-Saver!" ' Quittierung an Bodenstation
Print #1 , "LiPo-Saver!" ' test
Waitms 500
Pwr_all = 0
Quittierung = "" 'Quittierung löschen

Power Powerdown ' sleep

Return

Da verändert sich nichts - auch als normalen Aufruf um Hauptprogramm...

Müssen diese Modi in den Fusebits gesetzt werden?

Danke und Gruß
Christoph

Kampi
23.04.2012, 10:23
Hi,

ich glaube das muss auch "Config Powerdown" heißen. Schau mal in der Bascomhilfe nach Powerdown. Außerdem wird in dem Powerdown Mode nur der Ext. Takt gestoppt. Schau mal im Mega8 Datenblatt nach was der Mode macht.

spelli2001
23.04.2012, 15:41
Hallo,

also folgendes habe ich jetzt nochmal probiert:


Lipo_saver_off:
Quittierung = "LiPo-Saver!" ' Quittierung an Bodenstation
Print #1 , "LiPo-Saver!"
Quittierung = "" 'Quittierung löschen
Waitms 500

Pwr_all = 0 ' testweise Ausgabe PWR_all = 0 --> hier: LED an!

Disable Interrupts



Powerdown ' sleep

Return

Die Stromaufnahme fällt ganz kurz auf ca. 3 mA und geht dann auf ca. 30 mA wieder hoch...

hier genau das gleiche:


$regfile = "m8def.dat"
$crystal = 7372800 ' 7,3728 Mhz Quarzoszillator an PB6 / XTAL 1
$hwstack = 64
$swstack = 64
$framesize = 64



Stop Adc
Stop Ac
Stop Watchdog

Powerdown

End

Multimeter ist ein Voltcraft VC820 , laut Conrad.de: Messbereich A/DC 0.1 µA - 20 A

Thomas E.
18.05.2012, 10:52
Die Bascom-Hilfe sagt, dass du Config Powermode verwenden sollst:
Zitat aus der Hilfe für Powerdown:

You should use the new CONFIG POWERMODE statement.

spelli2001
26.05.2012, 20:22
Hallo,

also bei
config powermode = powerdown erhalte ich eine Fehlermeldung!



Bei diesem Code verhält es sich so, dass die Stromaufnahme kurz auf die 2 mA abfällt und dann wieder auf ca. 27 mA hochgeht...


Lipo_saver_off:
Quittierung = "LiPo-Saver!" ' Quittierung an Bodenstation
Quittierung = "" 'Quittierung löschen
Waitms 500

Pwr_all = 0
Led_rot = 1

Disable Adc


Power Powerdown ' sleep



Return

Thomas E.
26.05.2012, 23:42
Poste doch mal den gesamten Code, vielleicht liegt der Fehler ja gar nicht in der Sub.
Misst du direkt die Stromaufnahme des Controllers? Weil 27mA sind viel, finde ich, und wenn der Controller in den Powerdown versetzt wird, sollte er ebenfalls deutlich weniger als 3mA ziehen.

Ich erhalte bei Config Powermode = Powerdown keine Fehlermeldung. Vielleicht verwendest du eine veraltete Version von Bascom?

Rone
27.05.2012, 08:15
Hallo,

wie Thomas schon gesagt hat, compilierbaren Code der den Fehler beinhaltet posten und dazu die Bascomversion.
Disable Adc schaltet den ADC-Interrupt aus. Ist das so gewollt?

MfG
Rone

spelli2001
27.05.2012, 10:59
Hallo,

Code ist für eine Steuerung von sog. KAP-Rig, Luftbildaufnahmen von einem Drachen bzw. einem Gestell an der Leine
des Drachens aus!

Das ganze ist noch im Entwicklungsmodus...

ADC hatte ich gelesen, kann noch etwas Strom einsparen. Die gesamte Schaltung soll so wenig wie möglich Strom aufnehmen,
wenn die Spannung unter 6,3 Volt fällt. Ziel ist nicht, diese über Interrupt ooder so aufzuwecken.

Aufwecken halt nur über Neustart bzw. Reset wenn Spannungsversorgung neu angelegt wird!

Bascom Version ist: 2.0.7.1

"Powerdown" wird ganz unten unter "lipo_saver_off" aufgerufen!




'--------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'--------------------------------------------------------------------------

$regfile = "m8def.dat"
$crystal = 7372800 ' 7,3728 Mhz Quarzoszillator an PB6 / XTAL 1
$hwstack = 64
$swstack = 64
$framesize = 64

$baud = 9600


'--------------------------------------------------------------------------
' Definition von Ressourcen
'--------------------------------------------------------------------------

Pwr_all Alias Portc.4 'Abschaltung der Servos und LM2675 (5V f¸r GPS, Video 5,8 GHz Tx)
Pwr_gps Alias Portc.1
Pwr_video Alias Portd.4

Bit0 Alias Portc.2
Bit1 Alias Portd.5
Bit2 Alias Portb.5

Cam_gnd Alias Portd.6

Led_rot Alias Portc.5

Pan1 Alias Portb.0 ' f¸r L293 D
Pan2 Alias Portd.7



'--------------------------------------------------------------------------
' Definition von Konstanten
'--------------------------------------------------------------------------

Const Adc_multi = 0.0048828125 ' = 5.0 / 1024.0 -> ADC auflˆsen

Const S1_links = 100 'je nach Servo!
Const S1_rechts = 50 'je nach Servo!

'--------------------------------------------------------------------------
' Definition von Variablen und Datentypen
'--------------------------------------------------------------------------

'---- Betriebsspannung messen ----
Dim Spannung As Word
Dim Zellspannung_orig As Single
Dim Zellspannung As String * 5

'---- Commands ----
Dim Quittierung As String * 14
Dim Gpshoehe As String * 13


'---- Command empfangen xxx----

Dim Cmd As Byte



'Dim f¸r GPS einlesen
Dim Gelesen As Byte 'eingelesenes Zeichen

Dim Teilstring(14) As String * 12
Dim Anzahl2 As Byte
Dim Gpsdaten As String * 98
Dim Header As String * 6
'Dim Stunde As Byte
Dim Tempstring As String * 2



'---- Temperaturmessung ----
Dim Temp(9) As Byte
Dim X As Byte
Dim Celsius As Integer
Dim T As Single
Dim Temperatur As String * 5

'---- PWM f¸r A293D ----
Dim A As Byte

Dim Swert As Byte

'--------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen
'--------------------------------------------------------------------------

'---- CONFIG ----

' RS232 Hardware
Config Serialin = Buffered , Size = 1 ' konfig serial in
Open "COMB.7:9600,8,N,1" For Input As #1 'PB.7 = RxD SoftUART / GPS


' ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Wandler definieren

' Servo
Config Servos = 1 , Servo1 = Portb.2 , Reload = 10

' Timer f¸r PWM
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8

' schaltbare Ausg‰nge
Config Pwr_all = Output ' GPS- und Video-Modul sowie 5 Volt Versorgung hierf¸r abschalten
Config Pwr_gps = Output
Config Pwr_video = Output

Config Bit0 = Output
Config Bit1 = Output
Config Bit2 = Output

Config Cam_gnd = Output

' Status-LED rot
Config Led_rot = Output

' L293D f¸r Servo als Motor
Config Portb.1 = Output
Config Pan1 = Output 'LD293
Config Pan2 = Output

' Servo PIN
Config Portb.2 = Output

'1wire f¸r Temp.-Messung
Config 1wire = Portc.0 ' Pin f¸r 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert

'Interrupts
Enable Interrupts
Enable Timer1

' sonstige
Start Adc
Declare Sub Xbee ' Senderoutine, um $GROUND#... permanent zu senden

'--------------------------------------------------------------------------
' Init
'--------------------------------------------------------------------------


Pwr_all = 0 ' bei Systemstart Peripherie auf OFF
Pwr_video = 0
Pwr_gps = 0

Led_rot = 1 ' Led_rot OFF

Pan1 = 0 'L293D OFF
Pan2 = 0

Bit0 = 0
Bit1 = 0
Bit2 = 0

Cam_gnd = 1


Swert = 100
Servo(1) = Swert 'Servo

'LED blinken lassen
Led_rot = 1
Waitms 100
Led_rot = 0
Waitms 100
Led_rot = 1
Waitms 100
Led_rot = 0
Led_rot = 1
Waitms 100
Led_rot = 0
Waitms 100
Led_rot = 1
Waitms 100
Led_rot = 0


'nach einer Sek. Pwr_all ON
Wait 1
Pwr_all = 1

'nach einer weiteren Sek. Pwr_gps ON
Wait 1
Pwr_gps = 1



' Begr¸flung

Quittierung = "Hallo"


Wait 2
Cam_gnd = 0
Waitms 150
Cam_gnd = 1
Cam_gnd = 0
Waitms 150
Cam_gnd = 1


'--------------------------------------------------------------------------
' Hauptprogramm
'--------------------------------------------------------------------------

Do






'========== hier laufen Tests ab ==========================================





'==========Temperaturmessung mit DS18B20Z 1Wire============================


1wreset

1wwrite &HCC
1wwrite &H44
Waitms 600

1wreset
1wwrite &HCC
1wwrite &HBE


For X = 1 To 9
Temp(x) = 1wread()
Next

Celsius = Makeint(temp(1) , Temp(2))


T = Celsius / 16

Temperatur = Fusing(t , "##.#")



'==========Spannung LiPo 2S messen========================================

Spannung = Getadc(3) ' Zelle messen und berechnen
Zellspannung_orig = Spannung * Adc_multi
Zellspannung_orig = Zellspannung_orig * 2
Zellspannung = Fusing(zellspannung_orig , "#.#")

If Zellspannung_orig <= 6.4 Then ' Zellspannung unter/gleich 6,4 Volt (2x 3,2 Volt) dann...
Gosub Lipo_saver_off
End If



'==========Rx Pr¸fen auf GPS Eingang GPGGA=================================




Gelesen = Inkey(#1)

If Gelesen = 36 Then Input #1 , Gpsdaten Noecho '36 = $
Header = Mid(gpsdaten , 1 , 5)

If Header = "GPGGA" Then
Anzahl2 = Split(gpsdaten , Teilstring(1) , ",")
Gpsdaten = ""
Gpshoehe = Teilstring(10)

End If




'==========Rx Pr¸fen auf Befehlseing‰nge==================================

' Inputbin Cmd


If Ischarwaiting() = 1 Then
Cmd = Inkey()
End If


Select Case Cmd

Case "r"
Clear Serialin
Cmd = ""
Quittierung = "rechts"
Call Xbee
A = 160
Compare1a = A
Pan1 = 0
Pan2 = 1
Waitms 70
Pan1 = 0
Pan2 = 0


Case "R"
Clear Serialin
Cmd = ""
Quittierung = "REchts"
Call Xbee
A = 160
Compare1a = A
Pan1 = 0
Pan2 = 1
Waitms 700
Pan1 = 0
Pan2 = 0


Case "l"
Clear Serialin
Cmd = ""
Quittierung = "links"
Call Xbee
A = 160
Compare1a = A
Pan1 = 1
Pan2 = 0
Waitms 70
Pan1 = 0
Pan2 = 0


Case "L"
Clear Serialin
Cmd = ""
Quittierung = "LInks "
Call Xbee
A = 160
Compare1a = A
Pan1 = 1
Pan2 = 0
Waitms 700
Pan1 = 0
Pan2 = 0


Case "+"
Clear Serialin
Cmd = ""
Quittierung = "S1 hoch "

Swert = Swert + 10

Servo(1) = Swert




Case "U"
Clear Serialin
Cmd = ""
Quittierung = "S1 Hoch "

Servo(1) = S1_links


Case "-"
Clear Serialin
Cmd = ""
Quittierung = "S1 runter "

Swert = Swert - 10

Servo(1) = Swert



Case "D"
Clear Serialin
Cmd = ""
Quittierung = "S1 Runter "

Servo(1) = S1_rechts

Case "1"
Clear Serialin
Cmd = ""
Quittierung = "LED "

Cam_gnd = 0
Waitms 150
Cam_gnd = 1


End Select


Call Xbee ' kontinuierliches Senden der Parameter


Loop



End






'----------------LiPo-Saver/Abschaltung "Lipo_saver"----------------------------

Lipo_saver_off:
Quittierung = "LiPo-Saver!" ' Quittierung an Bodenstation
Quittierung = "" 'Quittierung lˆschen
Waitms 500

Pwr_all = 0 ' testweise Ausgabe PWR_all = 0 --> hier: LED an!
Led_rot = 1

Disable Adc
Disable Timer1

Portb.7 = 0

Powerdown


Return


'----------------Sonstiges------------------------------------------------------



Link:

Led_rot = 1

Return



No_link:

Led_rot = 0

Return



Sub Xbee

Print "$GROUND" ; "#" ; Quittierung ; "#" ; Zellspannung ; "#" ; Temperatur ; "#" ; Gpshoehe


End Sub

021aet04
27.05.2012, 11:27
Warum schaltest du nicht den gesamten µC ab? Da du den µC mit neu Starten willst indem du die Versorgung trennst könntest du den µC von der Versorgung mit einem Transistor o.Ä. trennen. Wenn du den µC brauchst/neustartest überbrückst du den Transistor mit einem Taster. Der µC startet und schaltet den Transistor (wie eine Selbsthaltung). Sinkt die Spannung unter einen Wert schaltest du den µC mit dem Transistor ab. Wenn du einen Fet nimmst könntest du sogar im Betrieb Strom sparen (Widerstand am Gate nicht vergessen).

MfG Hannes

spelli2001
27.05.2012, 11:39
Hallo Hannes!

Stimmt eigentlich!

Also:

ein Ausgangspin schaltet grds. bei Start immer einen einen Fet durch, sodass die Schaltung läuft. Dann wird der Ausgangspin geschaltet und die Schaltung ist tot.

Möchte ich die Schaltung starten, überbrücke ich den entsprechenden PIN!

An dieser Stelle wird mir auch klar, was bei mir hier noch Strom zieht - es müsste der LM 2950Z sein!!!! Schitte - hatte ich vergessen.... dann schalte ich einfach mit dem FET dessen Stromversorgung...

Danke!

021aet04
27.05.2012, 11:55
Stimmt. So kannst du alles abschalten was du nicht brauchst, inkl Spannungsregler, Sensoren falls vorhanden,...

MfG Hannes

spelli2001
06.06.2012, 10:28
Hallo,
jetzt möchte ich für eine andere Schaltung die Stromversorgung abschalten, wenn die
Spannung unter eine bestimmte Schwelle fällt.

Ich verwende diesen Schaltregler von Conrad: 167805 (Schaltregler Typ
W78 Conrad W78-5V0 Gehäuseart Vertikal Ausgangsspannung 5 V
Eingangsspannung 7 - 34 V Ausführung Schal).

GND dieses Schaltreglers wird erst durch einen IRLU 2905 zugeschaltet.
Zum Starten überbrücke ich den IRLU 2905 mittels eines Tasters. Dann
wird der IRLU 2905 durch den AVR durchgeschaltet.

Jetzt habe ich aber festgestellt, dass der IRLU 2905 ca. 7-8 Volt
liefert, wenn abgeschaltet...

Den zu groß dimensionierten IRLU 2905 verwende ich, da ich die für alles
mögliche verwende und hier in großer Stückzahl habe.

Ich verwende einen 100K Basis-Widerstand.


Jetzt vermute ich, dass

a) der Basiswiderstand falsch dimensioniert ist

b) man den Schaltregler so nicht mittels eines FET steuern kann?


Danke und Gruß