halt ein, Kollege, andere Baustelle:
"Ischarwaiting" funzt zusammen mit "CONFIG serialin=buffered"
Was du meinst, ist irgendein Flag im zuständigen Hardware-register (weiß jetzt nicht, is beim 2560 aber eh woanders)
Muttu gucken
Hallo
Ich versuche gerade krampfhaft mit dem ATMEGA2560 das Register auszulesen wo hinterlegt ist ob sich ein Zeichen im RS232 Puffer befindet.
Der Befehl Ischarwaiting sollte das normalerweise im Bascom tun aber es gibt keine Reaktion auf den Befehl.
Hier mein getesteter Code :
Code:If Ischarwaiting() = 1 Then Bb = Waitkey(#4) Select Case Bb Case "Befehl1_mach_dies_mach_jenes" Case Else End Select End If
Was kann ich tun damit mein Programm nicht immer bei Waitkey endet ?
Ohne die Abfrage ob sich etwas im Buffer befindet durchläuft mein µC die do loop Schleife nicht mehr.
Gruß
Steffen
halt ein, Kollege, andere Baustelle:
"Ischarwaiting" funzt zusammen mit "CONFIG serialin=buffered"
Was du meinst, ist irgendein Flag im zuständigen Hardware-register (weiß jetzt nicht, is beim 2560 aber eh woanders)
Muttu gucken
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo Steffen 44,
ich hatte das gleiche Problem.
Hast du schon mal auf der Seite http://www.rowalt.de/mc/index.htm
unter Einführung 4 nachgelesen ?
Ich denke das hilft dir weiter.
MfG
funktioniert überhaupt nicht da der ATMEGA2560 andere Register oder Flags hat oder was auch immer.Code:If USR.RXC = 1 Then 'Wenn Byte empfangen... i = UDR 'Byte aus UART auslesen Select Case i Case "H" Print "Hallo AVR" Case "h" Print "hallo avr" Case Else Print "Unbekannter Befehl" End Select End If
Ich habe jetzt schon mal die Portnummer mit angegeben aber es funzt trotzdem nicht.
Die Port Nummer die das USB verwendet ist 4 aber es kommt trotzdem wieder ein Fehler : "Label not found [_ISKEY4 ] in file ...."Code:Open "com4:" For Binary As #4 'USB Port If Ischarwaiting(#4) = 1 Then Bb = Waitkey(#4) Select Case Bb Case "do-something" Sound Portl.4 , 400 , 450 ' Beep when Ischarwaiting(#4) = 1 Case Else End Select End If
Ich verstehe es einfach nicht und es funzt nicht
Gruß
Steffen
Hallo Steffen44,
ich habe noch einmal nachgesehen wie ich das mit einem Atmega 128 programmiert habe. Hier der Code:
'--------------------------------------------------------------
' serial INPUT
'--------------------------------------------------------------
$regfile = "m128def.dat"
$crystal = 8000000
$baud = 19200
Config Serialin1 = Buffered ', Size = 20
Enable Interrupts
Enable Urxc
On Urxc Interrupt0
Dim A As Byte
Open "Com1:" For Binary As #1
A = 0
Anfang:
Cls
Lcd "A=" ; A
Waitms 300
Goto Anfang
Interrupt0:
Inputbin #1 , A
Return
End
Im Simulator für den Atmega 128 lief es.
Du mußt nur das Regfile auf deinen Atmega 256 ändern.
Der Prozessor wartet nicht auf ein Zeichen sondern benutzt den Interrupt.
In der Zwischenzeit läuft er durch das normale Programm. In meinem Fall durch die mit Anfang gekennzeichnete Schleife. Erst wenn ein Zeichen empfangen wurde Wird URXC auf 1 gesetzt. Dann wird der Interrupt ausgelöst und springt zum Punkt Interrupt und legt das Zeichen in der Variable A ab darach springt an die Stelle zurück wo er herkam bevor er in den Interrupt sprang.
Dann läuft er durch die "Anfang"-Schleife und zeigt das Zeichen auf einem Display, das am Port A angeschlossen ist an.
Mfg Jürgen
Hallo Jürgen
der ATMEGA2560 ist übelst bockig entweder Bascom ist noch voller Fehler oder ich bin zu dumm. Der Code von dir wird ohne Fehler kompiliert soweit alles ok aber ich erhalte keine Reaktion auf meinem LCD Display A=0 wird immer angezeigt.
Die einzigste Kommunikation die ich hinbekomme habe ist eine Bit Auswertung aber eine Zeichenkette/String zu senden ist unmöglich.
Code:'Diese Anweisung setzt die Fusebits automatisch korrekt (Syntax $PROG LB, FB , FBH , FBX ) $prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus $regfile = "m2560def.dat" $hwstack = 32 $swstack = 16 $framesize = 40 $crystal = 16000000 'Quarzfrequenz 'Ist 1 wenn USB angeschlossen 'Definition USB Config Com4 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 'Definition für LCD Display 40x4 Config Lcd = 20 * 4 Config Lcdpin = Pin , Db4 = Portb.7 , Db5 = Porth.2 , Db6 = Porth.0 , Db7 = Porte.4 , E = Portb.5 , Rs = Porte.6 Config Lcdbus = 4 Open "com4:" For Binary As #4 Dim A As Byte , S As String * 2 Do A = Inkey(#4) If A = 1 Then 'we got something A = Waitkey(#4) 'get it End If If A = 49 Then 'wenn die 1 auf der tastatur gedrückt wird dann mach was Sound Portl.4 , 400 , 450 Print #4 , "ASCII code " ; A ; " from serial" End If Print #4 , "Test" Waitms 100 ' End If Loop
Wenn ich nur wüßte wie man den Simulator bedient das das Teil gibt mir nur Rätsel auf.
Gruß
Steffen
Hallo Steffen,
nur nicht den Mut verlieren, wir schaffen das schon.
Als erstes würde ich mir den empfangenen Wert ( A ) auf dem Display anzeigen lassen. Dies machst du wie folgt:
cls
LCD "A= " ; A
waitms 100
füge es ein vor die Zeile
IF A = 49 then
Zeigt das Display irgend etwas an, wenn du ein Zeichen sendest ?
Dann beschreib doch mal deinen Aufbau der Hardware !
Wie dibst du das Zeichen, das der Prozessor empfangen soll ein?
Hast du ein Evulationsboard?
Hast du deinen PC über eine RS232 an den Prozessor angeschlossen ?
Ich benötige mehr Informationen.
MfG Jürgen
Ok also ich habe hier ein selbstgebautes Experimentierboard das auf dem RN-Mega2560 basiert. Das Board hat 8 Digitalausgänge, 16 Analogeingänge und 12 Digitaleingänge. Angeschlossen ist ein 4x20 Zeichen Display.
Die ganze Hardware kommuniziert per RS232/USB mit dem Excel 2000 über das MSCOMM OCX. Das Excel habe ich im Prinzip als Grundlage um mir vernümftig etwas Visualisieren zu lassen. Wenn man alles im Hyper terminal anschauen muss wird man wahnsinnig.
Das der µController vermutlich mit Inputbin und Input nichts anzeigt ist garantiert noch ein Bug in Bascom. Ich habe diese Befehle auch schon ohne Interupt versucht aber es gibt überhaupt keine Reaktion darauf.
Das hatte ich auch schonmal vor die Schleife gesetzt aber es hat keine Auswirkung :
cls
LCD "A= " ; A
waitms 100.
Ich denke mal ich lasse es erstmal auf meiner Lösung beruhen auch wenn diese nicht gerade sehr fortschrittlich ist.
Mein jetziges Problem ist das wenn ich aus dem Excel eine Zahl schicke damit der µC den Digitalausgang schaltet dann kann ich immer nur einen Impuls schicken. Mit nur einem kurzem Impuls kann ich aber keinen der Digitalausgänge permanent einschalten bis zum Ausschaltimpuls.
Das müsste irgendwie wie eine Selbsthaltung funktionieren.
Gruß
Steffen
Hallo Steffen,
Ich kenne 2 Möglichkeiten die Selbsthaltung deines Ports zu realisieren.
1. beim Einlaufen des Zeichens den entsprechenden Port auf 1 setzen und
beim nächsten Mal den Port auf 0 setzen.
2. Den Befehl Toggle zu benutzen
If A = 1 Then Toggle Portb.0
Dieser Befehl negiert den Ausgang einfach, egal ob er vorher 1 oder 0 war.
MfG Jürgen
Lesezeichen