Hallo Leute, ich hab schon drei Abende in Foren und auf Internetseiten geschaut, aber ich komm einfach nicht weiter. Wahrscheinlich ist das für die meisten hier nur ein Klax, aber ich raff's einfach noch nicht. Ich möchte für meinen Kleinen eine Blinkschaltung mit Batterie bauen. Löten und Platinenbau ist kein Problem. In der Schalung soll ein Attiny13 auf Tastendruck (Pinb.2) "aufwachen" und zwei LEDs (Pinb.3/4) abwechselnd für eine kurze Zeit blinken lassen und dann wieder in Stromsparmodus verfallen um Batteriestrom zu sparen. Ich verwende BASCOM-AVR weil das für mich und meine Zwecke die einfachste Srache zu seien scheint. Ich komme aber einfach nicht weiter. Bitte helft mir. Hier die Anfänge des Codes: $regfile = "attiny13.dat" $crystal = 128000 Stop Ac Stop Adc Dim A As Integer Dim B As Integer Dim I As Integer A = 50 B = 200 For I = 0 To 20 Portb.3 = 1 Waitms A Portb.3 = 0 Waitms A Portb.3 = 1 Waitms A Portb.3 = 0 Waitms B Portb.3 = 1 Waitms A Portb.3 = 0 Waitms A Portb.3 = 1 Waitms A Portb.3 = 0 Waitms B Next I
Mit Bascom wirst du wohl nicht sehr viele Tipps bekommen, weiter verbreitet bei den AVRs sind C und Assembler. Prinzipiell mußt du eine oder mehrere Interrupt freischalten, die den Prozessor aufwecken können. Dann schickts du den Prozessor schlafen und mit dem ersten auftretenden Interrupt wird die entsprechende Routine ausgeführt und danach macht der Prozessor nch der SLEEP-Anweisung weiter.
Ich kann jetzt kein Bascom, aber aufwachen aus dem Power Down Sleep geht nur mit INT0 (PinB2). Vielleicht kommt ja auch mein BLINKY61 mit 6 Leds in Frage. Wacht mit einer Taste auf und geht nach programmierbaren 2-63min in Power Down. Beitrag "Blinky61 - vielseitiges Blink- und Lauflicht - ATtiny13 mit 6 LEDs [ASM]" Auch Attiny13 mit 6 Leds und 3 Widerständen gruss herrmueller
@herrmüller Vielen Dank für die Antwort. Leider kann ich kein Assembler und kann somit den Code nicht für meine Bedürfnisse umschreiben. Vom Grundsatz her ist das aber genau was ich suche. @julinho Ebenfalls vielen Dank für die Antwort, mir ist aber nicht so ganz bewusst wie ich die Interups einstelle, welche ich benutze und welcher Schlaf- und Aufwachbefehl das Ganze steuert. Gruß OsRam
Herr Mueller schrieb: > Ich kann jetzt kein Bascom, aber aufwachen aus dem Power Down Sleep geht > nur mit INT0 (PinB2). Nö, Aufwachen geht mit jedem Pin (Pin-Change-Interrupt). Peter
Udo Leucht schrieb: > Leider kann ich kein Assembler und kann somit den Code nicht für meine > Bedürfnisse umschreiben. Vom Grundsatz her ist das aber genau was ich > suche. Was brauchst Du denn genau ?
Den Tiny13 kannst du nur über einen Levelinterrupt aus dem Schlaf aufwecken(siehe tabelle 7.1), der Tiny kann nur einen Low-Level-Interrupt, d.h. zum Aufwecken muß der Pegel an INT0 von High auf Low gehen. Dazu musst du ISC00 und ISC01 auf 0 setzen (tabelle 9.2) Außerdem mußt du in GIMSK INT0 setzen, damit der Interrupt freigeschaltet ist. Dann musst du noch eine ISR-Routine schreiben, die durch INT0 ausgelöst wird. Dann schickts du den Prozessor schlafen, dazu gibts in C eine Library, in Bascom mit Sicherheit auch.
@ herrmüller Auf Tastendruck sollen die LED (blau) an 3 und 4 20mal abwechselnd für 50 ms doppelt aufblitzen und danach soll der Controller wieder abschalten.
@PeDa und julinho ja, ich habe das 'and' in der Tabelle 'INT0 and Pin Change' überlesen.
Entschuldigt wenn ich frage, aber von welcher Tabelle redet Ihr?
Das war ein Versuch, aber der geht auch nicht $regfile = "attiny13.dat" $crystal = 128000 Dim I As Integer Dim A As Integer Dim B As Integer Config Pinb.2 = Input Config Pinb.3 = Output Config Pinb.4 = Output Config Int0 = Low Level Enable Interrupts Portb.2 = 1 On Int0 Button: Enable Int0 Do Powerdown Loop Button: For I = 0 To 1 Portb.3 = 1 Waitms A Portb.3 = 0 Waitms A Portb.3 = 1 Waitms A Portb.3 = 0 Waitms B Portb.3 = 1 Waitms A Portb.3 = 0 Waitms A Portb.3 = 1 Waitms A Portb.3 = 0 Waitms B Next I Return End
Tabelle 11 Seite 28 in der allerseits so ungeliebten 'Bedienungsanleitung des Attiny13' = Datenblatt. >20mal abwechselnd für >50 ms doppelt aufblitzen Heisst das LED3 50ms an ?ms aus 50ms an und dann LED4 50ms an ?ms aus 50ms an und dann noch 19 mal ? Fall Du wie oben doch INT0 nimmst, der ist port b.1
@herrmüller 3 an 50ms 3 aus 50ms 3 an 50ms 3 aus 200ms 4 an 50ms 4 aus 50ms 4 an 50ms 4 aus 200ms 20mal wiederholen Im Code habe ich bei den Ports einige Fehler entdeckt. Aber die Anwahl der Interrupts erschließt sich mir einfach nicht
@ julinho - d.h. zum Aufwecken muß der Pegel an INT0 von High auf Low gehen. Das weis ich. Der Taster mus den Kontakt gegen Masse ziehen. - ISC00 und ISC01 auf 0 setzen (tabelle 9.2) - GIMSK INT0 setzen Kann mir dazu jemand Codebeispiele geben? - ISR Routine hab ich glaub ich schon
Udo Leucht schrieb: > Kann mir dazu jemand Codebeispiele geben Wahrscheinlich sind die Bascom-Könner schon alle im Bett ;-) Warte besser bis morgen.
was geht denn nicht, schläft er ncht oder wacht er nicht auf?
Mein letzter Versuch für heute. Er lässt sich nicht in den Schlafmodus versetzten. $regfile = "attiny13.dat" $crystal = 128000 Dim I As Integer Dim A As Integer Dim B As Integer Dim V As Integer A = 50 B = 200 Config Pinb.2 = Input Config Pinb.3 = Output Config Pinb.4 = Output Set Portb.2 On Int0 Button Config Int0 = Low Level Enable Int0 Enable Interrupts Entry: Mcucr = Mcucr And &B10101111 Mcucr = Mcucr Or &B10100000 sleep Goto Entry End Button: For I = 0 To 10 Portb.3 = 1 Waitms A Portb.3 = 0 Waitms A Portb.3 = 1 Waitms A Portb.3 = 0 Waitms B Portb.4 = 1 Waitms A Portb.4 = 0 Waitms A Portb.4 = 1 Waitms A Portb.4 = 0 Waitms B Next I Return End Für heute Gute Nacht
Leider kann ich ja kein Bascom, deswegen habe ich mal was in Assembler gemacht. Vielleicht kannst Du die HEX Datei ja flashen. Da es irgendwie nach einer Polizeiwagendachbeleuchtung aussieht, habe ich noch ein Tatü-Tataa 'Sound' an PB0 dazugemacht. Takt des Attiny13 auf 4.8MHz und CKDIV8 setzen -> 600 KHz. Der Programmablauf ist 'Spaghetti-maessig', da kann man sogar als nicht Assemblaner was dran ändern ;-) viele Gruesse herrmueller
@ herrmüller Vielen Dank, genau das habe ich gesucht. Ich konnte die HEX-Datei laden und musste nur des Taster an einen anderen Pin löten. Im Ruhestrom habe ich 0,4 mA gemessen. Kann man das noch verringern?
therealosram schrieb: > Im Ruhestrom habe ich 0,4 mA gemessen. Kann man das > noch verringern? Das dürfte dem Idle entsprechen. Im Power-Down sollten es <0,02mA sein. Peter
@herrmüller Ich muss mich korrigieren. Der Strom liegt bei 16 µA. Das hält ne Weile mit zwei Ladyzellen. @Alle Ich wäre trotzdem dankbar für ein laufendes Programm mit BASCOM, denn ich hab immer noch nicht verstanden, wie das eigentlich funktioniert. Da ich dienstlich viel mit VBA mache und BASCOM dem ähnelt, möchte ich mich nicht mit einer weiteren Sprache beschäftigen.
Ich kann zwar auch nicht mit BASCOM dienen, wollte mich aber trotzdem beschweren, dass oben behauptet wird, man kommt aus dem power down nur über INT0 oder Pin-change. Es geht auch mit dem Watchdog. Anbei mein asm-Beispiel-Code dazu.
Ich hatte vergessen, im Sleep modus die Ausgänge abzuschalten. Jetzt dürfte kein nennenswerter Strom mehr fliessen. Je nachdem, ob Du den Ton Ausgang beschaltet hast, die Hex Datei mit oder ohne Ton wählen (Pullup aus oder an). In Deinem Bascom Programm sehe ich immer noch PinB.2 als input und INT0 (das ist PinB.1) als Interrupt. Mein Programmablauf: (*A) Ich habe für den Powerdown Modus MCUCR auf 00110010 gesetzt = Powerdown und INT0 fallende Flanke Ausserdem GIMSK auf 01000000 , das heisst INT0 Interrupt erlauben. dann sleep Wenn die Taste gedrückt wird, wird die IR.routine aufgerufen, in der ich nur den INT0 IR. sofort wieder sperre, damit die Taste nicht andauernd IR auslöst -> GIMSK = 0 Danach blinken dann im Hauptprogramm die LEDs und dann wieder nach (*A) @Ziegenpeter Es ging nur darum, den µC mit einer Taste zu erwecken.
Berichtigung, für Powerdown Modus muss MCUCR auf 00110000 gesetzt werden = Powerdown und INT0 low Level. Ich habe gerade gegoogelt und man kann scheinbar in BASCOM auch Mcucr = Bits(se , Sm1) sleep schreiben, das ist ja fast so schön wie in Assembler, da weiss man doch was man hat. Ausserdem ist mir aufgefallen > $crystal = 128000 < , wenn der Tiny nicht auch mit 128kHz läuft (würde ich eigentlich nicht dazu raten), werden die Zeiten nicht stimmen. Also teste es mal mit : Config Int0 = Low Level Enable Int0 Enable Interrupts Mcucr = Bits(se , Sm1) sleep dann in der IR Routine Disable Int0 (wenn es das so gibt) return und im Hauptprogramm nach sleep das Geblinke. gruss herrmueller
eine Andere Frage, die Ihr bestimmt auch beantworten könnt: über 3V Ruhestrom 1,6µA unter 3V Ruhestrom >200µA Kann mir das jemand erklären?
So, jetzt habe ich mir doch tatsächlich das Bascom einmal runtergeladen und installiert und ein bisschen was gelesen. Dann habe ich mein Assemblerprogramm ziemlich direkt umgesetzt. Vieles ist wie Assembler, nur längere Befehle, mit längeren Wörtern ;-) Auch habe ich gelernt, dass es den Sleep Befehl so wohl gar nicht gibt. Deshalb setzte ich die Register 'assembler-mässig' und benutze !sleep als direkten Assemblerbefehl. '-------- $regfile = "attiny13.dat" $crystal = 600000 $hwstack = 16 $swstack = 16 $framesize = 16 Dim B As Byte Dim A As Byte Dim I As Byte A = 50 B = 200 On Int0 Button ' bei Tasten-IR Tasten-IR wieder sperren 'Timer Für Tonerzeugung Initialisieren Config Timer0 = Timer , Compare A = Toggle , Prescale = 8 , Clear Timer = 1 ' fürn Ton Haupt: ' PortB Einstellungen für Sleep Ddrb = 0 ' Config PinB.alle = Input Set Portb.2 ' nicht angeschlossen, deshalb Pullup an Set Portb.1 'Pullup für Taste Config Int0 = Low Level ' INT0 auf Low Level und anschalten und Enable Int0 ' alle IR. erlauben Enable Interrupts Mcucr = Bits(se , Sm1) ' Powerdown Sleepmodus laut Datenblatt !sleep ' Assemblerbefehl für schlafen legen ' Hier erwacht der Controller nach Tastendruck - und der IR Routine ' PortB Einstellungen für Betrieb Config Pinb.0 = Output ' Ton Config Pinb.1 = Input ' Taste Config Pinb.3 = Output ' Led Config Pinb.4 = Output ' Led Set Portb.1 ' Pullup für Taste ' endlich blinken For I = 0 To 20 Ocr0a = 151 ' spiele ein 'c' an PB0 Portb.3 = 1 Waitms A Portb.3 = 0 Waitms A Portb.3 = 1 Waitms A Portb.3 = 0 Waitms B Ocr0a = 114 ' spiele ein 'f' an PB0 Portb.4 = 1 Waitms A Portb.4 = 0 Waitms A Portb.4 = 1 Waitms A Portb.4 = 0 Waitms B Next I Goto Haupt ' und wieder abschalten (sorry für das Goto - aber ein bisschen Basic muss sein) '------------------------------------ 'Interrupt Routine für INT0 -> Taste Button: ' Tasten-IR wieder sperren Disable Int0 Return End '------ bei mir geht es so lustige Sache, dieses Bascom, man muss sich mehr Wörter merken, aber weniger Bitbezeichnungen und Register. Für manche Sachen bestimmt nicht schlecht. Viele Gruesse herrmueller Oh je, ich muss ja bald arbeiten :-(
Das ist der Hammer!! Genau das habe ich gesucht. Und jetzt kann ich damit "rumspielen" und versteh das vielleicht auch. DANKE. Herr Mueller schrieb: > man muss sich mehr Wörter merken, aber > weniger Bitbezeichnungen und Register. Für manche Sachen bestimmt nicht > schlecht. Da es VBA in gewisser Weise ähnelt, habe ich mich auch dafür entschieden. Danke an alle nochmals. :)))))))))
Strommessung: (Oszi an R) Ruhestrom: 11,4 µA Belasung LED aus: 6,8 mA LED an: 20,4 mA SUPER Danke nochmals
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.