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...
:
Bearbeitet durch User
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:
1 | #define F_CPU 16000000L
|
2 | |
3 | #include <avr/io.h> |
4 | #include <avr/sleep.h> |
5 | #include <avr/interrupt.h> |
6 | #include <util/delay.h> |
7 | #include "lcd-routines.h" |
8 | |
9 | int main(void) |
10 | {
|
11 | uint16_t offset = 0; |
12 | |
13 | // Spannung für LCD an Pin PB1 als Output
|
14 | DDRB |= (1 << PB1); |
15 | |
16 | // Interrupts aktivieren
|
17 | sei(); |
18 | |
19 | // Jeder Change löst Interrupt an INT0 (PD2) aus
|
20 | EICRA |= (1 << ISC00); |
21 | |
22 | // INT0 aktivieren
|
23 | EIMSK |= (1 << INT0); |
24 | |
25 | while(1) |
26 | {
|
27 | // 32 Byte in char[] lesen mit Offset
|
28 | char buf[33] = "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"; |
29 | |
30 | // Spannung für LCD und Daten auf LCD schreiben
|
31 | PORTB |= (1 << PORTB1); |
32 | _delay_ms(50); |
33 | lcd_init(); |
34 | lcd_clear(); |
35 | _delay_ms(1000); |
36 | for(uint8_t i = 0; i < 32; i++) |
37 | {
|
38 | if(i == 16) |
39 | {
|
40 | lcd_setcursor(0,2); |
41 | }
|
42 | lcd_data(buf[i]); |
43 | }
|
44 | |
45 | // Offset erhöhen
|
46 | offset = offset + 1; |
47 | |
48 | // 10 Sekunden warten, dann LCD aus
|
49 | _delay_ms(10000); |
50 | PORTB &= ~(1 << PORTB1); |
51 | |
52 | // Sleep Mode
|
53 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); |
54 | sleep_mode(); |
55 | |
56 | // Hier geht es weiter...
|
57 | }
|
58 | }
|
59 | |
60 | ISR(INT0_vect) |
61 | {
|
62 | // Nichts tun...
|
63 | }
|
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?
:
Bearbeitet durch User
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...
Hab leider kein Strommesser zur Hand.. Dachte da gäb es eine Art "Richtwert". Mal sehen ob ich die Pollin Rechnung finde :D
Hi
>Weiß einer wie viel Strom so ein LCD ca. benötigt?
Kleinere Textdisplays (2x16, 2x20, 4x16,...) brauchen etwa 1...2 mA.
MfG Spess
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
:
Bearbeitet durch User
Okay, dann danke ich euch beiden mal! :) Dan nkann ich nun starten mein Projekt mal zusammen zu basteln. Liebe Grüße
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! :)
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.