Welchen Wert im SRAM?
Mal was anderes.....
Wenn ein RESET gemacht wird, dann dürfte er doch eigentlich den zuvor gesendeten Wert, welcher ja im SRAM gespeichert ist, nicht mehr aufrufen können... Oder?
Das tut er aber, er sendet mir den wert ja zurück.
Also führt er kein Reset durch, sondern startet die MAIN-Funktion von anfang an wieder. Ist das richtig?
Sorry Sprinter, diese Antwort hab ich jetzt völlig übersehen...Wozu ist denn das data_alt? Das verwendest du uninitialisiert.
Versuch mal nen poll-Betrien also Receive ohne Interrupt zu nutzen.
Ansonsten fällt mir nur ein, daß es eine Silicon-Bug sein könnte. Evtl sagt ds Datenblatt oder die Errata zu deinem AVR was dazu, aber an so war denkt man natürlich nicht gerne...
das mit data_alt hätte ich anders machen sollen... mir ist auf die schnelle nur das gekommen. Das er halt nicht periodisch sendet....
Hätte ich mit der "Flag-methode" machen sollen
Den interrupt zu benutzen wäre mir schon lieber, da ich Zeichenketten empfange... nicht dass ich da mal ein Zeichen verpasse... das ist dann nicht so toll....
Gruß,
Franz
Welchen Wert im SRAM?
Disclaimer: none. Sue me.
Nochmal genau die Symptomatik:
1 Er bringt "..INIT ok"
2 dann wartet er
3 und wenn du was schickst,
reagieren die LED ?
4 kommt wieder "..INIT ok"
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Also:
Ich schalte das Teil ein (bzw. er ist mit dem schreiben fertig)
1. Das Programm startet.
2. Am PC empfange ich " USART Init - OK "
Dann sende ich zB.: A
1. Am PC empfange ich "USART Init - OK A"
die LED für den Empfang leuchtet warscheinlich so kurz auf dass man es nicht sieht. ich zu mal die interrupt routine ausklinken, um zu sehen was aufleuchtet... moment
Gruß,
Franz
Ist ja interessant.
Also der Code der nun drauf ist:
Nun...Code:#include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #define F_CPU 7372800 #define USART_BAUD_RATE 115200 #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1) volatile static uint8_t data; void USART_init(void){ UBRRH = 0; UBRRL = (uint8_t) USART_BAUD_SELECT; /* Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts */ UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); /* Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit */ UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); data = UDR; } void USART_transmit(uint8_t c){ while(!(UCSRA & (1<<UDRE))); UDR = c; } void USART_transmit_string(uint8_t *string){ while(!(UCSRA & (1<<UDRE))); while( *string){ USART_transmit (*string++); } } /* SIGNAL( SIG_USART_RECV ) { data = UDR; } */ int main (void) { // D A T E N R I C H T U N G : //=============================================== // PORTA Pin: 76543210 ( 0 = Eingang/Pullup aus, 1= Ausgang/Pullup ein ) DDRA = 0b11111111; // PORTA = 0b00000000; // // PORTB Pin: 76543210 ( 0 = Eingang/Pullup aus, 1= Ausgang/Pullup ein ) DDRB = 0b00000000; // PORTB = 0b00000000; // // PORTC Pin: 76543210 ( 0 = Eingang/Pullup aus, 1= Ausgang/Pullup ein ) DDRC = 0b00000000; // PORTC = 0b11111111; // // PORTD Pin: 76543210 ( 0 = Eingang/Pullup aus, 1= Ausgang/Pullup ein ) DDRD = 0b11111111; // PORTD = 0b00000000; // USART_init(); USART_transmit_string("USART INIT - OK "); sei(); uint8_t data_alt; while (1) { PORTA = UCSRA; PORTD = data; /* if( data != data_alt ){ USART_transmit(data); data_alt = data; } */ } }
1. ich schalte ein
2. PC empfang "USART Init - OK"
3. Ich sende
4. PC empfang"USART Init - OK"
Wenn ich meine Gedanken mal preisgeben darf: "BAHNHOF"!
Gruß,
Franz
Moment:
Mach mal line feed in den ok-string
"USART INIT - OK\n\r"
dadurch fängt er dann eine neue Zeile an.
in dieser neuen Zeile sollte dann nurmehr das "A" stehen oder sonstwas
aber nicht nochmal "blabla OK"
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Nimm mal das sei() raus, dann müsste es immer noch gehen.
Disclaimer: none. Sue me.
Also OHNE sei():
Da Leuchtet dann was neues auf!
Und zwar in UCSRA BIT7: RXC = USART Receive Complete
das mit dem Zeilenumbruch... HTERM erkennt keinen ;-(
Gruß,
Franz
und der Start-String kommt immer noch 2x?
Den Zeilenumbruch musst du auch senden (mit '\n') und HTERM anpassen.
Disclaimer: none. Sue me.
Das war vorher sicher auch schon da, aber das Lesen von UDR löscht das.
Inzwischen liest es aber keiner mehr, also bleibt es stehen.
HTERM ? kein Zeilenumbruch ? scheint mir ein merkwürdiges Programm.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen