Hallo,
also der Empfang läuft über Interrupt:
Der Empfänger arbeitet etwa so:
On Urxc Onrxd
Onrxd:
E_byte = Udr
Select Case E_byte
Case 35 : E_flag = 1 '"#" = Slave wird gesendet
Case 58 : E_flag = 3 '":" =
Case 13 : E_flag = 4 '"13 / ENTER" = Empfang komplett
Case Else : If E_flag = 1 Then Slave = Slave + Chr(e_byte)
If E_flag = 2 Then Parameter = Parameter + Chr(e_byte)
If E_flag = 3 Then Wert = Wert + Chr(e_byte)
End Select
Return
Später werden alle Daten in einen String geschoben und dieser wird auf die Karte geschrieben.
Wie meinst du dass, wie die Daten ankommen?
Es wird ca 11 mal pro Sekunde mit einem Printbefehl gesendet.
Print "#S1:" ; Strom11 ; ";" ; Spannung2 ; ";;X"
Das ;;X am Ende ist, weil ich manchmal 1-2 Zeichen verlohren habe
Code:'SENDER RS232 '------------------------------------------------------------------------------- 'Konfiguration µC: $regfile = "m8def.dat" 'AT-Mega8 $crystal = 14745600 'Quarz: 14,7456 MHz $baud = 38400 'Baudrate der UART '------------------------------------------------------------------------------- 'Ein- Ausgänge: 'Ddrb = &B10000001 '1 Ausgang, 0 Eingang = Pin PB7-0 als Ausgang Ddrc = &B0000000 '1 Ausgang, 0 Eingang = Pin PC6-0 als Eingang 'Ddrd = &B11100000 '1 Ausgang, 0 Eingang = Pin PD7-0 als Ausgang; 0 als Eingang (Freigabe) 'Portc = &B11111111 'PC0...PC7 auf High setzen '------------------------------------------------------------------------------- 'Konfiguration LCD Config Pinb.2 = Output Pinb.2 = 0 '= Read / Write Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portb.1 , Rs = Portd.4 'neues LCD mit Quarz Cursor Off Noblink ' Cursor aus '------------------------------------------------------------------------------- 'Analogmessung Config Adc = Single , Prescaler = Auto , Reference = Avcc '------------------------------------------------------------------------------- 'Timer Config Timer1 = Timer , Prescale = 1024 Timer1 = 36736 'Überlauf alle 2 Sekunden Enable Timer1 Enable Interrupts On Timer1 Ontimer1overflow 'Timer1-Interruptroutine deklarieren '------------------------------------------------------------------------------- ' Variablen Dim Ani_1 As Byte 'Zähler für startannimation Dim Ende As Byte 'zum Animation beenden Dim Analog1 As Word '=0-1023 vom Analogeingang (für Strommessung) Dim Strom1 As Single 'Stromwert 0 Dim Strom11 As Byte 'Ergebnis Strom1 Dim Strom11_old As Word 'LCD aktualisieren, wenn Wert sich geändert hat Dim Max0 As Byte 'warte zeit für max1wert Dim Max1 As Byte 'MAX Strom1 Dim Max2 As Byte 'MAX_MAX Strom1 Dim Analog5 As Word '=0-1023 vom Analogeingang (für Spannungsmessung) Dim Anzahl_rs232 As Word 'Abstand RS232 senden Dim Spannung1 As Single Dim Spannung2 As Word 'für RS232 Dim Stelle0 As Byte 'um die richtige Stelle anzuwählen - VORZEICHEN Dim Stelle1 As Byte 'um die richtige Stelle anzuwählen - Strom aktuell Dim Stelle2 As Byte 'um die richtige Stelle anzuwählen - Strom MAX1 Dim Stelle3 As Byte 'um die richtige Stelle anzuwählen - Strom MAX2 Dim Stelle_v As Byte 'um die richtige Stelle anzuwählen - Analogeingang 5 Dim Vorzeichen As String * 1 'Vorzeichen + / - Dim Lcd_z As Word 'LCD Zähler zum Anzeige aktualisieren Dim Zyklus As Long 'Anzahl der Do...Loop Durchgänge in 2 Sekunden '------------------------------------------------------------------------------- 'Do - Looproutiene: '------------------------------------------------------------------------------- Start Adc 'Starte analog Messung Max1 = 0 'Max Stromspeicher1 löschen Do ' _______________________________________________________________ '| ___________________________________________________________ | '| |Stromberechnung: | | '| | | | '| |Analogeingang - Vref also 512 Stufen = Stromwert in Stufen | | '| |Stromwert in Stufen * 1,5625 = Stromwert in A | | '| |___________________________________________________________| | '|_______________________________________________________________| 'Analogeingänge Auslesen: Analog1 = Getadc(1) 'Wert aus Analogeingang laden (Stromsensor) Analog5 = Getadc(5) 'Wert aus Analogeingang laden (Spannung) Strom1 = Analog1 - 510 'von 512 auf 510 geändert, weil 0A bei 510 liegt...Messtoleranz... If Strom1 < 0 Then 'wenn Strom negativ Strom1 = Strom1 * -1 Vorzeichen = "-" Else Vorzeichen = " " End If Strom1 = Strom1 * 1.5625 'Strom1 = Strom in Amperé If Strom1 > 0 Then 'damit bei negativen Strömen kein Blödsinn angezeigt wird!! Strom11 = Round(strom1) Else Strom11 = 0 End If 'Max1 Strom speichern If Strom11 > Max1 Then Max1 = Strom11 End If 'Max2 Strom speichern If Strom11 > Max2 Then Max2 = Strom11 End If 'Spannung errechnen Spannung1 = Analog5 * 45.1319648093842 'Widerstände gemessen 9,9k & 81,5k-> 46,17V Spannung2 = Round(spannung1) Spannung1 = Spannung1 / 1000 'für LCD anpassen 'Maxspeicher zurücksetzen If Max0 > 4 Then Max0 = 0 Max2 = 0 End If '------------------------------------------------------------------------------- 'Stellen für LCD anwählen '------------------------------------------------------------------------------- 'richtige Stelle anwählen! If Strom11 < 10 Then Stelle1 = 4 Stelle0 = 3 'Anzeige für negatives Vorzeichen Else Stelle1 = 3 Stelle0 = 2 'Anzeige für negatives Vorzeichen End If If Strom11 > 99 Then Stelle1 = 2 Stelle0 = 1 'Anzeige für negatives Vorzeichen End If 'richtige Stelle anwählen! If Max1 < 10 Then Stelle2 = 3 '14 für großes LCD Else Stelle2 = 2 '13 End If If Max1 > 99 Then Stelle2 = 1 '12 End If 'richtige Stelle anwählen! If Max2 < 10 Then Stelle3 = 7 Else Stelle3 = 6 End If If Max2 > 99 Then Stelle3 = 5 End If 'richtige Stelle anwählen! If Analog5 < 10 Then Stelle_v = 8 Else Stelle_v = 7 End If If Analog5 > 99 Then Stelle_v = 6 End If If Analog5 > 999 Then Stelle_v = 5 End If 'LCD aufrufen Incr Lcd_z If Lcd_z > 300 Then '300 = 5 RS232 Werte pro Sekunde empfangen!!! Lcd_z = 0 Gosub Lcd_klein End If '_______________________________________________________________________________ '_______________________________________________________________________________ 'RS232 senden Incr Anzahl_rs232 'Variable für Zeitabstand If Anzahl_rs232 > 90 Then 'ca. 11 Werteausgaben pro Sekunde Anzahl_rs232 = 0 Print "#S1:" ; Strom11 ; ";" ; Spannung2 ; ";;X" End If Incr Zyklus Loop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- 'Sprungmarken: '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- Ontimer1overflow: Timer1 = 36736 Max1 = 0 Incr Max0 'Print Zyklus 'Zyklus = 0 Return '------------------------------------------------------------------------------- Lcd_klein: Cls 'Locate 1 , Stelle0 'Lcd Vorzeichen Locate 1 , Stelle0 Lcd Strom11 ; "A" Locate 1 , 5 Lcd Fusing(spannung1 , "#.&") ; "V" 'Lcd Spannung3 'Locate 1 , Stelle_v 'Lcd Analog5 Locate 2 , Stelle2 Lcd Max1 ; "A" Locate 2 , Stelle3 Lcd Max2 ; "A" Return '=============================================================================== 'Pinbelegung µC Strommessung LEM 200-P '=============================================================================== ' AT MEGA 8 ' +---U---+ ' Reset PC6 +1 28+ PC5 ' PD0 +2 27+ PC4 ' PD1 +3 26+ PC3 ' PD2 +4 25+ PC2 ' PD3 +5 24+ PC1 ' PD4 +6 23+ PC0 Analogeingang0 ' Vcc +7--- 22+ GND | / Reset | ' GND +8 |-21+ AREF | / GND | ' RS PB6 +9 |-20+ AVCC | / +5V | ' E PB7 +10 19+ PB5 Taster5 | / SCK | ' / LCD / DB4 PD5 +11 18+ PB4 Taster4 | / MISO | ' / LCD / DB5 PD6 +12 17+ PB3 Taster3 | / MOSI | ' / LCD / DB6 PD7 +13 16+ PB2 Taster2 ___________ ' / LCD / DB7 PB0 +14 15+ PB1 Taster1 ' +-------+ '=============================================================================== 'Pinbelegung AM LCD '=============================================================================== 'Pin 1: GND 'Pin 2: +5V 'Pin 3: Kontrast (0-5V) 'Pin 4: RS -> AVR 'Pin 5: R/W -> GND (read/write mode, nur writen) 'Pin 6: E -> AVR 'Pin 7-10: -> GND 'Pin 11-14: -> AVR -> 11=DB4 / 12=DB5 / 13=DB6 / 14=DB7







Zitieren

Lesezeichen