1

Donnerstag, 30. März 2006, 22:57

Programm 6: Mega8 mit Gedaechtnis

Die Aufgabe im Teil 5 war ja, eine Unterspannungserkennung zu programmieren, die auch noch mitzaehlt wie oft dieser Fall eingetreten ist.
Schade nur, das der schoene Zaehler weg ist, wenn man dem Mega8 die Spannung wegnimmt.
Demm kann aber abgeholfen werden. Im Mega8 stehen uns 512 Byte nichtfluechtiger ueberschreibbarer Speicher (EEPROM) zur Verfuegung.

Das Beispielprogramm (so ein richtig schoenes sinnloses Programm) zeigt wie man einen ganzen Block von Daten in das EEPROM schreiben und wieder auslesen kann (Das Wort Memory) sowie das Schreiben und lesen einer einzelnen Speicherstelle (Im Beispiel wird einfach in einer Schleife an Adresse 0 etwas geschrieben und gleich danach wieder ausgelesen).

Wundert euch nicht ueber die "seltsame" Art der Angabe der Speicheradresse. Die Funktionen verwenden hier tatsaechlich Zeiger. Deshalb ist hier dieser Cast wirklich notwendig.

Aufgabe:
Entwickelt die Unterspannungserkennung des Teils 5 weiter. Hin zu einem Datenlogger. Schreibt den Zaehler der anzeigt wie oft Unterspannung aufgetreten ist in das EEPROM und lest ihn von dort aus. Ihr werdet sehen, auch wenn ihr Reset drueckt oder die Betriebsspannung wegmacht, der Zaehler bleibt erhalten.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*************************************************************************
Title:    testing EEPROM.
Author:   Thomas Radetzki
03/2006
**************************************************************************/

#include <stdlib.h>
#include <avr/io.h>
#include <avr/signal.h>    // include "signal" names (interrupt names)
#include <avr/interrupt.h>    // include interrupt support
#include "avr/delay.h"
#include "avr/eeprom.h"
#include "global.h"
#include "lcd.h"

/*
** constant definitions
*/

int main(void)
{
    uint8_t i;
    char Buffer[7];
    
    lcd_init(LCD_DISP_ON); // LCD initialisieren
    // Zeichenfolge ins EEPROM schreiben
    // wir schreiben hier das 0 Byte am Ende diesmal mit rein. Spart uns unten das 
    // erneute dranhaengen damit wir einen sauberen C String haben.
    eeprom_write_block ("Memory", (uint8_t*)1, 7);
    
    while(1)
    {
        lcd_gotoxy(0,0);
        eeprom_read_block (Buffer, (uint8_t*)1, 7);
        lcd_puts(Buffer);
        for(i=0; i<100; i++)
        {
            _delay_ms(10);
            eeprom_write_byte ((uint8_t*)0, i);
            lcd_gotoxy(0,1);
            lcd_puts("Written:");
            lcd_gotoxy(10,1);
            lcd_put_d(i);
            lcd_gotoxy(0,2);
            lcd_puts("Read   :");
            lcd_gotoxy(10,2);
            lcd_put_d(eeprom_read_byte((uint8_t*)0));
        }
    }
    return(0);
}
»Thomas_R.« hat folgende Datei angehängt:
  • eeprom.zip (16,67 kB - 85 mal heruntergeladen - zuletzt: 24. Dezember 2014, 09:53)
Gruss
Thomas
🖖

Healthy for the mind in spirit. Love it. Lets grill.