Ich habe vor ein kleines Projekt zu realisieren.
Es soll ein Taster gedrückt werden, dann ein Text auf einem LCD
angezeigt werden, 10 Sekunden gewartet werden und dann soll wieder alles
aus sein. Ich habe dafür mal ein kleinen Ablauf erstellt:
- Taster drücken -> Reset des Controllers
- Offset aus dem Flash lesen
- 32 Byte von SD Karte lesen
- Auf LCD anzeigen
- Offset + 1 in den Flash schrieben
- 10 Sekunden warten
- Controller in SleepMode oder Spannung trennen
Dazu würde ich gern mal ein paar Vorschläge hören. Ich möchte nicht noch
viele Bauteile kaufen und das verwenden was ich schon habe, deshalb
dachte ich, ich trenne nicht die Stromversorgung zum Controller, sondern
schicke ihn einfach in den Tiefsten Schlafmodus. Durch den Reset kommt
er da ja wieder raus, oder nicht? Das ganze soll dann natürlich etwas
Stromsparend sein wenn er im Sleep ist, also muss ich noch die Spannung
vom LCD nehmen. Dachte einfach an einen Transistor, welcher die 5V für
den LCD steuert, oder ist das eine doofe Idee?
Habe noch nicht so viel Erfahrungen gesammelt, bin also um jede Hilfe
dankbar! ;)
Liebe Grüße
Donni Donis schrieb:> Durch den Reset kommt> er da ja wieder raus, oder nicht?
Halb richtig du weckst ihn einfach aber resettest den Controller dadurch
nicht, er schläft einfach und wird dann durch einen Tastendruck geweckt
und setzt sein Programm fort.
Hast du denn soviel Text, dass du eine SD Karte brauchst? Den offset
brauchst du übrigens nicht ins Flash schreiben, der Controller schläft
ja nur und vergisst den Offset nicht außerdem kann das Flash nicht so
viele Schreibzyklen ab.
Für einen ersten Versuch ist deine Idee aber garnicht schlecht ;)
Wenn ich in den "tiefsten" Schlafmodus gehe, komme ich da mit einem
einfachen Taster wieder raus? Habe mir hier die Modes angeschaut:
http://www.mikrocontroller.net/articles/Sleep_Mode
Wollte dann den PowerDown benutzen, wobei ich grad sehe durch externes
Reset komm ich da ja raus, perfekt. Dann brauch ich ja wirklich nicht in
den Flash schreiben.
Ein bisschen Text hab ich schon. Es soll ein Geschenk werden was auf
Knopfdruck halt 16x2 Zeichen auf einem LCD ausgibt. Dann brauche ich pro
Datensatz 32Byte, hatte vor mindestens 500 Datensätze anzulegen. Klar,
ich brauch nicht unbedingt eine SD-Karte, wollte mich aber gerne mal mit
denen auseinander setzen :)
Wie ist das nun mit dem LCD? Wenn ich den AVR in den SleepMode setze,
geht der LCD dann automatisch mit aus? Oder vorher besser mit einem
Transistor die Spannung nehmen?
Donni Donis schrieb:> wobei ich grad sehe durch externes> Reset komm ich da ja raus, perfekt
KEIN RESET!
Dann vergisst dein Controller übrigens auch den Offset. Schau ins
Datenblatt deines Controllers da steht drin wie man ihn genau weckt
(externer Interrupt).
Donni Donis schrieb:> Wie ist das nun mit dem LCD? Wenn ich den AVR in den SleepMode setze,> geht der LCD dann automatisch mit aus? Oder vorher besser mit einem> Transistor die Spannung nehmen?
Es geht nicht aus du musst die Spannung aktiv abschalten. Ich weiß nicht
wieviel Strom dein LCD braucht aber idr. sind die so sparsam, dass du
dir den Transistor sparen kannst und das Display direkt über einen
Portpin versorgst den du dann halt abschaltest.
Ja das habe ich mir gedacht, deswegen war ich grad etwas verwundert.
Also ich hab ins Datenblatt geschaut (verwende den Atmega 328P). Um aus
dem Power Down rauszukommen bleibt mir wohl nur der Pinchange, da ich ja
kein TWI oder den Watchdog benutze, oder?
Verstehe ich den Pinchange richtig, das ich jeden x-beliebigen Pin
benutzen kann und der Interrupt bei Flankenwechsel ausgeführt wird?
Donni Donis schrieb:> Ja das habe ich mir gedacht, deswegen war ich grad etwas verwundert.> Also ich hab ins Datenblatt geschaut (verwende den Atmega 328P). Um aus> dem Power Down rauszukommen bleibt mir wohl nur der Pinchange, da ich ja> kein TWI oder den Watchdog benutze, oder?> Verstehe ich den Pinchange richtig, das ich jeden x-beliebigen Pin> benutzen kann und der Interrupt bei Flankenwechsel ausgeführt wird?
Immerhin kein Atmega8. Erstaunlich.
Ja, du kannst den mit einem Flankenwechsel an jedem Pin aufwecken.
Und zum permanenten Speichern benutzt man nicht Flash sondern EEPROM.
mfg.
Ein EEPROM wird sicher einfacher sein als eine SD-Karte.
32*500=16kByte. Das 25LC128 hat 128kbit = 16kByte, es gibt aber auch
größere 25LCxxx.
Ich weiß jetzt nicht wie viel Speicher dein uC hat, die 500 Texte
könnten auch in Flash des uCs Platz haben...
Wie schon gesagt, wollte gern eine SD-Karte verwenden um mich mal mit
diesen zu beschäftigen, das es nicht das cleverste ist, ist mir schon
klar :p Dann werde ich mich mal ans Programmieren des Sleepmodes machen.
Die von M. H. genannten EEPROMS sind SPI Typen das heißt sie verwenden
den gleichen Bus wie die SD Karten. Wenn du mit Lochraster aufbaust
könntest du das später um- oder nachrüsten. Du würdest mit diesen
EEPROMS deinen Zielen also auch nahekommen (Grundkenntnisse SPI) aber
ohne dich mit Dingen wie den SD Karten Registern etc. rumärgern zu
müssen. SD Karten bringen eigentlich nur mit FAT wirklich Sinn. Das
braucht aber µC seitig mehr Resourcen als du eigentlich für dein
gesamtes Projekt benötigst.
Okay, dann werde ich es mir einmal überlegen vielleicht doch auf EEPROM
umzusteigen :)
Mal zu nem Anderen Problem:
Ich hab nun die sleep-Routine implemetiert, und funktionieren tut sie
auch, aber mein LCD macht noch nicht so ganz was es soll. Ich versorge
es über den Pin PB1. Wenn ich allerdings das Bit auf 0 setze, bleibt der
LCD an. Selbst wenn ich die Spannung komplett trenne, man kann immernoch
sehen was auf dem Display steht. Was mache ich denn da falsch? Nur wenn
ich die Masse abziehe geht es aus?! Find ich sehr komisch..
Hier mein Code:
Hast du alle Pins die mit dem LCD verbunden sind auf '0'? Es könnte
sein, dass das LCD über die internen Schutzdioden versorgt wird.
Welches LCD verwendest du?
Oh perfekt, danke schön.
Ich hab nun alle Pins die ans LCD gehen auf 0 gesetzt, nun ist es aus :)
Welches LCD es genau ist kann ich gar nicht sagen, das gab es mal für
2€bei Pollin..
Weiß einer wie viel Strom so ein LCD ca. benötigt? Es ist ohne
Hintergrundbeleuchtung.
r Donni Donis schrieb:> Weiß einer wie viel Strom so ein LCD ca. benötigt? Es ist ohne> Hintergrundbeleuchtung.
Ich kenne 2 Möglichkeiten das herauszufinden:
Im Datenblatt nachsehen, da du den Typ nicht kennst, bleibt nur die
zweite Möglichkeit: Den Stromverbtauch messen.
Wenn ich eine ohne Hintergrundbeleuchtung finde könnte ich den
Stromverbrauch messen...
Ich habe eines gefunden und gemessen...
Meine Testplatine braucht 15.46mA mit LCD, 14.33mA ohne LCD -->1.13mA
fürs LCD.
Ich habe diese LCD: http://www.ebay.de/itm/321240778077 und versorge es
mit 5V
Ich habe nochmal eine Frage zum INT0 Interrupt. Ich habe ihn nun so
konfiguriert, dass er ausgelöst wird wenn er auf Masse gelegt wird. Nun
war ich zum Beispiel eben oben essen, kam runter und als ich das Licht
angeschaltet habe wurde der Interrupt ausgelöst?! :o Auch wenn ich ein
bisschen an den Steckbrücken wackle wird der Interrupt ausgelöst. Da
scheint der INT0 ganz schön empfindlich zu sein, oder? Ich hab den INT0
mit einem Taster beschaltet. Ist der Taster unbetätigt liegen 5V an INT0
an, drücke ich den Taster geht er auf Masse. Wenn ich den Taster drücke
wacht der µC auch auf wie er soll, nur habe ich eben die kleinen
'Störungen' drin. Wie kann ich die beheben?
Liebe Grüße
Du solltest deinen Schaltungsaufbau noch einmal sorgsam überprüfen.
Externe Pullup Widerstand 10K verwenden:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Pullup-Widerstand
Zusätzliche 100nF Kondensator zwischen 5Volt und GND nahe der IC
Versorgungspins eingebaut ?
Versehentlich beim proggen den WDT Watch Dog Timer gesetzt?
Wackelkontakte?
...
Ich benutze als Board das Arduino Uno R3, da sind ja Kondensatoren und
so drauf. Hab nur keine Lust mehr auf Arduino "beschränkt" zu sein und
fange deshalb an das Teil in C zu programmieren.
Hab den Fehler nun glaub ich gelöst, ich habe gelesen ein 100nF
Kondensator zwischen INT0 und VCC löst das Problem, bis jetzt geht auch
alles perfekt! :)