Forum: Mikrocontroller und Digitale Elektronik Kleines Projekt


von Donni D. (Gast)


Lesenswert?

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

von Eumel (Gast)


Lesenswert?

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 ;)

von Donni D. (Gast)


Lesenswert?

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?

von Eumel (Gast)


Lesenswert?

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.

von Donni D. (Gast)


Lesenswert?

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?

von Thomas E. (thomase)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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
von Donni D. (Gast)


Lesenswert?

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.

von MilborgII (Gast)


Lesenswert?

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.

von Donni D. (Gast)


Lesenswert?

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
}

von Max H. (hartl192)


Lesenswert?

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
von Donni D. (Gast)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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...

von Donni D. (Gast)


Lesenswert?

Hab leider kein Strommesser zur Hand..
Dachte da gäb es eine Art "Richtwert".
Mal sehen ob ich die Pollin Rechnung finde :D

von spess53 (Gast)


Lesenswert?

Hi

>Weiß einer wie viel Strom so ein LCD ca. benötigt?

Kleinere Textdisplays (2x16, 2x20, 4x16,...) brauchen etwa 1...2 mA.

MfG Spess

von Max H. (hartl192)


Lesenswert?

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
von Donni D. (Gast)


Lesenswert?

Okay, dann danke ich euch beiden mal! :)
Dan nkann ich nun starten mein Projekt mal zusammen zu basteln.

Liebe Grüße

von Donni D. (Gast)


Lesenswert?

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

von MilborgII (Gast)


Lesenswert?

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?
...

von Donni D. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.