- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 4 von 4

Thema: Konkretes Problem mit dem Interrupt mit Attiny13

  1. #1

    Konkretes Problem mit dem Interrupt mit Attiny13

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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:
    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

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    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.
    Geändert von MagicWSmoke (23.12.2012 um 12:48 Uhr)

  3. #3
    @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

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von M.Jo Beitrag anzeigen
    @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.

Ähnliche Themen

  1. [ERLEDIGT] ATtiny13: Problem mit ADC Abfrage!
    Von bnitram im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 23.05.2011, 20:23
  2. ATtiny13 Problem mit PWM
    Von stefan8010 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 21.05.2011, 09:25
  3. Attiny13 mit Pinchange Interrupt boolvariable setzen
    Von ExXeQtor im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 12.10.2010, 20:20
  4. [gelöst]Problem mit Interrupt Attiny13
    Von OEP im Forum Assembler-Programmierung
    Antworten: 2
    Letzter Beitrag: 19.04.2007, 09:47
  5. Probleme mit dem Timer0-Interrupt
    Von Zyko im Forum PIC Controller
    Antworten: 1
    Letzter Beitrag: 16.08.2004, 10:09

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen