Kleines Projekt

Gast #3441376
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
Gast #3441388
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 ;)
Gast #3441399
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?
Gast #3441405
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.
Gast #3441414
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?
#3441425
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.
Gast #3441982
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.
Gast #3442101
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
}
#3442130
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...
Gast #3445327
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
Gast #3445947
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?
...
Gast #3446080
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! :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren