Hallo
TXC sollte besser mit = gelöscht werden. Mit |= werden zufällig auch noch gesetzte Flags mitgelöscht!UCSRA |= 0x40; // 'clear' transmitter flag
Gruß
mic
Hallo,
ich habe an Euch eine große Bitte: Kann jemand das folgende Programm (nur kurz!) testen?
Es müsste (besser: sollte!) nach dem Laden blinken, dann 10 Zeilen mit a ... z zum PC senden.
Die Prog.-Frakmente stammen noch von der "Urversion".
FirstTry.zip (enthält alle files) beigeschlossen!Code:/* test.c Test zum Senden - asuro.h + -.c verkleinert und SerWrite(j) angepasst! Programm soll 10 Zeilen mit a ... z senden. SerWrite() enthaelt nur "wenn Speicher leer, dann senden"! */ #include "asuro.h" int main(void) { unsigned char i, j; Init(); for(i=0;i<200;i++) { for(j=0;j<20;j++) Sleep(0xFF); StatusLED(RED); for(j=0;j<20;j++) Sleep(0xFF); StatusLED(GREEN); } UCSRB |= 0x08; // Sender ein UCSRA |= 0x40; // 'clear' transmitter flag for(i=1;i<11;i++) { for(j='a';j<='z';j++) { SerWrite(j); } SerWrite('\n'); SerWrite('\r'); } while (!(UCSRA & 0x40)) ; // warten bis Uebertragung fertig UCSRB &= ~0x08; // Sender aus StatusLED(YELLOW); while(1) ; return 0; } --------------- /* asuro.c */ #include "asuro.h" volatile unsigned char count72kHz; SIGNAL (SIG_OUTPUT_COMPARE2) { count72kHz ++; } void Init (void) { TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20); OCR2 = 0x6E; TIMSK |= (1 << OCIE2); UCSRA = 0x00; UCSRB = 0x00; UCSRC = 0x86; UBRRL = 0xCF; DDRB = IRTX | LEFT_DIR | PWM | GREEN_LED; DDRD = RIGHT_DIR | FRONT_LED | ODOMETRIE_LED | RED_LED; TCCR1A = (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1); TCCR1B = (1 << CS11); //ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); StatusLED(GREEN); sei(); } inline void StatusLED(unsigned char color) { if (color == OFF) {GREEN_LED_OFF; RED_LED_OFF;} if (color == GREEN) {GREEN_LED_ON; RED_LED_OFF;} if (color == YELLOW) {GREEN_LED_ON; RED_LED_ON;} if (color == RED) {GREEN_LED_OFF; RED_LED_ON;} } void SerWrite(unsigned char data) { while(!(UCSRA & 0x20)) ; UDR = data; } void Sleep(unsigned char time72kHz) { count72kHz = 0; while (count72kHz < time72kHz); }
Auswertung: Kommen _nicht_ alle Zeichen an, dann sollte man 'was ändern!)
Vielen Dank schon 'mal im voraus!
cu Helmut
PS: Heute morgen konnte ich sehr über diverse Artikel lachen!
Hallo
TXC sollte besser mit = gelöscht werden. Mit |= werden zufällig auch noch gesetzte Flags mitgelöscht!UCSRA |= 0x40; // 'clear' transmitter flag
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
nein, gerade nicht! wenn man mit = schreibt, wird das ganze register überschrieben.
oder war das gerade das ziel, weil ja mit ner 1 grlöscht wird? hmm...
wäre btw ein gute grund warum gerade mit ner 1 das bit entfernt wird..
Hi,
interessant ist, dass ich ein ZIP-file mit reingestellt habe, das jetzt weg ist!?
Also nochmals das Ganze!
Vielleicht könnt Ihr bitte das ganz kurze Prog. 'mal testen.
Danke!
cu Helmut
das tip file ist noch da (bei mir zumindest). du musst allerdings eingeloggt sein um es zu sehen.
Vielen Dank!
cu Helmut
PS: Man lernt einfach :immer_ noch 'mal was hinzu!![]()
Hallo helmut_w,
ja, ich traue mich noch![]()
Auch ich konnte aus beiden Beiträgen downloaden. Habe aber noch nichts getestet.
Ich stimme damaltor zu, auch ich würde das |= stehen lassen.
Was ich aber noch in der Doku gefunden habe (ja, das Thema ist gegessen, auch ohne Prinzenrolle!) ist folgendes:
Dies gilt scheinbar für jedes Flag, welches einen Interrupt auslösen kann. Ausnahme eventuell beim SPIF-Bit.Seite 12/13 Reset and Interrupt Handling
Interrupt Flags can also be cleared by writing a logic one to the flag bit position(s) to be cleared.
Ich habe kein Liste gefunden, welche Flags es denn nun genau sind. Immer nur bei den einzelnen Flags, gibt es einen 'versteckten' textuellen Hinweis.Seite 22 I/O Memory
Some of the Status Flags are cleared by writing a logical one to them.
Bei diesem Bit ist als einzige Stelle tatsächlich mal mit (zero) ein Hinweis auf ein 'gecleardes' Bit, dass es dann '0' ist gegeben.Seite 46 General Interrupt Control Register - GICR
When the IVSEL bit is cleared (zero), ...
BRAVO an damaltor, der sich getraut hat diesen Sachverhalt hier zu posten. (Wer setzt den schon ein Bit auf '1' um es auf '0' zu setzen?)
Hier hört mein Englisch tatsächlich auf. Die weitere Erklärung von CBI und SBI mit 'read as set' kann ich tatsächlich nicht mehr umsetzen.Seite 283 Register Summary (Continued)
Note:
3. Some of the Status Flags are cleared by writing a logical one to them
Note that the CBI and SBI instructions will operate on all bits in the I/O Register,
writing a one back into any flag read as set, thus clearing the flag.
The CBI and SBI instructions work with registers 0x00 to 0x1F only.
Lieber Asuro programieren als arbeiten gehen.
das bedeutet folgendes:
mit CBI und SBI kann man in assembler einzelne bits setzen (Set BIt) oder löschen (Clear BIt).
das bedeutet allerdings nicht , dass die erforderliche aktion getan wird um es zu löschen, sondern mit sbi wird eine 1 geschrieben, und mit cbi wird eine null geschrieben.
diese beiden befehle funktionieren nur mit den ersten 32 registern (0x00 bis 0x1F), das sind allgemeine statusregister und zB die von den Portpins.
Note that the CBI and SBI instructions will operate on all bits in the I/O Register,
writing a one back into any flag read as set, thus clearing the flag.
das ist extrem wichtig: es bedeutet, wenn du ein register ausliest, und dann wieder an die gleiche stelle schreibst, werden alle interrupt flags gelöscht (wenn du eine 1 liest, und dann an die stelle ne 1 schreibst, wird das bit gelöscht... is klar soweit, aber leicht zu vergessen wenn man zB den inhalt eines registers sichern will un es später zurückschreibt.)
Hallo
Wenn man mit = arbeitet, wird nur das angesprochene Bit gelöscht, alle anderen werden mit 0 überschrieben und dadurch nicht beeinflußt. Mit |= werden auch andere Flags mitgelöscht, wenn sie zufällig genau zu diesem Zeitpunkt auch gesetzt(=1) sind!nein, gerade nicht! wenn man mit = schreibt, wird das ganze register überschrieben.
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
aaaaaaaaaaaahhhh... richtig =)
vermutlich ist darum auch das löschen mit 1 eingestellt worden... macht sinn.
Lesezeichen