PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeichenempfang RS232



Ruppi
19.07.2005, 08:05
Hallo,
das nachfolgende Programm sendet mit etwa 1000Hz Messwerte des AD-Wandlers eines Mega8 an den PC. Hierbei gibt es auch noch keine Probleme. Jetzt würde ich aber gerne die Abtastfrequenz während des Programmlaufs durch Übermittlung eines Bytes ändern, was leider nicht funktioniert. Die Interruptroutine wird auf jeden Fall aufgerufen, aber der neue Wert wird scheinbar nicht übernommen, d.h. Value scheint immer gleich zu bleiben. Kann mir jemand helfen?





$regfile = "m8def.dat"
$crystal = 3686411
$baud = 115200 '9600

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

'3,686400MHz/8 = 460,8kHz -> 2,1701us
Config Timer1 = Timer , Prescale = 8
On Timer1 Ontimer:
Enable Timer1

Config Pinb.0 = Output


On Urxc Onrts:
Enable Urxc
Enable Interrupts

Dim Messwert As Word , Lbyte(2) As Byte At Messwert Overlay , L As Word
Dim B As Byte , Value As Word , I As Word
Value = 65000



'Timer-Interrupt
Ontimer:
Timer1 = Value
Messwert = Getadc(0)
Printbin Lbyte(1) ; Lbyte(2) 'Messwert an den PC senden
Return

'Interrupt für den Zeichenempfang
Onrts:
B = Udr
L = B * 100 'max 255*100 = 25500
Value = 65000 - L '65000-25500 = 39500
For I = 1 To 500
Printbin B ; 0 'Wert eine Sekunde lang zurücksenden
Waitms 2
Next I
Return


End

PicNick
19.07.2005, 08:21
Da dürfte es um die Datentypen Byte/word gehen
dreh das um:


L = Udr
L = L * 100 'max 255*100 = 25500
Value = 65000 - L '65000-25500 = 39500

sollte eigentlich gehen

Ruppi
19.07.2005, 08:31
Vielen Dank, werde es heute nachmittag ausprobieren...

Ruppi
19.07.2005, 08:33
Aber wie sende ich dann das empfangene Zeichen zurück? Ich muss es doch als Byte vorliegen haben, nicht wahr?

PicNick
19.07.2005, 08:37
Gut, dann doch mit B


B = Udr
L = B
L = L * 100 'max 255*100 = 25500
Value = 65000 - L '65000-25500 = 39500

printbin b


Wichtig ist, daß VOR dem multiplizieren der Wert auf ein word erweitert ist

Ruppi
19.07.2005, 08:44
Alles klar, danke. Ich nehme mal an, es gibt in Bascom keine direkten Typumwandlungen per Funktion, also sowas wie L = cLng(B).

PicNick
19.07.2005, 08:48
Es gibt ein integer = makeint(lsb, msb), und solange die werte positiv sind, ist das integer ja auch ein word.
Da du ja nur das lsb hast, reicht natürlich word = byte.
Umgekehrt geht byte = word (<=255) da ja nur das LSB von Word gemoved (*pfff*) wird.

Ruppi
19.07.2005, 08:48
Allerdings ist eine Sache noch unklar: In dem am Anfang gezeigten Programm habe ich ja das empfangene Zeichen zurückgesendet. Ganz egal, was ich sende, ich bekomme immer einen Wert zwischen 50 und 53 zurückgesendet.

PicNick
19.07.2005, 09:00
bei der Multiplikation B * 100 bleibt nur das LSB übrig, also eigentlich
der 256 Rest (module 256). das können abenteuerlich Werte sein.

Ruppi
19.07.2005, 09:09
Du hast Recht, es wird wohl der Rest eines mehrfachen Überlaufs sein.
Das wars erstmal, Danke Dir für die schnelle Hilfe!