Schau'n wir gleich rein.
Übrigens, meinen Pegel hab ich auch gefunden, Blödheit tut gottseidank nicht weh ( DDRD = Bit <> DDRC |= Bit).
Hab jetzt mal weiter programmiert...
ext. INT0 Initialisierung und sonstige Inits sollten eigentlich stimmen.
in main() will ich jetzt einfach ein character echo ausführen.
In der Receive-Routine (zu finden in der Timer0 ISR) hab ich aber noch ein Problem. Wie kann ich die Bits, die über die RX Leitung kommn und ext. Int0 auslösen zur Weiterverarbeitung einlesen/puffern ?? Steh grad auffer Leitung..![]()
Schau'n wir gleich rein.
Übrigens, meinen Pegel hab ich auch gefunden, Blödheit tut gottseidank nicht weh ( DDRD = Bit <> DDRC |= Bit).
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Nja so einfach gehts irgndwie doch nicht mit Empfangen...
Einlesen funzt über PINx (nicht PORTx) soweit ich das jetzt feststellen konnte.
Bloß wie feststellen, welches empfangene Bit jetzt Datenbit, Start - bzw. Stopbit ?? Müsste man wieder mit "State" wie bei Senden machen oder ??
Aber müßte man das nicht auch gleich inner INT0 Routine auswerten, anstatt inner Timer0 ISR ??? (wär doch logisch, da mir sonst bits verloren gehen..)
Is mir gestern abend noch so durchn Kopf gegangen
Gruß schamp
Hi, ich grad in deinem Programm rumgekrixelt.
Die Int0-ISR zeigt, daß der Absender gerade mit dem Start-Bit anfängt.
Um mit der nächsten Time-ISR genau in die Mitte vom ersten Datenbit zu kommen, brauchen wir also einen Preload von 1.5 Bit. ab dann gehts wieder normal, auch das Stop Bit nehmen wir mit, aber dann re-enablen wir Int0 und setzen "daten da"
schau mal
Sicherheitstest: Beim INT0 alles in Ruhe lassen, nur ein Flag setzen, und in der Mainroutine aufgrund des Flags irgendwas senden.
Dadurch wissen wir, daß int0 überhaupt funktioniert
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
irgdnwie ist da was wahres dran *tehe*Zitat von PicNick
habs ma compiliert, raufgeladen und tera term angeschmissn. Also empfangen tut er (int0 wird ausgelöst) aber Zeichen stimmt noch net. Egal welche Taste man drückt es kommen immer zwei: ÿÿ
Ev. In der INT0-ISR nur aktiv werden, wenn RX_M_RECEIVE NICHT gesetzt ist.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Aber in der INT0-ISR musst du doch RX_M_RECEIVE setzen sonst gehts im "Receive-Teil" vonner Timer0-ISR nicht weiter...Zitat von PicNick
![]()
Ja, ja. Aber aber vorher fragen, ob der Flag nicht schon vorher gesetzt wurde.
Weil dann läuft ja schon die Empfangs-Sequenz, und während der nächsten 9 Timer-Interrupts wollen wir ja nix mehr sehen oder hören.
du meinst so ?
edit: funkt trotzdem noch nichtCode:#pragma vector=INT0_vect __interrupt void ext_int0(void) { if(!(bRxFlag & RX_M_RECEIVE)) { GICR = 0; // Disable external interrupt bTxFlag &= ~TX_M_SEND; // Deactivate Transmit-Mode bRxCount = 0; // Clear Receive Counter TIFR |= (1<<TOV0); // clear T/C0 overflow flag TIMSK |= (1<<TOIE0); // enable T/C0 overflow interrupt TCNT0 = INT0_PRELOAD; // Set timer reload-value (to 1.5 bit len). 29 = time delay that // have already been used in this // interrupt plus the time // that will be used by the time // delay between timer interrupt request // and the actual sampling of the first // data bit. bRxFlag |= RX_M_RECEIVE; // Activate Receive-Mode } }
Ja, so mein' ich das. Ist auf jeden Fall gut, und würde das enablen/disablen des INT0 erübrigen, aber das klappt ja ohnehin ?
*murmel*
Dzt.Stand: Int0 spricht an, Timer offenbar auch,_M _DATA wird ja irgendwann gesetzt, aber es kommt auf ein Input-Zeichen üü irgendwas an. Stimmt das so ?
d.h. es kann beides fehlerhaft sein, Empfang & Senden, das ist nix
Also:
Sende irgendwas vor dich hin, bis _DATA kommt (+ECHO), und dann sende wieder irgendwas, so wie vorher
Ergebnis:
A Senden geht überhaupt nicht mehr ---> ?
B Senden geht, aber ab dem Moment, wenn daten kommen, geht's nicht mehr
C Nur das Echo ist falsch
Bitte machen sie ihr Kreuzchen
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen