Hallo,
ich hoffe jemand kann mir die Frage schnell beantworten. Warum gibt er
mir immer 0xFF aus?
************************************************************************
***************
Definitionen:
************************************************************************
***************/
#ifndef F_CPU
#define F_CPU 4000000
#endif
/***********************************************************************
****************
Bibliotheken:
************************************************************************
***************/
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/delay.h>
/***********************************************************************
****************
Globale Variablen:
************************************************************************
***************/
unsigned int i=0;
/***********************************************************************
****************
Funktion: EEPROM-Werte speichern
************************************************************************
***************/
void eeprom_write()
{
while(EECR & (1<<EEWE))
{
}
EEAR =0;
EEDR =49;
EECR|=(1<<EEMWE) | (0<<EEWE);
EECR|=(1<<EEWE);
}
/***********************************************************************
****************
Funktion: EEPROM-Werte speichern
************************************************************************
***************/
void eeprom_read()
{
while(EECR & (1<<EEWE))
{
}
EEAR =0;
EECR|=(1<<EERE);
i=EEDR;
}
/***********************************************************************
****************
Funktion: RS232-Senden
************************************************************************
***************/
void rs232_senden()
{
UBRRH=0;
UBRRL=12;
UCSRB=(1<<TXEN);
UCSRB=(1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0) | (1<<USBS);
while(!(UCSRA & (1<<UDRE)))
{
}
UDR=i;
_delay_ms(50);
}
/***********************************************************************
****************
Main-Funktion:
************************************************************************
***************/
int main(void)
{
eeprom_write();
while(1)
{
eeprom_read();
rs232_senden();
}
return 0;
}
habe jetzt keine Lust zu suchen, aber hier mal ein Ausschnitt aus dem
Listuíng eines Compilers (und das funktioniert!), damit solltest du es
leicht finden.
__EEPROMRDB:
000088 99e1 SBIC EECR,EEWE
000089 cffe RJMP __EEPROMRDB
00008a 93ff PUSH R31
00008b b7ff IN R31,SREG
00008c 94f8 CLI
00008d bbae OUT EEARL,R26
00008e bbbf OUT EEARH,R27
00008f 9ae0 SBI EECR,EERE
000090 b3ed IN R30,EEDR
000091 bfff OUT SREG,R31
000092 91ff POP R31
000093 9508 RET
__EEPROMWRB:
000094 99e1 SBIC EECR,EEWE
000095 cffe RJMP __EEPROMWRB
000096 b79f IN R25,SREG
000097 94f8 CLI
000098 bbae OUT EEARL,R26
000099 bbbf OUT EEARH,R27
00009a 9ae0 SBI EECR,EERE
00009b b38d IN R24,EEDR
00009c 17e8 CP R30,R24
00009d f019 BREQ __EEPROMWRB0
00009e bbed OUT EEDR,R30
00009f 9ae2 SBI EECR,EEMWE
0000a0 9ae1 SBI EECR,EEWE
__EEPROMWRB0:
0000a1 bf9f OUT SREG,R25
0000a2 9508 RET
Und ansonsten solltest du ganz schnell deinen Programmierstil umstellen:
z.B.
void eeprom_read()
dort übergibt man Adresse und bekommt auch das Ergebnis zurück.
unsigned char eprom_read (unsigned in adresse){
.
.
return value;
}
i=EEDR;
sowas geht gar :-)
Sieht so aus, als hättest du deine ersten Programmierversuche in Basic
unternommen? :-), keinen Streit bitte.
Hallo Greenhorn, hast Du denn etwas anderes als FF reingeschrieben? Defaultmäßig steht alle Zellen auf diesem Wert. Otto
Und noch als letztes: das hatte jetzt nichts mit deinem eigentlichen Problem zu tun, das liegt tatsächlich an der Schreib- oder Leseroutine. Ich bin mir sicher, du findest es selbst.
Hallo, merkwürdiger weise funktioniert das Programm wenn ich den Optimierungsgrad verändere. Auf 02 klappt es, auf 00 leider nicht.
Das hier
> EECR|=(1<<EEMWE) | (0<<EEWE);
setzt EEWE nicht auf 0
Ein Bit wird gesetzt indem man mit der Bitnummer ver-oder-t
Ein Bit wird gelöscht, indem mit mit der invertierten
Bitmaske ver-und-et.
EECR |= 1 << EEWE; // setzt das EEWE Bit
EECR &= ~( 1 << EEWE ); // löscht das EEWE Bit
... und in der USART-Sende-Funktion ist ein Schreibfehler drin: du willst wahrscheinlich UCSRB und UCSR_C_ initialisieren! wie wärs, wenn du die Funkitonen aus dem Tut. (genau, der komische Link oben links, "AVR-GCC-Tutorial" ;-) ) übernimmst/nachbaust ?
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.