WakeUp aus dem Powerdown mit TWI

Uwe H.

Neues Mitglied
27. Juli 2011
264
0
0
Hinter die Grenze :-)
Sprachen
  1. BascomAVR
  2. ANSI C
  3. Assembler
Noch ein weiteres Thema:

Hat schonmal jemand mit Powerdown und WakeUp mit TWI-Interrupt gearbeitet? Ich hab grad einen Versuchsaufbau auf dem Tisch, in dem ich das mal probieren wollte. Atmega8 ist als TWI-Slave konfiguriert und wird nach 10 Sekunden kreiseln im Mainloop ueber eine Subroutine, die die Durchlaeufe im Mainloop zaehlt, in den Powerdown versetzt. Hab eine LED am Mega, die er vor dem Powerdown abschaltet und mir anzeigt, das er pennen geht. Jetzt will ich ihn per TWI aufwecken und zurueck in den Mainloop schicken, was aber nicht klappt. Sobald er aufwacht, sollte die LED wieder leuchten, was sie nicht tut. Im Logikanalysator kommt ein ACK nachdem er seine Adresse erkennt, dann garnichts mehr. Im Datenblatt kann ich nichts dazu finden, es sieht so aus, als ob nur das TWI-Modul antwortet, das Hauptprogramm aber weiter schlaeft. Muss man da noch irgendwas aktivieren? Hier mal ein Ausschnitt des Codes:

Code:
 Mainloop:

  Set LED

  Do

   Twi_control = Twcr And &H80

    If Twi_control = &H80 Then
     Twi_status = Twsr And &HF8

       Gosub Comstart

    End If


  Waitms 50
   Gosub Sleeptimer



  Loop

  End


'===============================================================================

 Sleeptimer:

  Incr I2                                'Zaehler fuer die Durchlaeufe

  Select Case I2
   Case Is > 200 : I2 = 0          'Wenn 10 Sek. erreicht dann Zaehler auf Null
                     Reset LED
                      Power Powerdown
                       Set LED
  End Select

 Return
 
Alles klar, ich hab nach zwei Stunden probieren und suchen bei google die Loesung gefunden. Ich hab vergessen, dass TWIE (TWI Interrupt Enable) im Controlregister zu setzen. Danach hats geklappt mit dem Wakeup, aber nur einmal. Ein zweites Mal wollte er nicht mehr aufwachen. Nach weiterem Suchen hab ich dann herausgefunden, dass es sich dabei wohl um einen Hardwarebug von Atmel handelt. Das TWIE-Bit im TWCR muss nach dem Powerdown resetet und neu gesetzt werden, sonst reagiert der uC beim erneuten Powerdown nicht mehr auf den Weckruf. Ich hab es jetzt so geloest, dass unmittelbar vor dem Powerdown das TWIE gesetzt wird

Code:
Twcr = &B01000101  <--Bit.0 TWIE
  Power Powerdown

In der anschliessenden Kommunikationsroutine, die ja unmittelbar angesprungen wird, da TWINT durch den Adressmatch gesetzt wurde, wird TWIE dann genullt.

Code:
Select Case Twi_status
 Case &H60 : Twcr = &B11000100

Beim erneuten Powerdown wird es wieder gesetzt. Das funktioniert bisher einwandfrei. In anderen Foren hab ich gelesen, dass man sogar TWI komplett neu einschalten sollte, sonst klappts nicht. Dieses kann ich nicht bestaetigen, bei mir reicht der TWIE-Reset.
 
Hier nochmal ein aktueller Hinweis: Wenn der Atmega waehrend des Powerdowns von einem ext. Interrupt geweckt wird, muss man tatsaechlich die komplette TWI abschalten und neustarten mit

TWCR = &B00000000
TWCR = &B01000100
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)