M.Jo
22.12.2012, 22:51
Hallo an Alle,
ich möchte mit einem Attiny13 eine Steuerung realisieren, welche erstens ein angeschlossenes Akkupack laden und zweitens dieses über ein Lämpchen wieder entladen (eigentlich der Hauptnutzen;) ) kann.
Jetzt habe ich an den Portb.0 einen Schalter angeschlossen, der den Interrupt-Eingang gegen Masse oder Ub ziehen kann. Das Programm beinhaltet zwei Unterprogramme (Laden und Entladen) die, je nachdem auf welcher Position der Schalter steht, ausgeführt werden sollen. Gesteuert werden soll das Ganze also durch einen Interrupt....
Und da habe ich nun folgendes Problem, dass nur das Programm "Entladen" ausgeführt wird. Irgendwie erkennt der Controller den Interrupt nicht, wenn PCINT0 "high" wird :( , jedenfalls wird der "Laden" teil nie ausgeführt...
Hier mein Code:
$regfile = "attiny13.dat"
$crystal = 4800000
$hwstack = 32
$swstack = 8
$framesize = 16
Stop Ac 'Analogen Komparator ausschalten
Dim Modus As Bit
Dim Vbatt As Word
Config Adc = Single , Prescaler = Auto , Reference = Internal '1,1Volt interne Referenzspannung
' 1,1V / 1024 = 0,00107V Auflösung; direkt am ADC
' mit Spannungsteiler :4,54545... kann bis 5V gemessen werden (Auflösung real ca.0,02V)
Config Int0 = Change
On Pcint0 Interrupt
Config Portb.0 = Input '=0, dann Entladen und Tiefentladeschutz / =1, dann Laden und Ladeschluss
Config Portb.1 = Output '=0, dann Lämpchen aus
Config Portb.2 = Output '=1, dann Ladestrom aus / =0, dann Ladestrom an
Config Portb.4 = Output 'LED + Piezo
'_________________________________________________ __________________________________________________ ________________________________
Enable Interrupts
Enable Int0
If Pinb.0 = 0 Then
Gosub Entladen
End If
If Pinb.0 = 1 Then
Gosub Laden
End If
'################################################# #
Entladen:
Portb.2 = 1 'Ladestrom aus '
Portb.1 = 1 'Lämpchen an
Do
If Modus = 1 Then 'Abfrage nach wiederaufwachen nach Powerdown
Goto Laden
End If
Vbatt = Getadc(3)
If Vbatt < 615 Then '615 entspricht 3V bei Spannungsteiler ducrch 4,545 an ADC3
Portb.1 = 0
Sound Portb.4 , 400 , 600
Waitms 1000
Sound Portb.4 , 400 , 600
Config Powermode = Powerdown
End If
Loop
Stop
'################################################# #
Laden:
Portb.2 = 0 'Ladestrom an
Portb.1 = 0 'Lämpchen unbedingt aus
Portb.4 = 1 'Kontroll-LED an => Laden
Do
Waitms 60000 '60s laden, dann Spannung ohne Ladestrom messen
Portb.2 = 1 'Ladestrom aus
Waitms 1000 '1s vor Messung warten
Vbatt = Getadc(3)
If Vbatt > 881 Then '881 entspricht 4,3V
Portb.2 = 1 'ladestrom aus
Sound Portb.4 , 800 , 400
Portb.4 = 0 'Kontroll-LED aus => geladen
Else
Portb.2 = 0 'Ladestrom wieder an
End If
Loop
Stop
'################################################# #
Interrupt:
Waitms 100
Modus = Pinb.0 'Modus=0, dann Entladen / Modus=1, dann Laden
If Modus = 0 Then
Gosub Entladen
End If
If Modus = 1 Then
Gosub Laden
End If
Return
Vielleicht habe ich einfach nur was übersehen, denn ich bin noch Anfänger.....
Ich wäre dankbar über jede Hilfe und freue mich auf Rückmeldungen.
Beste Grüße so kurz vor Weihnachten,
Jo
ich möchte mit einem Attiny13 eine Steuerung realisieren, welche erstens ein angeschlossenes Akkupack laden und zweitens dieses über ein Lämpchen wieder entladen (eigentlich der Hauptnutzen;) ) kann.
Jetzt habe ich an den Portb.0 einen Schalter angeschlossen, der den Interrupt-Eingang gegen Masse oder Ub ziehen kann. Das Programm beinhaltet zwei Unterprogramme (Laden und Entladen) die, je nachdem auf welcher Position der Schalter steht, ausgeführt werden sollen. Gesteuert werden soll das Ganze also durch einen Interrupt....
Und da habe ich nun folgendes Problem, dass nur das Programm "Entladen" ausgeführt wird. Irgendwie erkennt der Controller den Interrupt nicht, wenn PCINT0 "high" wird :( , jedenfalls wird der "Laden" teil nie ausgeführt...
Hier mein Code:
$regfile = "attiny13.dat"
$crystal = 4800000
$hwstack = 32
$swstack = 8
$framesize = 16
Stop Ac 'Analogen Komparator ausschalten
Dim Modus As Bit
Dim Vbatt As Word
Config Adc = Single , Prescaler = Auto , Reference = Internal '1,1Volt interne Referenzspannung
' 1,1V / 1024 = 0,00107V Auflösung; direkt am ADC
' mit Spannungsteiler :4,54545... kann bis 5V gemessen werden (Auflösung real ca.0,02V)
Config Int0 = Change
On Pcint0 Interrupt
Config Portb.0 = Input '=0, dann Entladen und Tiefentladeschutz / =1, dann Laden und Ladeschluss
Config Portb.1 = Output '=0, dann Lämpchen aus
Config Portb.2 = Output '=1, dann Ladestrom aus / =0, dann Ladestrom an
Config Portb.4 = Output 'LED + Piezo
'_________________________________________________ __________________________________________________ ________________________________
Enable Interrupts
Enable Int0
If Pinb.0 = 0 Then
Gosub Entladen
End If
If Pinb.0 = 1 Then
Gosub Laden
End If
'################################################# #
Entladen:
Portb.2 = 1 'Ladestrom aus '
Portb.1 = 1 'Lämpchen an
Do
If Modus = 1 Then 'Abfrage nach wiederaufwachen nach Powerdown
Goto Laden
End If
Vbatt = Getadc(3)
If Vbatt < 615 Then '615 entspricht 3V bei Spannungsteiler ducrch 4,545 an ADC3
Portb.1 = 0
Sound Portb.4 , 400 , 600
Waitms 1000
Sound Portb.4 , 400 , 600
Config Powermode = Powerdown
End If
Loop
Stop
'################################################# #
Laden:
Portb.2 = 0 'Ladestrom an
Portb.1 = 0 'Lämpchen unbedingt aus
Portb.4 = 1 'Kontroll-LED an => Laden
Do
Waitms 60000 '60s laden, dann Spannung ohne Ladestrom messen
Portb.2 = 1 'Ladestrom aus
Waitms 1000 '1s vor Messung warten
Vbatt = Getadc(3)
If Vbatt > 881 Then '881 entspricht 4,3V
Portb.2 = 1 'ladestrom aus
Sound Portb.4 , 800 , 400
Portb.4 = 0 'Kontroll-LED aus => geladen
Else
Portb.2 = 0 'Ladestrom wieder an
End If
Loop
Stop
'################################################# #
Interrupt:
Waitms 100
Modus = Pinb.0 'Modus=0, dann Entladen / Modus=1, dann Laden
If Modus = 0 Then
Gosub Entladen
End If
If Modus = 1 Then
Gosub Laden
End If
Return
Vielleicht habe ich einfach nur was übersehen, denn ich bin noch Anfänger.....
Ich wäre dankbar über jede Hilfe und freue mich auf Rückmeldungen.
Beste Grüße so kurz vor Weihnachten,
Jo