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.