Forum: Mikrocontroller und Digitale Elektronik char im EEPROM speichern


von heinrich (Gast)


Lesenswert?

hallo,

ich habe ein programm geschrieben welches einen char in den eeprom 
speichern und auch wieder auslesen soll. Nur leider funktioniert die 
ganze sache nicht so richtig. Wenn jemand den Fehler findet wäre ich 
sehr sehr dankbar.

Mfg. Heinrich
1
#include <avr/io.h>  // Deklarationen
2
3
#include <avr/interrupt.h>
4
5
#define BAUD 9600  // Symbol fuer Baudrate
6
#define TAKT 3686400  // Symbol fuer Controllertakt
7
#define TEILER (long)TAKT/(16*(long)BAUD) - 1   // Symbol fuer Teiler
8
9
10
char abc = '0';
11
12
13
14
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
15
{
16
/* Wait for completion of previous write */
17
  while(EECR & (1<<EEWE));
18
/* Set up address and data registers */
19
  EEAR = uiAddress;
20
  EEDR = ucData;
21
/* Write logical one to EEMWE */
22
  EECR |= (1<<EEMWE);
23
/* Start eeprom write by setting EEWE */
24
  EECR |= (1<<EEWE);
25
}
26
27
unsigned char EEPROM_read(unsigned int uiAddress)
28
{
29
/* Wait for completion of previous write */
30
  while(EECR & (1<<EEWE));
31
/* Set up address register */
32
  EEAR = uiAddress;
33
/* Start eeprom read by writing EERE */
34
  EECR |= (1<<EERE);
35
/* Return data from data register */
36
  return EEDR;
37
}
38
39
void UART_Init(void)  // UART initialisieren
40
{
41
  
42
43
  UBRRL = TEILER;      // Baudrate einstellen
44
  UCSRB |= (1<<RXEN);    // Empfaenger ein
45
  UCSRB |= (1<<TXEN);    // Sender ein
46
  UCSRB |= (1<<RXCIE);  // Empfaengerinterrupt frei
47
}
48
49
50
void UART_putch(unsigned char data)         // warten und Zeichen nach Sender  
51
{
52
  //warte bis UDR leer ist UCSRA / USR bei z.B.: 2313
53
  while (!(UCSRA&0x20));
54
  //sende
55
  UDR = data;
56
}
57
58
59
void UART_putstr(unsigned char *zeiger)    // String bis Endemarke ausgeben
60
{
61
  while (*zeiger != 0)
62
  {
63
    while (!(UCSRA&0x20));    // warte bis Datenregister frei
64
    UDR = *zeiger;        // Zeichen nach Sendedatenregister
65
    zeiger++;                         
66
  }
67
}
68
69
char gg;
70
71
SIGNAL(SIG_UART_RECV)  // Interrupt-Service fuer Empfaenger
72
{
73
register unsigned char received_ch;    // Hilfsregister
74
75
  received_ch = UDR;  
76
//  uart_putch(received_ch);            // Zeichen abholen
77
  while (!(UCSRA&0x20));        // warte bis Datenregister frei
78
79
80
81
  if(received_ch == 'a')
82
  { 
83
    //abc = 'a';
84
    EEPROM_write(1, 'a');
85
  }
86
  else if(received_ch == 'b')
87
  { 
88
    //abc = 'b';
89
    EEPROM_write(1, 'b');
90
  }
91
  else if(received_ch == 'c')
92
  { 
93
  //  abc = 'c';
94
  EEPROM_write(1, 'c');
95
  }
96
97
  else if(received_ch == 'g')
98
  { 
99
100
101
    gg = EEPROM_read(1);
102
    UART_putch(gg);
103
    UART_putstr("\r\n");
104
  }
105
      
106
}
107
108
109
int main(void)  // Hauptfunktion
110
{
111
112
  UART_Init();        // UART initialisieren
113
  sei();
114
  
115
  while(1)      // Arbeitsschleife ist leer
116
  {
117
    
118
119
  } //end while(1)
120
121
} // Ende main

von Johannes M. (johnny-m)


Lesenswert?

Wenn Du schon den AVR-GCC verwendest, warum dann nicht die fertigen 
Funktionen aus der eeprom.h? Abgesehen davon ist SIGNAL veraltet und 
sollte nicht mehr verwendet werden.

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.