PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Konkretes Problem mit dem Interrupt mit Attiny13



M.Jo
22.12.2012, 21: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

MagicWSmoke
23.12.2012, 11:43
Würd' mir erst mal die Grundlagen erarbeiten, man sieht am Code dass die fehlen. Timings von 60 Sek über ein Waitms sind ein Unding, dann wildes Gespringe aus der ISR raus in Unterprogramme mit der Chance 'nen Stacküberlauf zu bekommen. Bei der ersten Betätigung des Schalters mit ein wenig Schalterprellen ist das auch sofort passiert - wenn denn der Interrupt überhaupt aktiv wäre. Ist er aber nicht, da der PCINT0-Pin PB0 genutzt werden soll, der Int0 dagegen enabelt wird, welcher aber wiederum keine ISR definiert hat. Sollte dagegen tatsächlich der PCInt0 verwendet werden, so fehlt noch das Aktivieren des betreffenden Pins per PCMSK.

Also ich hätt' gesagt, wirf den Code schnellsten in den Papierkorb, arbeite wenigstens die in Bascom mitgelieferten Beispiele durch, verstehe diese auch und mach' Dir danach ein Konzept.
Diese Konzept benötigt keinen externen Interrupt, statt dessen einen Timer, den man abfragen kann, ob 'ne bestimmte Zeit rum ist.
Die Abfrage einer zeitlich extrem unkritischen Aktion, wie die Abfrage eines manuell betätigten Schalters macht man dann in der Hauptschleife, dafür braucht's ganz sicher keinen Interrupt.

M.Jo
23.12.2012, 12:33
@MagicWSmoke:

Vielen Dank für Deine Antwort und Deine Bemühungen, das Aktivieren des Interrupts mit PCMSK und GIMSK hat funktioniert. Ich dachte Bascom machte das automatisch nach "cofig INT0"....

Gruß Jo

MagicWSmoke
23.12.2012, 13:08
@MagicWSmoke:

Vielen Dank für Deine Antwort und Deine Bemühungen, das Aktivieren des Interrupts mit PCMSK und GIMSK hat funktioniert. Ich dachte Bascom machte das automatisch nach "cofig INT0"....

Gruß Jo
Junger Padawan, damit hast Du die dunkle Seite der Macht nicht verlassen.
Außerdem ist INT0 ungleich PCINT0, darauf zielte auch meine Empfehlung nach Verbesserung der Grundlagenkenntnisse.