hi
was folgender code machen sollte:
ein zeichen, das per uart empfangen wird, löst den interrupt aus, der
das t-bit im sreg setzt. in der hauptschleife wird das t-bit abgefragt,
wenn es gestetzt ist, wird die routine zur behandlung von empfangenen
bytes gestartet. diese überprüft, ob das empfangene byte ein 'a' ist
(0x61) und schickt es (wenn es ein 'a' ist) zurück.
das funktioniert in der praxis aber nur so halb.
es wird zwar das 'a' zurückgeschickt, aber eben nicht jedes 'a'.
manchmal, wenn ich ein 'a' drücke, passiert einfach nichts.
was läuft falsch? benutze einen atmega8 mit 14.7456 mhz
mfg, johannes
Liegt sicher an deinem Gewurschtel mit dem SREG und Register srg. Genau
habe ich es mir nicht angeschaut, aber das ist schon irgendwie konfus
(kann aber auch sein, dass es logisch völlig korrekt ist!).
Besser ist es, für solche Zustandsanzeigen Bits aus dem Registerbereich
zu nehmen.
.def bit_reg = R2
.def rx_complete=0 //Bit0
Uart_rx:
set
bld bit_reg, rx_complete //Zeichen empfangen -> Bit gesetzt
Abfrage im Hauptprogramm dann mit sbrs/sbrc
Erstens: in der ISR muß immer erst das SREG und alle anderen in der ISR
verwendeten Register gesichert (auf den Stack ge"push"t) werden. Am Ende
der ISR müssen diese in umgekehrter Reihenfolge wieder zurückge"pop"t
werden. Sonst überschreibst Du mit jedem Interrupt die betreffenden
Register der Main und es kommt nur noch Datenwurst heraus.
Zweitens: Nimm außerdem das t-Bit nicht dafür, weil dies nach der ISR
durch oben genannte Vorgehensweise eh´ wieder zurückgeschrieben wird.
Mach Dir ein separates Flagregister irgendwo im SRAM, auf welches Du von
überall im Programm zugreifen kannst und beeinflusse dort entspechender
Bits, die Du dann an geeigneter Stelle abfragst.
> Erstens: in der ISR muß immer erst das SREG und alle anderen in der ISR> verwendeten Register gesichert (auf den Stack ge"push"t) werden. Am Ende> der ISR müssen diese in umgekehrter Reihenfolge wieder zurückge"pop"t> werden. Sonst überschreibst Du mit jedem Interrupt die betreffenden> Register der Main und es kommt nur noch Datenwurst heraus.
ich habe versucht das mit in srg, SREG am anfang und out SREG, srg am
ende zu machen. geht das?
> Uart_rx:> set> bld bit_reg, rx_complete ; Zeichen empfangen -> Bit gesetzt
versteh ich irgendwie nicht. zuerst wird mit set das t-bit auf 1
gesetzt. dann wird das rx_complete-bit aus bit_reg ins t-bit kopiert.
sinn?
> Zweitens: Nimm außerdem das t-Bit nicht dafür, weil dies nach der ISR> durch oben genannte Vorgehensweise eh´ wieder zurückgeschrieben wird.> Mach Dir ein separates Flagregister irgendwo im SRAM, auf welches Du von> überall im Programm zugreifen kannst und beeinflusse dort entspechender> Bits, die Du dann an geeigneter Stelle abfragst.
ok. werds mal versuchen
Du benutzt srg sowohl im Hauptprogramm (f_loop) als auch im Interrupt,
um den Wert von SREG zu laden. Kommt ein Interrupt an einer ungünstigen
Stelle, knallts.
> Du benutzt srg sowohl im Hauptprogramm (f_loop) als auch im Interrupt,> um den Wert von SREG zu laden. Kommt ein Interrupt an einer ungünstigen> Stelle, knallts.
stimmt. danke
Hi,
ich kenne da schönere Befehle zb. brts, brtc, clt
Da das Einlesen von UDR keine Flags verändert würde dein Prog bei mir so
aussehen:
UAR: ; empfangenes byte sichern und t-bit setzen
in com_reg, UDR
set
reti
MFG Uwe