PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Software Uart, Interrupt möglich?



hunni
29.01.2011, 16:33
Guten Abend Community Gemeinde,
mich würde interessieren, ob es auch möglich ist, den Software Uart so zu konfigurieren, dass sobald ein Zeichen empfangen wird, ein Interrupt ausgelöst wird. Beim normalen Uart funktioniert das, aber geht das auch beim Software Uart?

Gruß Hunni

PICture
29.01.2011, 20:35
Hallo hunni!

Ich kenne noch AVR's nicht gut, aber vielleicht wenn man als RX Pin einen definierten als "interrupt on change" Pin nimmt ? ;)

MfG

Besserwessi
29.01.2011, 20:58
In der Regel wird man die Software UART zum Empfangen schon über einen Interruptfähigen Pin machen. Iich weiss nicht wie BASCOM das genau intern realisiert und ob man sich irgendwie noch an den Interrupt ranhängen kann, weil die Software UART hier ja eine interne Funktion ist und nicht als Source Code vorliegt. In C wäre das keine Problem, weil man da in der Regel den Source-code zur Software UART hat.

PICture
29.01.2011, 21:16
Ich denke, dass wenn man zwei Pins als RX miteinender verbindet, könnte man unabhängig von software UART ein interrupt auslösen, oder ? ;)

MfG

Vitis
30.01.2011, 09:33
Hab ich schon gemacht auf Int0-Eingang eines Mega32, ging
problemlos.
Den Int auf falling konfigurieren und in der Interruptroutine einfach
nen Inkey.
Sollte auch bei beliebigem Interrupteingang gehen.

peterfido
30.01.2011, 10:55
Demnach kommt bei jedem Byte je Flanke ein Durchlauf der Interruptroutine.

Besserwessi
30.01.2011, 13:57
Der Interrupt direkt vom Signal Pin kommt bei jeder passenden Flanke. Das ist relativ schwer auszuwerten. Man bekommt halt einen Interrupt beim Startbit und später nur je nach Bitwert. Die späteren Bits werden nach Zeit, also über einen Timerinterrupt eingelesen. Wenn man sich da reich hängt bekommt man wenigstens einen Interrupt pro Bit. Ohne Wissen um den internen Code von Bascom hilft einem das aber auch nur relativ wenig - das müsste schon explizit vorgesehen sein damit man sich da kontrolliert an den Interrupt ran hängen kann.

Im zweifelsfall wäre es da fast einfache die Software UART selber zu implementieren - dann geht es, wird nur in BASCOM eher lagsam.

PICture
30.01.2011, 14:52
Hallo!

So weit ich weiss (BASCOM kenne ich leider noch unausreichend), lässt sich jeder interrupt einzeln sperren und wiedererlauben, das würde ich nutzen, falls möglich. ;)

MfG

Vitis
30.01.2011, 15:55
So ist es, man kann die einzelnen Interrupts disablen,
sprich bei fallender Flanke disable int0, dann inkey per softuart und gut ist.
muss man aber nicht machen, da der inkey innerhalb der Introutine
den nochmaligen Aufruf dieser unterbindet.

hunni
30.01.2011, 16:33
Wenn ich jetzt den RXD pin auf Int0 lege und dann auf falling konfiguriere, würde das nicht zu lange brauchen um den Inputbefehl auszufüren, also würde nicht das erste zeichen vielleicht falsch interpretiert? Oder täusche ich mich da?

Vitis
31.01.2011, 08:55
ich versteh jetzt nicht genau was Du mit RXD meinst, den vom
AVR oder den vom MAX232?
Aber prinzipiell kann man das so oder so nicht sagen, das kommt
darauf an.
- Welche Baudrate (28800 geht bei mir problemlos)
- Andere Interrupts auch verwendet, wieviele, wie oft der Event.
- Wie lange die Interruptroutinen sind die noch verwendet werden.

Input wäre in dem Fall eh der falsche Befehl, weil Du Deinen µC für
Ewigkeiten sperren würdest bis entweder CR oder $Timeout käme.

hunni
31.01.2011, 10:24
Mhh also ich dachte da an 19200 Baud. Aber wenn es mit 28800 Baud funktioniert, sollte es damit erstrecht gehen. Ich meinte den RXD vom Max232.
Ich wollte Input verwenden, genau aus diesem Grund. Sobald ein Zeichen von Empfangen wird, soll der alles gestoppt werden der Controller sich nur noch auf diese Sache "konzentrieren" (Ist sozusagen ein Notaussignal).

Na dann werde ich das mal so probieren, bin ja echt gespannt.

Mit freundlichen Grüßen,
Hunni

mat-sche
07.03.2011, 16:53
Hi,

genauso stehe ich vor dem Problem einen string über einen softuart einzulesen. Wie habt Ihr es nun gemacht, könnt Ihr bitte mal einen Codeschnippsel dazu einstellen ?

Vielen Dank & Gruß
MAT