Ich weiß, es sind erst 3Std vergengen, aber kann mir niemand helfen???
Ich langweile mich
jon
Hallo,
ich möchte mit einem ATMEGA8 vom Software UART Daten empfangen.
Mit dem Hardware UART mache ich es so:
Die Daten werden auch schon über Software UART weitergesendet. Aber ist es in dieser Art auch möglich Datren über SOFTWARE UART zu empfangen?Code:$regfile = "m8def.dat" $crystal = 4000000 $baud = 19200 $framesize = 42 $swstack = 42 $hwstack = 42 Dim Eingang As Byte Open "COMD.7:19200,8,N,1" For Output As #1 Open "COMB.0:19200,8,N,2" For Input As #2 Do If Usr.rxc = 1 Then Eingang = Udr Select Case Eingang Case "1" : Print #1 , "1" 'iv Case "2" : Print #1 , "2" 'iru Case "3" : Print #1 , "3" 'il Case "4" : Print #1 , "4" 'ire Case "5" : Print #1 , "5" 'is Case Else : Print "???" End Select End If Loop End
Freue mich auf jede Antwort!!
jon
P.S.:Kenn jemand einen Bootloader, mit dem ich den ATMega8 über meine ER400TRS brogrammieren kann?
Der Bootloadert von Frank kennt nur den ATMEGA32
Nice to be back after two years
www.roboterfreak.de
Ich weiß, es sind erst 3Std vergengen, aber kann mir niemand helfen???
Ich langweile mich
jon
Nice to be back after two years
www.roboterfreak.de
Hallo Jon,
mit dem Befehl "SERIN var , byteanzahl , port , pin, baud , parity , dbits , sbits" kannst du Variablen per Sw-UART empfangen.
parity ist normaleweise 0, dbits 8 und s(top)bits 1.
Ich hoffe ich konnte dir weiterhelfen.
MfG Mark
Werd ich mal ausprobieren.
Danke für die Antwort!!
jon
Nice to be back after two years
www.roboterfreak.de
Ich habe das jetzt schon vor längerer Zeit ausprobiert und es ging auch ganz gut^^
Jetzt habe ich das Problem, dass nicht immer was kommt. Ich will die kommenden Daten also nur abfragen, wenn auch welche kommen
Im moment ist es so, dass er solange wartet, bis Daten kommt. Wenn da aber nichts kommt, soll er das einfach überspringen.
Am liebsten wäre mir so eine Variante wie oben in meinem Programm. Auch so, dass ich nur ein Byte empfange.
jon
Nice to be back after two years
www.roboterfreak.de
Hallo Jon,
wenn du den SW-Uart wie den HW-Uart butzen willst, dann musst du RxD an einen Interrupt-Pin drangängen. Bei einer fallenden Flanke muss dann ein Interrupt ausgelöst werden, der das Byte empfängt und in eine Variable speichert. Eine zweite Variable kann dann als UCSRA1 dienen. Alternativ ginge es auch an jedem Pin, wenn du einen Timer einstellt, der ständig den RxD-Pin abtastet(normaleweise mit 3-facher Baud). Das ginge dann aber auf Kosten der CPU-Leistung sowie des Timers.
MfG Mark
Danke für deine Antwort.
Das wäre eine Möglichkeit mit dem Interrupt. Das werde ich mal probieren. Im moment sind nur meine Akkus leer
Was ist UCSRA1?
Und das mit dem Teimer fällt raus, da es so schnell wie möglich gehen soll.
jon
Nice to be back after two years
www.roboterfreak.de
Hallo Jon,
UCSRA steht für UART Control and Status Register. dort werden Sachen des jeweiligen UART vermerkt wie z.b. ob ein byte empfangen wurde,ob der UART bereit ist ein byte zu senden usw. Eigentlich sollte es im obrigen Code UCSRA.rxd heissen, keine Ahnung wieso es in Bascom Usr heisst.
MfG Mark
Hast du dazu mal ein Beispielprogramm oder ist das in der Hilfe von Bascom genannt (mit Beispiel)?
jon
Nice to be back after two years
www.roboterfreak.de
Hallo Jon,
ich habe leider kein Beispielprogramm, weil ich in C programmiere. Ob das in der BASCOM-Hilfe steht weiss ich nicht. Du könntest es vllt so machen:
einfach Interrupt bei fallender Flanke aktivieren(wie das in Bascom geht, weiss ich nicht), in der ISR steht dann z.b.
serin UDR1, UCSRA1.rxd=1, return. die Variablen UCRSA1 und UDR1(Uart Dara Register) müssen zuvor natürlich deklariert werden.
wenn du dann eine gucken willst, ob ein byte empfangen wurde kannst du es mit "if UDR1.rxd=1 then..." abfragen. Das byte selbst steht dann in UDR1. Vergiss nicht, das UCSR1.rxd wieder zu löschen, wenn du im Hauptprogramm UDR1 ausliest.
Ich verspreche jedoch nicht, dass dieses Programm funktionieren wird.
Such mal bei google nach "software-uart bascom" vllt findest du was.
MfG Mark
Lesezeichen